cmake_minimum_required(VERSION 3.14) project(cigui VERSION 0.0.1 LANGUAGES CXX) # Options option(CIGUI_BUILD_SHARED "Build CIGUI as a shared library" ON) option(CIGUI_BUILD_EXAMPLES "Build example applications" ON) option(CIGUI_BUILD_TESTS "Build tests" OFF) option(CIGUI_ENABLE_ASAN "Enable Address Sanitizer (Debug)" OFF) option(CIGUI_ENABLE_UBSAN "Enable Undefined Behavior Sanitizer (Debug)" OFF) option(CIGUI_ENABLE_WARNINGS "Enable additional compiler warnings" ON) # Set C++ standard set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # Set debug postfix set(CMAKE_DEBUG_POSTFIX "-d") # Configure debug symbols and warnings if(CMAKE_BUILD_TYPE STREQUAL "Debug") if(MSVC) add_compile_options(/Zi) # Debug symbols for MSVC if(CIGUI_ENABLE_WARNINGS) add_compile_options(/W4) # Higher warning level endif() else() add_compile_options(-g) # Debug symbols for GCC/Clang if(CIGUI_ENABLE_WARNINGS) add_compile_options( -Wall -Wextra -Wpedantic -Wshadow -Wconversion ) endif() # Enable sanitizers in debug builds if requested if(CIGUI_ENABLE_ASAN) add_compile_options(-fsanitize=address -fno-omit-frame-pointer) add_link_options(-fsanitize=address) endif() if(CIGUI_ENABLE_UBSAN) add_compile_options(-fsanitize=undefined) add_link_options(-fsanitize=undefined) endif() endif() endif() # Define export macros if(CIGUI_BUILD_SHARED) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) if(WIN32) add_definitions(-DCIGUI_DLL) endif() endif() # Include CPM.cmake for dependency management include(cmake/CPM.cmake) # Add SFML dependency using CPM CPMAddPackage( NAME SFML GITHUB_REPOSITORY SFML/SFML GIT_TAG 3.0.0 # Adjust to actual SFML 3 version/tag OPTIONS "SFML_BUILD_AUDIO OFF" "SFML_BUILD_NETWORK OFF" "CMAKE_DEBUG_POSTFIX -d" # Add debug postfix for debug builds ) # Generate export macros include(GenerateExportHeader) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/include/cigui/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/include/cigui/config.h ) # Define library target if(CIGUI_BUILD_SHARED) add_library(cigui SHARED) else() add_library(cigui STATIC) endif() # Enable precompiled headers for faster builds if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.16) target_precompile_headers(cigui PRIVATE ) endif() # Add source files include(cmake/utils.cmake) find_files(CIGUI_SOURCES "src" cpp c cxx) find_files(CIGUI_HEADERS "src" hpp h inl hxx) target_sources(cigui PRIVATE ${CIGUI_SOURCES}) # Configure include directories target_include_directories(cigui PUBLIC $ $ $ PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) # Link with SFML target_link_libraries(cigui PUBLIC sfml-graphics sfml-window sfml-system) # Define installation include(GNUInstallDirs) include(CMakePackageConfigHelpers) # Install headers install( DIRECTORY include/cigui/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cigui FILES_MATCHING PATTERN "*.hpp" PATTERN "*.h" ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/include/cigui/config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cigui ) # Install libraries install( TARGETS cigui EXPORT cigui-targets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) # Create and install config files configure_package_config_file( cmake/CIGUIConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CIGUIConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/cigui ) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/CIGUIConfigVersion.cmake VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/CIGUIConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/CIGUIConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/cigui ) install( EXPORT cigui-targets FILE CIGUITargets.cmake NAMESPACE cig:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/cigui ) # Add examples directory if(CIGUI_BUILD_EXAMPLES) add_subdirectory(examples) endif() # Add tests directory if(CIGUI_BUILD_TESTS) include(CTest) add_subdirectory(tests) endif()