CMakeLists.txt 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. # Dependencies
  14. include(FetchContent)
  15. # ncurses for TUI (better control key support)
  16. find_package(Curses REQUIRED)
  17. # GTK4 / gtkmm for GUI
  18. find_package(PkgConfig REQUIRED)
  19. pkg_check_modules(GTKMM gtkmm-4.0)
  20. # Lua and sol2
  21. find_package(Lua 5.4 REQUIRED)
  22. # sol2 - use develop branch for latest compatibility fixes
  23. FetchContent_Declare(
  24. sol2
  25. GIT_REPOSITORY https://github.com/ThePhD/sol2.git
  26. GIT_TAG v3.5.0
  27. GIT_SHALLOW TRUE
  28. )
  29. FetchContent_MakeAvailable(sol2)
  30. # spdlog - try system package first (from Nix), fallback to FetchContent
  31. find_package(spdlog)
  32. if(NOT spdlog_FOUND)
  33. message(STATUS "System spdlog not found. Fetching via Git...")
  34. FetchContent_Declare(
  35. spdlog
  36. GIT_REPOSITORY https://github.com/gabime/spdlog.git
  37. GIT_TAG v1.14.1
  38. )
  39. FetchContent_MakeAvailable(spdlog)
  40. else()
  41. message(STATUS "Found system spdlog: ${spdlog_VERSION}")
  42. endif()
  43. # Try to find system GoogleTest first (Nix-shell provided)
  44. find_package(GTest)
  45. if(GTest_FOUND)
  46. message(STATUS "Found system GoogleTest: ${GTest_VERSION}")
  47. else()
  48. message(STATUS "System GoogleTest not found. Fetching via Git...")
  49. FetchContent_Declare(
  50. googletest
  51. GIT_REPOSITORY https://github.com/google/googletest.git
  52. GIT_TAG v1.15.2
  53. )
  54. FetchContent_MakeAvailable(googletest)
  55. endif()
  56. # Core library (UI-independent)
  57. add_library(lumacs_core STATIC
  58. src/buffer.cpp
  59. src/window.cpp
  60. src/editor_core.cpp
  61. src/lua_api.cpp
  62. src/kill_ring.cpp
  63. src/theme.cpp
  64. src/config.cpp
  65. src/keybinding.cpp
  66. src/command_system.cpp
  67. src/modeline.cpp
  68. src/minibuffer_manager.cpp
  69. src/completion_system.cpp
  70. src/buffer_manager.cpp
  71. src/window_manager.cpp
  72. src/kill_ring_manager.cpp
  73. src/register_manager.cpp
  74. src/macro_manager.cpp
  75. src/rectangle_manager.cpp
  76. src/plugin_manager.cpp
  77. src/isearch_manager.cpp
  78. src/mode_activator.cpp
  79. src/logger.cpp
  80. )
  81. target_include_directories(lumacs_core PUBLIC
  82. ${CMAKE_CURRENT_SOURCE_DIR}/include
  83. ${LUA_INCLUDE_DIR}
  84. ${sol2_SOURCE_DIR}/include
  85. )
  86. target_link_libraries(lumacs_core PUBLIC
  87. sol2::sol2
  88. spdlog::spdlog
  89. ${LUA_LIBRARIES}
  90. ${CURSES_LIBRARIES}
  91. )
  92. # Helper variable for compile flags
  93. if(MSVC)
  94. set(LUMACS_WARNINGS /W4 /WX)
  95. else()
  96. set(LUMACS_WARNINGS -Wall -Wextra -Wpedantic -Werror)
  97. endif()
  98. target_compile_options(lumacs_core PRIVATE ${LUMACS_WARNINGS})
  99. # Common sources for all frontends (Main entry point + TUI)
  100. set(LUMACS_COMMON_SOURCES
  101. src/main.cpp
  102. src/tui_editor.cpp
  103. )
  104. # --- Target: lumacs (GTK preferred, TUI fallback) ---
  105. if(GTKMM_FOUND)
  106. message(STATUS "GTKMM 4.0 found - Building 'lumacs' with GTK support")
  107. add_executable(lumacs
  108. ${LUMACS_COMMON_SOURCES}
  109. src/gtk_editor.cpp
  110. src/gtk_renderer.cpp
  111. src/gtk_completion_popup.cpp
  112. )
  113. target_link_libraries(lumacs PRIVATE lumacs_core ${GTKMM_LIBRARIES})
  114. target_include_directories(lumacs PRIVATE ${GTKMM_INCLUDE_DIRS} ${CURSES_INCLUDE_DIR})
  115. target_compile_definitions(lumacs PRIVATE LUMACS_WITH_GTK)
  116. else()
  117. message(WARNING "GTKMM 4.0 not found - 'lumacs' will be TUI only")
  118. add_executable(lumacs ${LUMACS_COMMON_SOURCES})
  119. target_link_libraries(lumacs PRIVATE lumacs_core)
  120. target_include_directories(lumacs PRIVATE ${CURSES_INCLUDE_DIR})
  121. endif()
  122. target_compile_options(lumacs PRIVATE ${LUMACS_WARNINGS})
  123. # --- Target: lumacs-raylib (Raylib + TUI fallback) ---
  124. find_package(raylib QUIET)
  125. if(NOT raylib_FOUND)
  126. pkg_check_modules(raylib raylib)
  127. endif()
  128. if(raylib_FOUND)
  129. message(STATUS "Raylib found - Creating 'lumacs-raylib' target")
  130. add_executable(lumacs-raylib
  131. ${LUMACS_COMMON_SOURCES}
  132. src/raylib_editor.cpp
  133. )
  134. target_link_libraries(lumacs-raylib PRIVATE lumacs_core)
  135. if(TARGET raylib)
  136. target_link_libraries(lumacs-raylib PRIVATE raylib)
  137. else()
  138. target_include_directories(lumacs-raylib PRIVATE ${raylib_INCLUDE_DIRS})
  139. target_link_libraries(lumacs-raylib PRIVATE ${raylib_LIBRARIES})
  140. endif()
  141. target_include_directories(lumacs-raylib PRIVATE ${CURSES_INCLUDE_DIR})
  142. target_compile_definitions(lumacs-raylib PRIVATE LUMACS_WITH_RAYLIB)
  143. target_compile_options(lumacs-raylib PRIVATE ${LUMACS_WARNINGS})
  144. else()
  145. message(STATUS "Raylib not found - Skipping 'lumacs-raylib'")
  146. endif()
  147. # Enable testing
  148. enable_testing()
  149. add_subdirectory(tests)