232 lines
6.3 KiB
CMake
232 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 "/home/n0ffie/deps/LLGLD" 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")
|
|
|
|
if (WIN32)
|
|
set(LLGL_BIN_PATH "${LIB_LLGL_PATH}/bin")
|
|
endif()
|
|
|
|
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()
|