cigui/CMakeLists.txt
2025-04-13 17:54:14 +02:00

228 lines
6.3 KiB
CMake

cmake_minimum_required(VERSION 3.14)
project(cigui
VERSION 0.0.1
LANGUAGES CXX C)
# Options
option(CIGUI_BUILD_SHARED "Build CIGUI as a shared library" OFF)
option(CIGUI_BUILD_EXAMPLES "Build example applications" ON)
option(CIGUI_BUILD_TESTS "Build tests" OFF)
option(CIGUI_ENABLE_ASAN "Enable Address Sanitizer (Debug)" ON)
option(CIGUI_ENABLE_UBSAN "Enable Undefined Behavior Sanitizer (Debug)" ON)
option(CIGUI_ENABLE_WARNINGS "Enable additional compiler warnings" OFF)
option(CIGUI_RENDERER_VULKAN "Use Vulkan renderer (if available)" ON)
option(CIGUI_RENDERER_OPENGL "Use OpenGL renderer (if available)" ON)
option(CIGUI_RENDERER_DIRECT3D11 "Use Direct3D 11 renderer (if available on Windows)" OFF)
option(CIGUI_RENDERER_DIRECT3D12 "Use Direct3D 12 renderer (if available on Windows)" ON)
option(CIGUI_RENDERER_METAL "Use Metal renderer (if available on macOS)" 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()
# Function to find all libraries in a directory
function(link_libraries_in_directory target directory)
# Find all library files based on platform
if(WIN32)
file(GLOB LIBRARIES "${directory}/*.lib")
elseif(APPLE)
file(GLOB LIBRARIES "${directory}/*.dylib" "${directory}/*.a")
else() # Linux and others
file(GLOB LIBRARIES "${directory}/*.so" "${directory}/*.a")
endif()
# Link each found library
foreach(LIB ${LIBRARIES})
target_link_libraries(${target} PRIVATE ${LIB})
message(STATUS "Linking with library: ${LIB}")
endforeach()
endfunction()
set(LIB_LLGL_PATH "W:/Jann/aLibs/LLGLVD" CACHE STRING "The path to the LLGL installation")
set(LLGL_PATH "${LIB_LLGL_PATH}/lib/cmake/LLGL")
set(LLGL_LIB_PATH "${LIB_LLGL_PATH}/lib")
set(LLGL_BIN_PATH "${LIB_LLGL_PATH}/bin")
set(LLGL_INCLUDE_PATH "${LIB_LLGL_PATH}/include")
set(LLGL_CMAKE_PATH "${LIB_LLGL_PATH}/lib/cmake/LLGL")
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "${LLGL_PATH}")
# Add LLGL dependency
find_package(LLGL REQUIRED HINTS ${LLGL_CMAKE_PATH})
set(CMAKE_CXX_STANDARD 20)
# Configure renderer backends based on platform and options
if(WIN32)
if(CIGUI_RENDERER_DIRECT3D11)
add_definitions(-DCIGUI_RENDERER_D3D11)
endif()
if(CIGUI_RENDERER_DIRECT3D12)
add_definitions(-DCIGUI_RENDERER_D3D12)
endif()
endif()
if(CIGUI_RENDERER_OPENGL)
add_definitions(-DCIGUI_RENDERER_OPENGL)
endif()
if(CIGUI_RENDERER_VULKAN)
add_definitions(-DCIGUI_RENDERER_VULKAN)
endif()
if(APPLE AND CIGUI_RENDERER_METAL)
add_definitions(-DCIGUI_RENDERER_METAL)
endif()
# 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()
link_libraries_in_directory(cigui ${LLGL_LIB_PATH})
target_include_directories(cigui PUBLIC ${LLGL_INCLUDE_PATH})
# Enable precompiled headers for faster builds
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.16)
target_precompile_headers(cigui PRIVATE
<string>
<memory>
<functional>
)
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
)
# 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()