diff --git a/main.cmake b/main.cmake index 87c0738..02085f5 100644 --- a/main.cmake +++ b/main.cmake @@ -1,20 +1,16 @@ -w_use3rd(Qt5) -set(renderive_rely global::GTest global::blend2d) -library_is_installed_with_rely(ok ${renderive_rely}) -if (${ok}) - #target_link_libraries(your_target PRIVATE blend2d::blend2d) -else () - message("renderive 依赖未安装! 请运行 renderive_env 目标安装所需第三方依赖") -endif () -rcl_add_dependency_action_targets("renderive_env" ${renderive_rely}) -find_package(GTest REQUIRED) -if (TARGET GTest::gtest) - set(renderive_gtest_library GTest::gtest) -elseif (TARGET GTest::GTest) - set(renderive_gtest_library GTest::GTest) -else () - message(FATAL_ERROR "GTest target not found") +w_use3rd(Qt5) +find_package(blend2d CONFIG REQUIRED) + +set(renderive_dependencies +global::GTest +global::blend2d +) +rcl_add_dependency_action_targets(renderive_env ${renderive_dependencies}) +library_is_installed_with_rely(renderive_dependencies_installed ${renderive_dependencies}) +if (NOT renderive_dependencies_installed) +message(STATUS "Renderive 依赖未安装,请先构建 renderive_env 目标") +return() endif () option(YSGRAPHIC_CORE_BUILD_TESTS "Build Renderive_Core test targets" ON) @@ -23,141 +19,256 @@ option(YSGRAPHIC_CORE_ENABLE_TSAN "Build Renderive_Core targets with ThreadSanit 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") +message(FATAL_ERROR "Renderive cannot enable ASan and TSan simultaneously") endif () + +if (NOT TARGET blend2d::blend2d) +message(FATAL_ERROR "Blend2D target blend2d::blend2d was not found") +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) +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_ASAN_Options INTERFACE) +target_compile_options(Renderive_ASAN_Options INTERFACE /fsanitize=address) +target_link_options(Renderive_ASAN_Options INTERFACE /fsanitize=address /INCREMENTAL:NO) +endif () + +function(renderive_apply_sanitizer target) +get_target_property(target_type ${target} TYPE) +if (YSGRAPHIC_CORE_ENABLE_ASAN) +if (MSVC) +target_link_libraries(${target} PRIVATE Renderive_ASAN_Options) +if (target_type STREQUAL "STATIC_LIBRARY") +target_link_libraries(${target} INTERFACE Renderive_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 TSan is not supported by MSVC") +endif () +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 () -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 CONFIGURE_DEPENDS "${dir}/*.c" "${dir}/*.cpp" "${dir}/*.h" "${dir}/*.qrc") -list(FILTER srcs EXCLUDE REGEX "main\\.cpp$") -list(FILTER srcs EXCLUDE REGEX "Performance_Shower(_p)?\\.(cpp|h)$") -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) - -set(renderive_diagnostics_srcs - "${dir}/plottable/Performance_Shower.cpp" - "${dir}/plottable/Performance_Shower_p.h" +function(renderive_enable_qt_target target) +set_target_properties(${target} PROPERTIES +AUTOMOC ON +AUTOUIC ON +AUTORCC ON ) -add_library(Renderive_Diagnostics STATIC "${renderive_diagnostics_srcs}") +endfunction() + +set(renderive_public_libraries +Qt5::Widgets +Qt5::Core +Qt5::Svg +Qt5::Xml +Qt5::PrintSupport +Qt5::Multimedia +Qt5::QuickWidgets +Core_Static +blend2d::blend2d +) + +find_package(OpenGL QUIET) +if (OpenGL_FOUND) +list(APPEND renderive_public_libraries OpenGL::GL) +endif () + +set(renderive_root "${CMAKE_CURRENT_LIST_DIR}/Renderive") +file(GLOB_RECURSE renderive_sources CONFIGURE_DEPENDS +"${renderive_root}/*.c" +"${renderive_root}/*.cpp" +"${renderive_root}/*.h" +"${renderive_root}/*.qrc" +) +list(FILTER renderive_sources EXCLUDE REGEX "main\\.cpp$") +list(FILTER renderive_sources EXCLUDE REGEX "Performance_Shower(_p)?\\.(cpp|h)$") + +add_library(Renderive STATIC ${renderive_sources}) +target_include_directories(Renderive PUBLIC "${CMAKE_CURRENT_LIST_DIR}") +target_link_libraries(Renderive PUBLIC ${renderive_public_libraries}) +target_compile_definitions(Renderive PUBLIC +RENDERIVE_MEMORY_DOMAIN_STATS=$ +RENDERIVE_MEMORY_GLOBAL_POOL=$ +RENDERIVE_FRAME_ARENA_GROW=$ +) +renderive_enable_qt_target(Renderive) +renderive_apply_sanitizer(Renderive) + +set(renderive_diagnostics_sources +"${renderive_root}/plottable/Performance_Shower.cpp" +"${renderive_root}/plottable/Performance_Shower_p.h" +) +add_library(Renderive_Diagnostics STATIC ${renderive_diagnostics_sources}) target_include_directories(Renderive_Diagnostics PUBLIC "${CMAKE_CURRENT_LIST_DIR}") target_link_libraries(Renderive_Diagnostics PUBLIC Renderive) -set_property(TARGET Renderive_Diagnostics PROPERTY AUTOMOC ON) -set_property(TARGET Renderive_Diagnostics PROPERTY AUTOUIC ON) -set_property(TARGET Renderive_Diagnostics PROPERTY AUTORCC ON) -ysgraphic_core_apply_sanitizer(Renderive_Diagnostics) +renderive_enable_qt_target(Renderive_Diagnostics) +renderive_apply_sanitizer(Renderive_Diagnostics) + +set(renderive_widget_root "${CMAKE_CURRENT_LIST_DIR}/Widget") +file(GLOB_RECURSE renderive_widget_sources CONFIGURE_DEPENDS +"${renderive_widget_root}/*.c" +"${renderive_widget_root}/*.cpp" +"${renderive_widget_root}/*.h" +"${renderive_widget_root}/*.hpp" +"${renderive_widget_root}/*.qrc" +) +add_library(Renderive_Widget STATIC ${renderive_widget_sources}) +target_include_directories(Renderive_Widget PUBLIC "${CMAKE_CURRENT_LIST_DIR}") +target_link_libraries(Renderive_Widget PUBLIC Renderive) +renderive_enable_qt_target(Renderive_Widget) +renderive_apply_sanitizer(Renderive_Widget) + if (YSGRAPHIC_CORE_BUILD_TESTS) - enable_testing() - function(renderive_add_gtest target test_name source) - add_executable(${target} EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/tests/${source}") - target_link_libraries(${target} PRIVATE Renderive ${renderive_gtest_library} ${ARGN}) - ysgraphic_core_apply_sanitizer(${target}) - add_test(NAME Renderive.${test_name} COMMAND ${target}) - endfunction() - renderive_add_gtest(Renderive_ASan_Runtime_Smoke ASan_Runtime_Smoke ASan_Runtime_Smoke.cpp) - renderive_add_gtest(Renderive_Update_Completion Update_Completion Update_Completion.cpp) - renderive_add_gtest(Renderive_Memory_Default Memory_Default Memory_Default.cpp) - renderive_add_gtest(Renderive_Memory_Callbacks Memory_Callbacks Memory_Callbacks.cpp) - renderive_add_gtest(Renderive_Memory_Failure Memory_Failure Memory_Failure.cpp) - renderive_add_gtest(Renderive_Memory_Late_Config Memory_Late_Config Memory_Late_Config.cpp) - renderive_add_gtest(Renderive_Memory_Plot_Late_Config Memory_Plot_Late_Config Memory_Plot_Late_Config.cpp) - set_tests_properties(Renderive.Memory_Plot_Late_Config PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=offscreen") - renderive_add_gtest(Renderive_Timeline_Stream_Consistency Timeline_Stream_Consistency Timeline_Stream_Consistency.cpp) - renderive_add_gtest(Renderive_Memory_Data_Path_Stress Memory_Data_Path_Stress Memory_Data_Path_Stress.cpp) - set_tests_properties(Renderive.Memory_Data_Path_Stress PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=offscreen;RENDERIVE_PERFORMANCE_LOG=0" TIMEOUT 20) - renderive_add_gtest(Renderive_Renderable_Lifecycle_Stress Renderable_Lifecycle_Stress Renderable_Lifecycle_Stress.cpp) - set_tests_properties(Renderive.Renderable_Lifecycle_Stress PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=offscreen;RENDERIVE_PERFORMANCE_LOG=0" TIMEOUT 20) - renderive_add_gtest(Renderive_Frame_Scheduler_Feedback Frame_Scheduler_Feedback Frame_Scheduler_Feedback.cpp Renderive_Diagnostics) - set_tests_properties(Renderive.Frame_Scheduler_Feedback PROPERTIES ENVIRONMENT "RENDERIVE_PERFORMANCE_LOG=1;RENDERIVE_PERFORMANCE_LOG_PATH=${CMAKE_BINARY_DIR}/renderive_feedback_test_log.csv") - renderive_add_gtest(Renderive_Performance_Shower_Interaction Performance_Shower_Interaction Performance_Shower_Interaction.cpp Renderive_Diagnostics Renderive_Widget) - set_tests_properties(Renderive.Performance_Shower_Interaction PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=offscreen;RENDERIVE_PERFORMANCE_LOG=0" TIMEOUT 12) - renderive_add_gtest(Renderive_Multithread_Input_Stress Multithread_Input_Stress Multithread_Input_Stress.cpp) - set_tests_properties(Renderive.Multithread_Input_Stress PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=offscreen;RENDERIVE_PERFORMANCE_LOG=0" TIMEOUT 15) +enable_testing() +find_package(GTest REQUIRED) +if (TARGET GTest::gtest) +set(renderive_gtest_library GTest::gtest) +elseif (TARGET GTest::GTest) +set(renderive_gtest_library GTest::GTest) +else () +message(FATAL_ERROR "GTest target was not found") 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_Diagnostics Renderive_Widget) +function(renderive_add_gtest target test_name source) +add_executable(${target} EXCLUDE_FROM_ALL "${CMAKE_CURRENT_LIST_DIR}/tests/${source}") +target_link_libraries(${target} PRIVATE +Renderive +${renderive_gtest_library} +${ARGN} +) +renderive_apply_sanitizer(${target}) +add_test(NAME Renderive.${test_name} COMMAND ${target}) +endfunction() -add_executable(Demo_Gallery ${CMAKE_CURRENT_LIST_DIR}/demo_gallery_main.cpp) -target_link_libraries(Demo_Gallery PUBLIC Demo_Gallery_Lib) +renderive_add_gtest( +Renderive_ASan_Runtime_Smoke +ASan_Runtime_Smoke +ASan_Runtime_Smoke.cpp +) +renderive_add_gtest( +Renderive_Update_Completion +Update_Completion +Update_Completion.cpp +) +renderive_add_gtest( +Renderive_Memory_Default +Memory_Default +Memory_Default.cpp +) +renderive_add_gtest( +Renderive_Memory_Callbacks +Memory_Callbacks +Memory_Callbacks.cpp +) +renderive_add_gtest( +Renderive_Memory_Failure +Memory_Failure +Memory_Failure.cpp +) +renderive_add_gtest( +Renderive_Memory_Late_Config +Memory_Late_Config +Memory_Late_Config.cpp +) +renderive_add_gtest( +Renderive_Memory_Plot_Late_Config +Memory_Plot_Late_Config +Memory_Plot_Late_Config.cpp +) +set_tests_properties(Renderive.Memory_Plot_Late_Config PROPERTIES +ENVIRONMENT "QT_QPA_PLATFORM=offscreen" +) +renderive_add_gtest( +Renderive_Timeline_Stream_Consistency +Timeline_Stream_Consistency +Timeline_Stream_Consistency.cpp +) +renderive_add_gtest( +Renderive_Memory_Data_Path_Stress +Memory_Data_Path_Stress +Memory_Data_Path_Stress.cpp +) +set_tests_properties(Renderive.Memory_Data_Path_Stress PROPERTIES +ENVIRONMENT "QT_QPA_PLATFORM=offscreen;RENDERIVE_PERFORMANCE_LOG=0" +TIMEOUT 20 +) +renderive_add_gtest( +Renderive_Renderable_Lifecycle_Stress +Renderable_Lifecycle_Stress +Renderable_Lifecycle_Stress.cpp +) +set_tests_properties(Renderive.Renderable_Lifecycle_Stress PROPERTIES +ENVIRONMENT "QT_QPA_PLATFORM=offscreen;RENDERIVE_PERFORMANCE_LOG=0" +TIMEOUT 20 +) +renderive_add_gtest( +Renderive_Frame_Scheduler_Feedback +Frame_Scheduler_Feedback +Frame_Scheduler_Feedback.cpp +Renderive_Diagnostics +) +set_tests_properties(Renderive.Frame_Scheduler_Feedback PROPERTIES +ENVIRONMENT "RENDERIVE_PERFORMANCE_LOG=1;RENDERIVE_PERFORMANCE_LOG_PATH=${CMAKE_BINARY_DIR}/renderive_feedback_test_log.csv" +) +renderive_add_gtest( +Renderive_Performance_Shower_Interaction +Performance_Shower_Interaction +Performance_Shower_Interaction.cpp +Renderive_Diagnostics +Renderive_Widget +) +set_tests_properties(Renderive.Performance_Shower_Interaction PROPERTIES +ENVIRONMENT "QT_QPA_PLATFORM=offscreen;RENDERIVE_PERFORMANCE_LOG=0" +TIMEOUT 12 +) +renderive_add_gtest( +Renderive_Multithread_Input_Stress +Multithread_Input_Stress +Multithread_Input_Stress.cpp +) +set_tests_properties(Renderive.Multithread_Input_Stress PROPERTIES +ENVIRONMENT "QT_QPA_PLATFORM=offscreen;RENDERIVE_PERFORMANCE_LOG=0" +TIMEOUT 15 +) +endif () +set(renderive_demo_root "${CMAKE_CURRENT_LIST_DIR}/Demo_Gallery") +file(GLOB_RECURSE renderive_demo_sources CONFIGURE_DEPENDS +"${renderive_demo_root}/*.c" +"${renderive_demo_root}/*.cpp" +"${renderive_demo_root}/*.h" +"${renderive_demo_root}/*.hpp" +) +add_library(Demo_Gallery_Lib STATIC ${renderive_demo_sources}) +target_link_libraries(Demo_Gallery_Lib PUBLIC +Renderive +Renderive_Diagnostics +Renderive_Widget +) +renderive_apply_sanitizer(Demo_Gallery_Lib) +add_executable(Demo_Gallery "${CMAKE_CURRENT_LIST_DIR}/demo_gallery_main.cpp") +target_link_libraries(Demo_Gallery PRIVATE Demo_Gallery_Lib) +renderive_enable_qt_target(Demo_Gallery) +renderive_apply_sanitizer(Demo_Gallery)