cmake_minimum_required(VERSION 3.15) project(LumberJack LANGUAGES CXX) # System and compiler configurations set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) include(FetchContent) # ========================================== # 1. CORE LIBRARY TARGET # ========================================== add_library(LumberJack_core log_parsing/log_parsing.cpp ip_to_geo/ip_to_geo.cpp config_reader/config.cpp third_party/src/GeoLite2PP.cpp third_party/src/GeoLite2PP_error_category.cpp ) # Include paths for your modules and MaxMind headers target_include_directories(LumberJack_core PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/log_parsing ${CMAKE_CURRENT_SOURCE_DIR}/ip_to_geo ${CMAKE_CURRENT_SOURCE_DIR}/third_party/include ) # CROSS-PLATFORM FIXED: Automatically links appropriate binary dependencies based on OS if(WIN32) if(MSVC) # Windows via Visual Studio Compiler target_link_libraries(LumberJack_core PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/third_party/lib/maxminddb.lib ) else() # Windows via MinGW/GCC Cross-Toolchain (FIXED: Points to your new library file) target_link_libraries(LumberJack_core PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/third_party/lib/mingw_libmaxminddb.a ) endif() # Windows requires Windows Sockets API linked for libmaxminddb network resolutions target_link_libraries(LumberJack_core PRIVATE ws2_32) elseif(APPLE) # macOS Specific Path Integrations (Handles Intel /opt/local and Apple Silicon /opt/homebrew) find_library(MAXMIND_LIB maxminddb HINTS /opt/homebrew/lib /usr/local/lib /opt/local/lib) if(MAXMIND_LIB) target_link_libraries(LumberJack_core PRIVATE ${MAXMIND_LIB}) else() # Fallback to local static file repository boundary if brew package is missing target_link_libraries(LumberJack_core PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/third_party/lib/libmaxminddb.a ) endif() else() # Standard Linux (Ubuntu, Arch Linux, Fedora, etc.) # OPTIMIZATION: Try finding system-installed libmaxminddb first, fallback to local file if missing find_library(MAXMIND_LINUX maxminddb) if(MAXMIND_LINUX) target_link_libraries(LumberJack_core PRIVATE ${MAXMIND_LINUX}) else() target_link_libraries(LumberJack_core PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/third_party/lib/libmaxminddb.a) endif() endif() # Version definitions needed by your GeoLite2PP wrapper target_compile_definitions(LumberJack_core PRIVATE GEOLITE2PP_VERSION="0.0.1" ) # ========================================== # 2. FTXUI Library Download # ========================================== FetchContent_Declare( ftxui GIT_REPOSITORY https://github.com/ArthurSonzogni/FTXUI.git GIT_TAG v6.1.9 ) FetchContent_MakeAvailable(ftxui) # ========================================== # 3. APPLICATION EXECUTABLE # ========================================== add_executable(LumberJack main.cpp) # Second: Link your internal libraries and FTXUI target_link_libraries(LumberJack PRIVATE LumberJack_core ftxui::screen ftxui::dom ftxui::component ) # Third: Apply your static linking flags (Target now exists safely!) if(CMAKE_BUILD_TYPE STREQUAL "Release") if(WIN32) if(MSVC) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded") else() target_link_options(LumberJack PRIVATE -static) endif() elseif(APPLE) set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN YES) else() target_link_options(LumberJack PRIVATE -static-libgcc -static-libstdc++) endif() endif() # Fourth: Set directory runtime properties set_target_properties(LumberJack PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}" RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}" ) # ========================================== # 4. TEST SUITE # ========================================== enable_testing()