Files
Renderive/main.cmake
T
2026-07-29 18:08:57 +08:00

146 lines
8.6 KiB
CMake

w_use3rd(Qt5)
option(YSGRAPHIC_CORE_BUILD_TESTS "Build Renderive_Core test targets" ON)
option(YSGRAPHIC_CORE_ENABLE_ASAN "Build Renderive_Core targets with AddressSanitizer" OFF)
option(YSGRAPHIC_CORE_ENABLE_TSAN "Build Renderive_Core targets with ThreadSanitizer" OFF)
option(RENDERIVE_MEMORY_DOMAIN_STATS "Enable Renderive memory domain statistics" ON)
option(RENDERIVE_MEMORY_GLOBAL_POOL "Enable Renderive small object synchronized pool" ON)
option(RENDERIVE_FRAME_ARENA_GROW "Enable Renderive frame arena high-water growth" ON)
if (YSGRAPHIC_CORE_ENABLE_ASAN AND YSGRAPHIC_CORE_ENABLE_TSAN)
message(FATAL_ERROR "Renderive_Core cannot enable ASan and TSan in the same build")
endif ()
if (YSGRAPHIC_CORE_ENABLE_ASAN AND MSVC)
string(REPLACE "/RTC1" "" __PSC_CMAKE_CXX_FLAGS_DEBUG "${__PSC_CMAKE_CXX_FLAGS_DEBUG}")
string(REPLACE "/RTC1" "" __PSC_CMAKE_C_FLAGS_DEBUG "${__PSC_CMAKE_C_FLAGS_DEBUG}")
set(__PSC_CMAKE_CXX_FLAGS_DEBUG "${__PSC_CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING "" FORCE)
set(__PSC_CMAKE_C_FLAGS_DEBUG "${__PSC_CMAKE_C_FLAGS_DEBUG}" CACHE STRING "" FORCE)
add_library(Renderive_Core_ASAN_Options INTERFACE)
target_compile_options(Renderive_Core_ASAN_Options INTERFACE /fsanitize=address)
target_link_options(Renderive_Core_ASAN_Options INTERFACE /fsanitize=address /INCREMENTAL:NO)
endif ()
function(ysgraphic_core_apply_sanitizer target)
get_target_property(target_type ${target} TYPE)
if (YSGRAPHIC_CORE_ENABLE_ASAN)
if (MSVC)
target_link_libraries(${target} PRIVATE Renderive_Core_ASAN_Options)
if (target_type STREQUAL "STATIC_LIBRARY")
target_link_libraries(${target} INTERFACE Renderive_Core_ASAN_Options)
endif ()
else ()
target_compile_options(${target} PRIVATE -fsanitize=address -fno-omit-frame-pointer)
if (target_type STREQUAL "STATIC_LIBRARY")
target_link_options(${target} INTERFACE -fsanitize=address)
else ()
target_link_options(${target} PRIVATE -fsanitize=address)
endif ()
endif ()
endif ()
if (YSGRAPHIC_CORE_ENABLE_TSAN)
if (MSVC)
message(FATAL_ERROR "Renderive_Core TSan is not supported by MSVC")
else ()
target_compile_options(${target} PRIVATE -fsanitize=thread -fno-omit-frame-pointer)
if (target_type STREQUAL "STATIC_LIBRARY")
target_link_options(${target} INTERFACE -fsanitize=thread)
else ()
target_link_options(${target} PRIVATE -fsanitize=thread)
endif ()
endif ()
endif ()
endfunction()
set(other_library Qt5::Widgets Qt5::Core Qt5::Svg Qt5::Xml Qt5::PrintSupport Qt5::Multimedia Qt5::QuickWidgets)
find_package(OpenGL)
if (OpenGL_FOUND)
list(APPEND other_library OpenGL::GL)
endif ()
set(dir "${CMAKE_CURRENT_LIST_DIR}/Renderive")
file(GLOB_RECURSE srcs "${dir}/*.c" "${dir}/*.cpp" "${dir}/*.h" "${dir}/*.qrc")
list(FILTER srcs EXCLUDE REGEX "main\\.cpp$")
add_library(Renderive STATIC "${srcs}")
target_include_directories(Renderive PUBLIC "${CMAKE_CURRENT_LIST_DIR}")
set(Core Core_Static)
target_link_libraries(Renderive PUBLIC ${other_library})
if (RENDERIVE_MEMORY_DOMAIN_STATS)
target_compile_definitions(Renderive PUBLIC RENDERIVE_MEMORY_DOMAIN_STATS=1)
else ()
target_compile_definitions(Renderive PUBLIC RENDERIVE_MEMORY_DOMAIN_STATS=0)
endif ()
if (RENDERIVE_MEMORY_GLOBAL_POOL)
target_compile_definitions(Renderive PUBLIC RENDERIVE_MEMORY_GLOBAL_POOL=1)
else ()
target_compile_definitions(Renderive PUBLIC RENDERIVE_MEMORY_GLOBAL_POOL=0)
endif ()
if (RENDERIVE_FRAME_ARENA_GROW)
target_compile_definitions(Renderive PUBLIC RENDERIVE_FRAME_ARENA_GROW=1)
else ()
target_compile_definitions(Renderive PUBLIC RENDERIVE_FRAME_ARENA_GROW=0)
endif ()
set_property(TARGET Renderive PROPERTY AUTOMOC ON)
set_property(TARGET Renderive PROPERTY AUTOUIC ON)
set_property(TARGET Renderive PROPERTY AUTORCC ON)
target_link_libraries(Renderive PUBLIC ${Core})
ysgraphic_core_apply_sanitizer(Renderive)
if (YSGRAPHIC_CORE_BUILD_TESTS)
enable_testing()
add_executable(Renderive_Core_Renderable_Lifecycle_Stress EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/tests/Renderable_Lifecycle_Stress.cpp")
target_link_libraries(Renderive_Core_Renderable_Lifecycle_Stress PRIVATE Renderive)
ysgraphic_core_apply_sanitizer(Renderive_Core_Renderable_Lifecycle_Stress)
add_test(NAME Renderive_Core.Renderable_Lifecycle_Stress COMMAND Renderive_Core_Renderable_Lifecycle_Stress)
add_executable(Renderive_Core_Memory_Default EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/tests/Memory_Default.cpp")
target_link_libraries(Renderive_Core_Memory_Default PRIVATE Renderive)
ysgraphic_core_apply_sanitizer(Renderive_Core_Memory_Default)
add_test(NAME Renderive_Core.Memory_Default COMMAND Renderive_Core_Memory_Default)
add_executable(Renderive_Core_Memory_Callbacks EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/tests/Memory_Callbacks.cpp")
target_link_libraries(Renderive_Core_Memory_Callbacks PRIVATE Renderive)
ysgraphic_core_apply_sanitizer(Renderive_Core_Memory_Callbacks)
add_test(NAME Renderive_Core.Memory_Callbacks COMMAND Renderive_Core_Memory_Callbacks)
add_executable(Renderive_Core_Memory_Late_Config EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/tests/Memory_Late_Config.cpp")
target_link_libraries(Renderive_Core_Memory_Late_Config PRIVATE Renderive)
ysgraphic_core_apply_sanitizer(Renderive_Core_Memory_Late_Config)
add_test(NAME Renderive_Core.Memory_Late_Config COMMAND Renderive_Core_Memory_Late_Config)
add_executable(Renderive_Core_Memory_Plot_Late_Config EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/tests/Memory_Plot_Late_Config.cpp")
target_link_libraries(Renderive_Core_Memory_Plot_Late_Config PRIVATE Renderive)
ysgraphic_core_apply_sanitizer(Renderive_Core_Memory_Plot_Late_Config)
add_test(NAME Renderive_Core.Memory_Plot_Late_Config COMMAND Renderive_Core_Memory_Plot_Late_Config)
add_executable(Renderive_Core_Memory_Failure EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/tests/Memory_Failure.cpp")
target_link_libraries(Renderive_Core_Memory_Failure PRIVATE Renderive)
ysgraphic_core_apply_sanitizer(Renderive_Core_Memory_Failure)
add_test(NAME Renderive_Core.Memory_Failure COMMAND Renderive_Core_Memory_Failure)
add_executable(Renderive_Core_Memory_Data_Path_Stress EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/tests/Memory_Data_Path_Stress.cpp")
target_link_libraries(Renderive_Core_Memory_Data_Path_Stress PRIVATE Renderive)
ysgraphic_core_apply_sanitizer(Renderive_Core_Memory_Data_Path_Stress)
add_test(NAME Renderive_Core.Memory_Data_Path_Stress COMMAND Renderive_Core_Memory_Data_Path_Stress)
add_executable(Renderive_Core_Update_Completion EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/tests/Update_Completion.cpp")
target_link_libraries(Renderive_Core_Update_Completion PRIVATE Renderive)
ysgraphic_core_apply_sanitizer(Renderive_Core_Update_Completion)
add_test(NAME Renderive_Core.Update_Completion COMMAND Renderive_Core_Update_Completion)
add_executable(Renderive_Core_Memory_Pool_Benchmark EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/tests/Memory_Pool_Benchmark.cpp")
target_link_libraries(Renderive_Core_Memory_Pool_Benchmark PRIVATE Renderive)
if (WIN32)
target_link_libraries(Renderive_Core_Memory_Pool_Benchmark PRIVATE Psapi)
endif ()
if (YSGRAPHIC_CORE_ENABLE_ASAN)
add_executable(Renderive_Core_ASAN_Runtime_Smoke EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/tests/ASan_Runtime_Smoke.cpp")
ysgraphic_core_apply_sanitizer(Renderive_Core_ASAN_Runtime_Smoke)
add_test(NAME Renderive_Core.ASAN_Runtime_Smoke COMMAND Renderive_Core_ASAN_Runtime_Smoke)
endif ()
endif ()
set(dir "${CMAKE_CURRENT_LIST_DIR}/Widget")
file(GLOB_RECURSE srcs "${dir}/*.c" "${dir}/*.cpp" "${dir}/*.h" "${dir}/*.hpp" "${dir}/*.qrc")
add_library(Renderive_Widget STATIC "${srcs}")
target_include_directories(Renderive_Widget PUBLIC "${CMAKE_CURRENT_LIST_DIR}")
target_link_libraries(Renderive_Widget PUBLIC ${other_library} Renderive)
set_property(TARGET Renderive_Widget PROPERTY AUTOMOC ON)
set_property(TARGET Renderive_Widget PROPERTY AUTOUIC ON)
set_property(TARGET Renderive_Widget PROPERTY AUTORCC ON)
ysgraphic_core_apply_sanitizer(Renderive_Widget)
#
set(dir "${CMAKE_CURRENT_LIST_DIR}/Demo_Gallery")
file(GLOB_RECURSE srcs "${dir}/*.c" "${dir}/*.cpp" "${dir}/*.h" "${dir}/*.hpp")
add_library(Demo_Gallery_Lib ${srcs})
target_link_libraries(Demo_Gallery_Lib PUBLIC Renderive Renderive_Widget)
add_executable(Demo_Gallery ${CMAKE_CURRENT_LIST_DIR}/demo_gallery_main.cpp)
target_link_libraries(Demo_Gallery PUBLIC Demo_Gallery_Lib)