diff --git a/0_cmake_library/main.cmake b/0_cmake_library/main.cmake index cd9688a..c71611c 100644 --- a/0_cmake_library/main.cmake +++ b/0_cmake_library/main.cmake @@ -1,5 +1,4 @@ include(${CMAKE_CURRENT_LIST_DIR}/register_libaray/rcl_register_ex.cmake) - macro(w_install files dir) install(FILES ${files} DESTINATION "${dir}") endmacro() @@ -20,7 +19,6 @@ set(_root_dir) set(_system_build_tool_install_dir_name) set(_system_build_tool_install_dir) set(_system_build_tool_build_dir) - function(w_append_flag_string var) set(_value "${${var}}") foreach (_flag ${ARGN}) @@ -32,55 +30,76 @@ function(w_append_flag_string var) string(STRIP "${_value}" _value) set(${var} "${_value}" PARENT_SCOPE) endfunction() - - +project(Renderive LANGUAGES C CXX) function(_initialize_cxx_default_options) - set(cxx_flags "${CMAKE_CXX_FLAGS_INIT}") - set(exe_linker_flags "${CMAKE_EXE_LINKER_FLAGS_INIT}") - set(shared_linker_flags "${CMAKE_SHARED_LINKER_FLAGS_INIT}") - set(module_linker_flags "${CMAKE_MODULE_LINKER_FLAGS_INIT}") - set(exe_release_linker_flags "${CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT}") - set(shared_release_linker_flags "${CMAKE_SHARED_LINKER_FLAGS_RELEASE_INIT}") - set(module_release_linker_flags "${CMAKE_MODULE_LINKER_FLAGS_RELEASE_INIT}") - - if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - string(APPEND cxx_flags " /wd4819 /utf-8 /Zc:preprocessor /DNOMINMAX /D_USE_MATH_DEFINES /EHsc /bigobj -showIncludes") - string(APPEND exe_release_linker_flags " /PROFILE") - string(APPEND shared_release_linker_flags " /PROFILE") - string(APPEND module_release_linker_flags " /PROFILE") + if (TARGET global_default_options) + return() + endif () + add_library(global_default_options INTERFACE) + if (MSVC) + target_compile_options( + global_default_options + INTERFACE + /wd4819 + /utf-8 + /Zc:preprocessor + /EHsc + /bigobj + ) + target_compile_definitions( + global_default_options + INTERFACE + NOMINMAX + _USE_MATH_DEFINES + ) + target_link_options( + global_default_options + INTERFACE + "$<$:/PROFILE>" + ) else () - string(APPEND cxx_flags " -Wall -Wextra -Werror=return-type") - + target_compile_options( + global_default_options + INTERFACE + -Wall + -Wextra + -Werror=return-type + -fvisibility=hidden + -fvisibility-inlines-hidden + -Wpedantic + -Wshadow + -Wconversion + -Wsign-conversion + ) if (USE_RUNPATH) - string(APPEND exe_linker_flags " -Wl,--enable-new-dtags") - string(APPEND shared_linker_flags " -Wl,--enable-new-dtags") - string(APPEND module_linker_flags " -Wl,--enable-new-dtags") + target_link_options( + global_default_options + INTERFACE + "LINKER:--enable-new-dtags" + ) else () - string(APPEND exe_linker_flags " -Wl,--disable-new-dtags") - string(APPEND shared_linker_flags " -Wl,--disable-new-dtags") - string(APPEND module_linker_flags " -Wl,--disable-new-dtags") + target_link_options( + global_default_options + INTERFACE + "LINKER:--disable-new-dtags" + ) endif () - if (ENABLE_ASAN) - string(APPEND cxx_flags " -fsanitize=address") + target_compile_options( + global_default_options + INTERFACE + -fsanitize=address + ) + target_link_options( + global_default_options + INTERFACE + -fsanitize=address + ) endif () endif () - - set(CMAKE_CXX_FLAGS_INIT "${cxx_flags}" PARENT_SCOPE) - set(CMAKE_EXE_LINKER_FLAGS_INIT "${exe_linker_flags}" PARENT_SCOPE) - set(CMAKE_SHARED_LINKER_FLAGS_INIT "${shared_linker_flags}" PARENT_SCOPE) - set(CMAKE_MODULE_LINKER_FLAGS_INIT "${module_linker_flags}" PARENT_SCOPE) - set(CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT "${exe_release_linker_flags}" PARENT_SCOPE) - set(CMAKE_SHARED_LINKER_FLAGS_RELEASE_INIT "${shared_release_linker_flags}" PARENT_SCOPE) - set(CMAKE_MODULE_LINKER_FLAGS_RELEASE_INIT "${module_release_linker_flags}" PARENT_SCOPE) endfunction() - - macro(_load_cmake_library) - - project(Radio LANGUAGES C CXX) - _initialize_cxx_default_options() # set(CMAKE_C_LINKER_LAUNCHER "D:/ae/proj/ae/0_cmake_library/set_utf8.bat") # set(CMAKE_CXX_LINKER_LAUNCHER "D:/ae/proj/ae/0_cmake_library/set_utf8.bat") @@ -164,6 +183,9 @@ endfunction() macro(_print_help_info) message("##################### SystemInfo #####################") message(STATUS "==============================================") + message(STATUS "CXX showIncludes prefix=[${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}]") + message(STATUS "C showIncludes prefix=[${CMAKE_C_CL_SHOWINCLUDES_PREFIX}]") + message(STATUS "Common showIncludes prefix=[${CMAKE_CL_SHOWINCLUDES_PREFIX}]") message(STATUS "${R}CMAKE_SOURCE_DIR${E}: ${B}${CMAKE_SOURCE_DIR}${E}") message(STATUS "${R}CMAKE_BINARY_DIR${E}: ${B}${CMAKE_BINARY_DIR}${E}") message(STATUS "${R}G_Architecture_Name${E}: ${B}${G_Architecture_Name}${E}") @@ -462,8 +484,7 @@ function(_load_proj_impl dir) endif () endforeach () endfunction() - - +# 收集源码文件 function(append_glob_source src_var_name) set(_args ${ARGN}) set(_total_srcs) @@ -485,4 +506,41 @@ function(append_glob_source src_var_name) endforeach () list(APPEND ${src_var_name} ${_total_srcs}) set(${src_var_name} "${${src_var_name}}" PARENT_SCOPE) +endfunction() +# 从候选目录搜索出存在的目录 +macro(select_first_existing_directory out_var) + unset(${out_var}) + foreach (candidate ${ARGN}) + if (IS_DIRECTORY "${candidate}") + set(${out_var} "${candidate}") + break() + endif () + endforeach () + if (NOT DEFINED ${out_var}) + message(FATAL_ERROR "No candidate directory exists for ${out_var}: ${ARGN}") + endif () +endmacro() +# 聚合一组文件变成一个文件 +function(generate_aggregate_sources source_dir output_dir include_prefix output_name) + file(GLOB_RECURSE headers CONFIGURE_DEPENDS + "${source_dir}/*.h" + "${source_dir}/*.hpp" + ) + file(GLOB_RECURSE sources CONFIGURE_DEPENDS + "${source_dir}/*.cpp" + ) + set(output_header "${output_dir}/${output_name}.h") + set(output_source "${output_dir}/${output_name}.cpp") + set(header_content "#pragma once\n") + set(source_content "") + foreach (header IN LISTS headers) + file(RELATIVE_PATH relative_header "${source_dir}" "${header}") + string(APPEND header_content "#include \"${include_prefix}/${relative_header}\"\n") + endforeach () + foreach (source IN LISTS sources) + file(RELATIVE_PATH relative_source "${source_dir}" "${source}") + string(APPEND source_content "#include \"${include_prefix}/${relative_source}\"\n") + endforeach () + file(WRITE "${output_header}" "${header_content}") + file(WRITE "${output_source}" "${source_content}") endfunction() \ No newline at end of file diff --git a/0_cmake_library/register/base.cmake b/0_cmake_library/register/base.cmake index 70f2a18..21056ae 100644 --- a/0_cmake_library/register/base.cmake +++ b/0_cmake_library/register/base.cmake @@ -137,16 +137,34 @@ block() "v1.17.0" ) rcl_cmake_library_set_cmake_options(global spdlog ${spdlog_opts}) - _register_git_cmake_library(global - pfr - "https://github.com/boostorg/pfr.git" - "2.2.0" - ) _register_git_cmake_library(global llvm "https://github.com/llvm/llvm-project.git" "llvmorg-22.1.8" ) rcl_cmake_library_set_cmake_source_relative_dir(global llvm "llvm") + set(magic_enum_opts) + list(APPEND magic_enum_opts + "-DMAGIC_ENUM_OPT_BUILD_EXAMPLES=OFF" + "-DMAGIC_ENUM_OPT_BUILD_TESTS=OFF" + "-DMAGIC_ENUM_OPT_INSTALL=ON" + "-DMAGIC_ENUM_OPT_INSTALL_PACKAGE_XML=OFF" + ) + _register_git_cmake_library(global + magic_enum + "https://github.com/Neargye/magic_enum.git" + "v0.9.8" + ) + rcl_cmake_library_set_cmake_options(global magic_enum ${magic_enum_opts}) + set(pfr_opts + "-DBUILD_TESTING=OFF" + "-DBOOST_USE_MODULES=OFF" + ) + _register_git_cmake_library(global + pfr + "https://github.com/boostorg/pfr.git" + "2.2.0" + ) + rcl_cmake_library_set_cmake_options(global pfr ${pfr_opts}) message("base.cmake load complete!") endblock() \ No newline at end of file diff --git a/Project.xml b/Project.xml index b36b442..bdad617 100644 --- a/Project.xml +++ b/Project.xml @@ -39,4 +39,7 @@ + + \ No newline at end of file diff --git a/start.cmake b/start.cmake index 7828417..3d93363 100644 --- a/start.cmake +++ b/start.cmake @@ -1,33 +1,21 @@ include(${CMAKE_CURRENT_LIST_DIR}/0_cmake_library/main.cmake) _load_cmake_library() - - rcl_init(global) rcl_set_root_dir(global "${EXTERNAL_DIR}/${G_Architecture_Name}_global") - - include(${CMAKE_CURRENT_LIST_DIR}/0_cmake_library/register/export.cmake) - #set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(ENABLE_BUILD_TIMER ON CACHE BOOL "" FORCE) - - option(A_enable_register_library "Enable register library" OFF) - - set(cmake_library "${CMAKE_CURRENT_LIST_DIR}/0_cmake_library") set(register_dir "${cmake_library}/register") message("register_dir ${register_dir}") include(${register_dir}/export.cmake) - - #if (NOT GTest_FOUND) # find_package(GTest) #endif () #if (NOT GTest_FOUND) # add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/3rdParty/GTest) #endif () - # 添加开发质量基础设施库 set(dqi "${cmake_library}/Development_Quality_Infrastructure") include(${dqi}/Doxygen/export.cmake) # 文档生成工具:生成代码 API 文档 @@ -37,16 +25,3 @@ include(${dqi}/Cppcheck/export.cmake) # 静态代码分析工具:检测 C include(${dqi}/lizard/export.cmake) # 代码复杂度分析工具:统计圈复杂度、函数规模等指标 include(${dqi}/cloc_tokei/export.cmake) # 代码统计工具:统计代码行数、语言组成等信息 include(${dqi}/CodeMetrics/export.cmake) # 软件度量工具:分析代码质量指标 - -macro(select_first_existing_directory out_var) - unset(${out_var}) - foreach (candidate ${ARGN}) - if (IS_DIRECTORY "${candidate}") - set(${out_var} "${candidate}") - break() - endif () - endforeach () - if (NOT DEFINED ${out_var}) - message(FATAL_ERROR "No candidate directory exists for ${out_var}: ${ARGN}") - endif () -endmacro() \ No newline at end of file