From 6d912917688eab1ac1d429064ff012308c26ce52 Mon Sep 17 00:00:00 2001 From: Jayden Grubb Date: Wed, 5 Nov 2025 23:35:36 +1000 Subject: [PATCH] Various CMakeLists improvements --- CMakeLists.txt | 67 ++++++++++++++++++++++--------- editor/CMakeLists.txt | 2 +- engine/CMakeLists.txt | 60 ++++++++++++++++++++++++--- engine/cmake/nova-config.cmake.in | 5 +++ 4 files changed, 110 insertions(+), 24 deletions(-) create mode 100644 engine/cmake/nova-config.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b2326e..ceaf0e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,9 +6,22 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "") project(nova VERSION 0.0.1) enable_language(CXX) + set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_VISIBILITY_PRESET hidden) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build (Debug, Release, RelWithDebInfo, MinSizeRel)" FORCE) +endif() + +option(BUILD_SHARED_LIBS "Build using shared libraries" ON) + +set(NOVA_SANITIZERS "" CACHE STRING "Sanitizers to enable (address, undefined, leak)") +set(NOVA_WERROR OFF CACHE BOOL "Treat compiler warnings as errors") +set(NOVA_LIBRARY_INSTALL OFF CACHE BOOL "Enable library installation targets") add_compile_definitions( NOVA_VERSION_MAJOR=${PROJECT_VERSION_MAJOR} @@ -21,49 +34,67 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") /W4 /permissive- /EHsc + $<$:/WX> ) + + if (NOVA_SANITIZERS) + string(REPLACE "," ";" SANITIZERS ${NOVA_SANITIZERS}) + foreach(sanitizer IN LISTS SANITIZERS) + add_compile_options(/fsanitize=${sanitizer}) + endforeach() + endif() + add_compile_definitions( NOVA_COMPILER_MSVC + _CRT_SECURE_NO_WARNINGS + _CRT_NONSTDC_NO_WARNINGS ) -elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") +elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") add_compile_options( -Wall -Wextra -Wpedantic -Wshadow -Wold-style-cast + $<$:-Werror> ) + + if (NOVA_SANITIZERS) + add_compile_options(-fsanitize=${NOVA_SANITIZERS}) + add_link_options(-fsanitize=${NOVA_SANITIZERS}) + endif() + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - add_compile_definitions( - NOVA_COMPILER_GCC - ) - else() + add_compile_definitions(NOVA_COMPILER_GCC) + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + add_compile_definitions(NOVA_COMPILER_CLANG) + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") add_compile_definitions( NOVA_COMPILER_CLANG + NOVA_COMPILER_APPLE_CLANG ) endif() else() - error("Unsupported compiler") + message(FATAL_ERROR "Unsupported compiler") endif() -if (WIN32) +if (CMAKE_SYSTEM_NAME STREQUAL "Windows") add_compile_definitions( NOVA_PLATFORM_WINDOWS NOMINMAX WIN32_LEAN_AND_MEAN - _CRT_SECURE_NO_WARNINGS - _CRT_NONSTDC_NO_WARNINGS - ) -elseif (APPLE) - add_compile_definitions( - NOVA_PLATFORM_MACOS - ) -elseif (UNIX) - add_compile_definitions( - NOVA_PLATFORM_LINUX ) +elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin") + add_compile_definitions(NOVA_PLATFORM_MACOS) +elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux") + add_compile_definitions(NOVA_PLATFORM_LINUX) else() - error("Unsupported platform") + message(FATAL_ERROR "Unsupported platform") +endif() + +if (NOVA_LIBRARY_INSTALL) + include(CMakePackageConfigHelpers) + include(GNUInstallDirs) endif() add_subdirectory(engine) diff --git a/editor/CMakeLists.txt b/editor/CMakeLists.txt index c0ed851..979f522 100644 --- a/editor/CMakeLists.txt +++ b/editor/CMakeLists.txt @@ -15,5 +15,5 @@ target_include_directories(nova-editor ) target_link_libraries(nova-editor - PUBLIC nova + PUBLIC nova::nova ) diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index a94ef86..c9703c6 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -7,13 +7,63 @@ set(NOVA_ENGINE_SRC list(TRANSFORM NOVA_ENGINE_SRC PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/src/) -add_library(nova SHARED ${NOVA_ENGINE_SRC}) +add_library(nova ${NOVA_ENGINE_SRC}) target_include_directories(nova - PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src + PUBLIC + $ + $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src ) -target_compile_definitions(nova - PRIVATE NOVA_EXPORT_SYMBOLS +set_target_properties(nova PROPERTIES + DEFINE_SYMBOL NOVA_EXPORT_SYMBOLS + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} ) + +add_library(nova::nova ALIAS nova) + +if (NOVA_LIBRARY_INSTALL) + configure_package_config_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/nova-config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/nova-config.cmake + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/nova + ) + + write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/nova-config-version.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion + ) + + install( + TARGETS nova + EXPORT nova-targets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + ) + + install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/nova + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING PATTERN "*.hpp" + ) + + install( + EXPORT nova-targets + FILE nova-targets.cmake + NAMESPACE nova:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/nova + ) + + install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/nova-config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/nova-config-version.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/nova + ) +endif() diff --git a/engine/cmake/nova-config.cmake.in b/engine/cmake/nova-config.cmake.in new file mode 100644 index 0000000..792cd61 --- /dev/null +++ b/engine/cmake/nova-config.cmake.in @@ -0,0 +1,5 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/nova-targets.cmake") + +check_required_components(nova)