180 lines
4.7 KiB
CMake
180 lines
4.7 KiB
CMake
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
|
|
<string>
|
|
<memory>
|
|
<functional>
|
|
<SFML/Graphics.hpp>
|
|
<SFML/Window.hpp>
|
|
<SFML/System.hpp>
|
|
)
|
|
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
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
|
|
$<INSTALL_INTERFACE:include>
|
|
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()
|