CMakeLists.txt 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. cmake_minimum_required(VERSION 3.20)
  2. project(lumacs VERSION 0.1.0 LANGUAGES CXX)
  3. # C++20 standard
  4. set(CMAKE_CXX_STANDARD 20)
  5. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  6. set(CMAKE_CXX_EXTENSIONS OFF)
  7. # Export compile commands for clangd/LSP
  8. set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
  9. # Build type
  10. if(NOT CMAKE_BUILD_TYPE)
  11. set(CMAKE_BUILD_TYPE Release)
  12. endif()
  13. # Compiler warnings
  14. if(MSVC)
  15. add_compile_options(/W4 /WX)
  16. else()
  17. add_compile_options(-Wall -Wextra -Wpedantic -Werror)
  18. endif()
  19. # Dependencies
  20. include(FetchContent)
  21. # ncurses for TUI (better control key support)
  22. find_package(Curses REQUIRED)
  23. # GTK4 / gtkmm for GUI
  24. find_package(PkgConfig REQUIRED)
  25. pkg_check_modules(GTKMM gtkmm-4.0)
  26. # Lua and sol2
  27. find_package(Lua 5.4 REQUIRED)
  28. # sol2 - use develop branch for latest compatibility fixes
  29. FetchContent_Declare(
  30. sol2
  31. GIT_REPOSITORY https://github.com/ThePhD/sol2.git
  32. GIT_TAG v3.5.0
  33. GIT_SHALLOW TRUE
  34. )
  35. FetchContent_MakeAvailable(sol2)
  36. # spdlog
  37. FetchContent_Declare(
  38. spdlog
  39. GIT_REPOSITORY https://github.com/gabime/spdlog.git
  40. GIT_TAG v1.12.0
  41. )
  42. FetchContent_MakeAvailable(spdlog)
  43. # Google Test
  44. FetchContent_Declare(
  45. googletest
  46. GIT_REPOSITORY https://github.com/google/googletest.git
  47. GIT_TAG release-1.11.0 # Or a more recent stable release
  48. )
  49. # FetchContent_MakeAvailable(googletest) # This is not enough for subdirectories
  50. FetchContent_GetProperties(googletest) # Get properties to use SOURCE_DIR and BINARY_DIR
  51. if(NOT googletest_POPULATED)
  52. FetchContent_Populate(googletest)
  53. endif()
  54. add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR}) # Expose targets to subdirectories
  55. # Core library (UI-independent)
  56. add_library(lumacs_core STATIC
  57. src/buffer.cpp
  58. src/window.cpp
  59. src/editor_core.cpp
  60. src/lua_api.cpp
  61. src/kill_ring.cpp
  62. src/theme.cpp
  63. src/config.cpp
  64. src/keybinding.cpp
  65. src/command_system.cpp
  66. src/modeline.cpp
  67. src/minibuffer_manager.cpp
  68. src/completion_system.cpp
  69. src/buffer_manager.cpp
  70. src/window_manager.cpp
  71. src/kill_ring_manager.cpp
  72. src/register_manager.cpp
  73. src/macro_manager.cpp
  74. src/rectangle_manager.cpp
  75. src/plugin_manager.cpp
  76. src/logger.cpp
  77. )
  78. target_include_directories(lumacs_core PUBLIC
  79. ${CMAKE_CURRENT_SOURCE_DIR}/include
  80. ${LUA_INCLUDE_DIR}
  81. ${sol2_SOURCE_DIR}/include # Explicitly add sol2 include directory
  82. )
  83. target_link_libraries(lumacs_core PUBLIC
  84. sol2::sol2
  85. spdlog::spdlog
  86. ${LUA_LIBRARIES}
  87. ${CURSES_LIBRARIES}
  88. )
  89. # Main Executable (Single binary)
  90. add_executable(lumacs
  91. src/main.cpp
  92. src/tui_editor.cpp
  93. src/gtk_editor.cpp
  94. src/gtk_renderer.cpp
  95. src/gtk_completion_popup.cpp
  96. src/command_system.cpp
  97. )
  98. target_link_libraries(lumacs PRIVATE
  99. lumacs_core
  100. ${CURSES_LIBRARIES}
  101. )
  102. target_include_directories(lumacs PRIVATE
  103. ${CURSES_INCLUDE_DIR}
  104. )
  105. # Configure GTK if available
  106. if(GTKMM_FOUND)
  107. message(STATUS "GTKMM 4.0 found - Building with GUI support")
  108. target_compile_definitions(lumacs PRIVATE LUMACS_WITH_GTK)
  109. target_include_directories(lumacs PRIVATE ${GTKMM_INCLUDE_DIRS})
  110. target_link_libraries(lumacs PRIVATE ${GTKMM_LIBRARIES})
  111. else()
  112. message(WARNING "GTKMM 4.0 not found - Building TUI only")
  113. endif()
  114. # Enable testing
  115. enable_testing()
  116. add_subdirectory(tests)