cigui/CMakeLists.txt
noffie 8e0e9ceb7c Major Restructuring
N0ffie switched to mingw (fixing linux warnings)
2025-04-12 18:09:16 +02:00

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()