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