Various CMakeLists improvements

This commit is contained in:
2025-11-05 23:35:36 +10:00
parent 02251260e0
commit 6699128476
4 changed files with 110 additions and 24 deletions

View File

@@ -6,9 +6,22 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "")
project(nova VERSION 0.0.1) project(nova VERSION 0.0.1)
enable_language(CXX) enable_language(CXX)
set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_VISIBILITY_PRESET hidden) 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( add_compile_definitions(
NOVA_VERSION_MAJOR=${PROJECT_VERSION_MAJOR} NOVA_VERSION_MAJOR=${PROJECT_VERSION_MAJOR}
@@ -21,49 +34,67 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
/W4 /W4
/permissive- /permissive-
/EHsc /EHsc
$<$<BOOL:${NOVA_WERROR}>:/WX>
) )
if (NOVA_SANITIZERS)
string(REPLACE "," ";" SANITIZERS ${NOVA_SANITIZERS})
foreach(sanitizer IN LISTS SANITIZERS)
add_compile_options(/fsanitize=${sanitizer})
endforeach()
endif()
add_compile_definitions( add_compile_definitions(
NOVA_COMPILER_MSVC 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( add_compile_options(
-Wall -Wall
-Wextra -Wextra
-Wpedantic -Wpedantic
-Wshadow -Wshadow
-Wold-style-cast -Wold-style-cast
$<$<BOOL:${NOVA_WERROR}>:-Werror>
) )
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
add_compile_definitions( if (NOVA_SANITIZERS)
NOVA_COMPILER_GCC add_compile_options(-fsanitize=${NOVA_SANITIZERS})
) add_link_options(-fsanitize=${NOVA_SANITIZERS})
else()
add_compile_definitions(
NOVA_COMPILER_CLANG
)
endif()
else()
error("Unsupported compiler")
endif() endif()
if (WIN32) if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
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()
message(FATAL_ERROR "Unsupported compiler")
endif()
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
add_compile_definitions( add_compile_definitions(
NOVA_PLATFORM_WINDOWS NOVA_PLATFORM_WINDOWS
NOMINMAX NOMINMAX
WIN32_LEAN_AND_MEAN 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() else()
error("Unsupported platform") message(FATAL_ERROR "Unsupported platform")
endif()
if (NOVA_LIBRARY_INSTALL)
include(CMakePackageConfigHelpers)
include(GNUInstallDirs)
endif() endif()
add_subdirectory(engine) add_subdirectory(engine)

View File

@@ -15,5 +15,5 @@ target_include_directories(nova-editor
) )
target_link_libraries(nova-editor target_link_libraries(nova-editor
PUBLIC nova PUBLIC nova::nova
) )

View File

@@ -7,13 +7,63 @@ set(NOVA_ENGINE_SRC
list(TRANSFORM NOVA_ENGINE_SRC PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/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 target_include_directories(nova
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include PUBLIC
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
) )
target_compile_definitions(nova set_target_properties(nova PROPERTIES
PRIVATE NOVA_EXPORT_SYMBOLS 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()

View File

@@ -0,0 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/nova-targets.cmake")
check_required_components(nova)