| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- cmake_minimum_required(VERSION 3.20)
- project(lumacs VERSION 0.1.0 LANGUAGES CXX)
- # C++20 standard
- set(CMAKE_CXX_STANDARD 20)
- set(CMAKE_CXX_STANDARD_REQUIRED ON)
- set(CMAKE_CXX_EXTENSIONS OFF)
- # Export compile commands for clangd/LSP
- set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
- # Build type
- if(NOT CMAKE_BUILD_TYPE)
- set(CMAKE_BUILD_TYPE Release)
- endif()
- # Dependencies
- include(FetchContent)
- # ncurses for TUI (better control key support)
- find_package(Curses REQUIRED)
- # GTK4 / gtkmm for GUI
- find_package(PkgConfig REQUIRED)
- pkg_check_modules(GTKMM gtkmm-4.0)
- # Lua and sol2
- find_package(Lua 5.4 REQUIRED)
- # sol2 - use develop branch for latest compatibility fixes
- FetchContent_Declare(
- sol2
- GIT_REPOSITORY https://github.com/ThePhD/sol2.git
- GIT_TAG v3.5.0
- GIT_SHALLOW TRUE
- )
- FetchContent_MakeAvailable(sol2)
- # spdlog - try system package first (from Nix), fallback to FetchContent
- find_package(spdlog)
- if(NOT spdlog_FOUND)
- message(STATUS "System spdlog not found. Fetching via Git...")
- FetchContent_Declare(
- spdlog
- GIT_REPOSITORY https://github.com/gabime/spdlog.git
- GIT_TAG v1.14.1
- )
- FetchContent_MakeAvailable(spdlog)
- else()
- message(STATUS "Found system spdlog: ${spdlog_VERSION}")
- endif()
- # Try to find system GoogleTest first (Nix-shell provided)
- find_package(GTest)
- if(GTest_FOUND)
- message(STATUS "Found system GoogleTest: ${GTest_VERSION}")
- else()
- message(STATUS "System GoogleTest not found. Fetching via Git...")
- FetchContent_Declare(
- googletest
- GIT_REPOSITORY https://github.com/google/googletest.git
- GIT_TAG v1.15.2
- )
- FetchContent_MakeAvailable(googletest)
- endif()
- # Core library (UI-independent)
- add_library(lumacs_core STATIC
- src/buffer.cpp
- src/window.cpp
- src/editor_core.cpp
- src/lua_api.cpp
- src/kill_ring.cpp
- src/theme.cpp
- src/config.cpp
- src/keybinding.cpp
- src/command_system.cpp
- src/modeline.cpp
- src/minibuffer_manager.cpp
- src/completion_system.cpp
- src/buffer_manager.cpp
- src/window_manager.cpp
- src/kill_ring_manager.cpp
- src/register_manager.cpp
- src/macro_manager.cpp
- src/rectangle_manager.cpp
- src/plugin_manager.cpp
- src/isearch_manager.cpp
- src/mode_activator.cpp
- src/logger.cpp
- )
- target_include_directories(lumacs_core PUBLIC
- ${CMAKE_CURRENT_SOURCE_DIR}/include
- ${LUA_INCLUDE_DIR}
- ${sol2_SOURCE_DIR}/include
- )
- target_link_libraries(lumacs_core PUBLIC
- sol2::sol2
- spdlog::spdlog
- ${LUA_LIBRARIES}
- ${CURSES_LIBRARIES}
- )
- # Helper variable for compile flags
- if(MSVC)
- set(LUMACS_WARNINGS /W4 /WX)
- else()
- set(LUMACS_WARNINGS -Wall -Wextra -Wpedantic -Werror)
- endif()
- target_compile_options(lumacs_core PRIVATE ${LUMACS_WARNINGS})
- # Common sources for all frontends (Main entry point + TUI)
- set(LUMACS_COMMON_SOURCES
- src/main.cpp
- src/tui_editor.cpp
- )
- # --- Target: lumacs (GTK preferred, TUI fallback) ---
- if(GTKMM_FOUND)
- message(STATUS "GTKMM 4.0 found - Building 'lumacs' with GTK support")
- add_executable(lumacs
- ${LUMACS_COMMON_SOURCES}
- src/gtk_editor.cpp
- src/gtk_renderer.cpp
- src/gtk_completion_popup.cpp
- )
- target_link_libraries(lumacs PRIVATE lumacs_core ${GTKMM_LIBRARIES})
- target_include_directories(lumacs PRIVATE ${GTKMM_INCLUDE_DIRS} ${CURSES_INCLUDE_DIR})
- target_compile_definitions(lumacs PRIVATE LUMACS_WITH_GTK)
- else()
- message(WARNING "GTKMM 4.0 not found - 'lumacs' will be TUI only")
- add_executable(lumacs ${LUMACS_COMMON_SOURCES})
- target_link_libraries(lumacs PRIVATE lumacs_core)
- target_include_directories(lumacs PRIVATE ${CURSES_INCLUDE_DIR})
- endif()
- target_compile_options(lumacs PRIVATE ${LUMACS_WARNINGS})
- # --- Target: lumacs-raylib (Raylib + TUI fallback) ---
- find_package(raylib QUIET)
- if(NOT raylib_FOUND)
- pkg_check_modules(raylib raylib)
- endif()
- if(raylib_FOUND)
- message(STATUS "Raylib found - Creating 'lumacs-raylib' target")
- add_executable(lumacs-raylib
- ${LUMACS_COMMON_SOURCES}
- src/raylib_editor.cpp
- )
- target_link_libraries(lumacs-raylib PRIVATE lumacs_core)
-
- if(TARGET raylib)
- target_link_libraries(lumacs-raylib PRIVATE raylib)
- else()
- target_include_directories(lumacs-raylib PRIVATE ${raylib_INCLUDE_DIRS})
- target_link_libraries(lumacs-raylib PRIVATE ${raylib_LIBRARIES})
- endif()
- target_include_directories(lumacs-raylib PRIVATE ${CURSES_INCLUDE_DIR})
- target_compile_definitions(lumacs-raylib PRIVATE LUMACS_WITH_RAYLIB)
- target_compile_options(lumacs-raylib PRIVATE ${LUMACS_WARNINGS})
- else()
- message(STATUS "Raylib not found - Skipping 'lumacs-raylib'")
- endif()
- # Enable testing
- enable_testing()
- add_subdirectory(tests)
|