CMakeLists.txt 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. cmake_minimum_required(VERSION 3.16)
  2. # 获取版本信息
  3. file(READ ${CMAKE_SOURCE_DIR}/version aFunVersion)
  4. file(READ ${CMAKE_SOURCE_DIR}/version-info aFunDescription)
  5. project(aFun
  6. VERSION ${aFunVersion}
  7. DESCRIPTION ${aFunDescription}
  8. LANGUAGES C CXX)
  9. # CMake系统的相关设定
  10. set(CMAKE_C_STANDARD 11)
  11. set(C_EXTENSIONS ON) # 启动编译器拓展
  12. set(C_STANDARD_REQUIRED OFF)
  13. set(CMAKE_CXX_STANDARD 20)
  14. set(CXX_EXTENSIONS ON) # 启动编译器拓展
  15. set(CXX_STANDARD_REQUIRED OFF)
  16. set(BUILD_SHARED_LIBS OFF) # 默认编译静态库 (该设定不可被修改)
  17. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
  18. set(CMAKE_BUILD_TYPE DEBUG CACHE STRING "Build type")
  19. # 系统检查
  20. include(CheckCCompilerFlag)
  21. check_c_compiler_flag("-fPIC" fpic_work) # 检查是否有fPIC选项
  22. if (fpic_work)
  23. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
  24. endif()
  25. if (MSVC)
  26. set(CMAKE_GNUtoMS TRUE)
  27. check_c_compiler_flag("/utf-8" utf8_work)
  28. if (NOT utf8_work)
  29. message(FATAL_ERROR "The msvc not support utf-8")
  30. endif()
  31. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /utf-8")
  32. set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} /utf-8")
  33. else()
  34. check_c_compiler_flag("-fexec-charset=UTF-8" utf8_work)
  35. if (NOT utf8_work)
  36. message(FATAL_ERROR "The compiler not support utf-8")
  37. endif()
  38. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexec-charset=UTF-8")
  39. set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -fexec-charset=UTF-8")
  40. endif()
  41. # 相关参数
  42. set(PRINT_DIR_INFO ON CACHE BOOL "Print install and build dirs info.")
  43. set(_print_dir ${PRINT_DIR_INFO})
  44. include(tool)
  45. include(CFEP) # 搜索CFEP.cmake
  46. if (_print_dir)
  47. set(PRINT_DIR_INFO OFF CACHE BOOL "Print install and build dirs info." FORCE)
  48. wi_set_install_dir(NAMES aFunlang) # 设置安装路径
  49. else()
  50. wi_set_install_dir_quiet(NAMES aFunlang) # 设置安装路径
  51. endif()
  52. to_native_path(${INSTALL_LOGDIR} INSTALL_LOGDIR_NATIVE)
  53. to_native_path(${INSTALL_LOCALSTATEDIR} INSTALL_LOCALSTATEDIR_NATIVE)
  54. to_native_path(${INSTALL_LANGDIR} INSTALL_LANGDIR_NATIVE)
  55. include(filename)
  56. # CMake对象属性的初始化值的相关设定
  57. set(CMAKE_INSTALL_RPATH
  58. "${CMAKE_INSTALL_PREFIX}/${INSTALL_LIBDIR}"
  59. "${CMAKE_INSTALL_PREFIX}/${deps_install_dir}/${INSTALL_LIBDIR}") # INSTALL_RPATH 初始化值
  60. set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
  61. set(CMAKE_MACOSX_RPATH TRUE)
  62. include_directories(${CMAKE_SOURCE_DIR}/include ${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}) # 添加默认的include路径
  63. set(base_compile_definitions
  64. aFunVersion="${PROJECT_VERSION}"
  65. aFunDescription="${PROJECT_DESCRIPTION}"
  66. systemName="${CMAKE_SYSTEM_NAME}"
  67. compilerID="${CMAKE_C_COMPILER_ID}"
  68. aFunMajorVersion=${PROJECT_VERSION_MAJOR}
  69. aFunMinorVersion=${PROJECT_VERSION_MINOR}
  70. aFunPatchVersion=${PROJECT_VERSION_PATCH}
  71. aFunLogDir="${INSTALL_LOGDIR_NATIVE}"
  72. aFunVarLibDir="${INSTALL_LOCALSTATEDIR_NATIVE}"
  73. aFunLangDir="${INSTALL_LANGDIR_NATIVE}"
  74. aFunSharePrefix="${CMAKE_SHARED_LIBRARY_PREFIX}"
  75. aFunShareSuffix="${CMAKE_SHARED_LIBRARY_SUFFIX}"
  76. aFunStaticPrefix="${CMAKE_STATIC_LIBRARY_PREFIX}"
  77. aFunStaticSuffix="${CMAKE_STATIC_LIBRARY_SUFFIX}"
  78. aFunExeSuffix="${CMAKE_EXECUTABLE_SUFFIX}") # 默认的预定义宏
  79. if (WIN32 OR CYGWIN)
  80. list(APPEND base_compile_definitions aFunWIN32=1)
  81. set(aFunWIN32 1)
  82. endif()
  83. if (WIN32 AND NOT CYGWIN)
  84. list(APPEND base_compile_definitions aFunWIN32_NO_CYGWIN=1)
  85. set(aFunWIN32_NO_CYGWIN 1)
  86. endif()
  87. if (CYGWIN)
  88. list(APPEND base_compile_definitions aFunCYGWIN=1)
  89. set(aFunCYGWIN 1)
  90. endif()
  91. if (CMAKE_BUILD_TYPE STREQUAL Debug)
  92. list(APPEND base_compile_definitions aFunDEBUG=1)
  93. set(aFunDEBUG 1)
  94. endif()
  95. configure_file(${CMAKE_SOURCE_DIR}/include/base.h.in ${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}/base.h @ONLY)
  96. include(${CMAKE_CURRENT_LIST_DIR}/deps/deps.cmake) # 安装依赖
  97. include(${CMAKE_CURRENT_LIST_DIR}/lang/hgt.cmake) # 安装lang库
  98. add_subdirectory(src)
  99. include(aFunHeader)
  100. #install(EXPORT aFunlang
  101. # NAMESPACE "aFunlang::"
  102. # DESTINATION ${INSTALL_CMAKEDIR}
  103. # COMPONENT dev)
  104. #
  105. #include(CMakePackageConfigHelpers)
  106. #write_basic_package_version_file(${CMAKE_BINARY_DIR}/cmake-tmp/aFunlangConfigVersion.cmake
  107. # VERSION ${aFunVersion}
  108. # COMPATIBILITY SameMinorVersion)
  109. #
  110. ## 生成Config.cmake文件
  111. #set(INSTALL_DIR ${CMAKE_INSTALL_PREFIX})
  112. #set(BINDIR ${INSTALL_BINDIR})
  113. #set(LIBDIR ${INSTALL_LIBDIR})
  114. #set(CMAKEDIR ${INSTALL_CMAKEDIR})
  115. #set(INCLUDEDIR ${INSTALL_INCLUDEDIR})
  116. #
  117. #if (MSVC)
  118. # set(pthread_INSTALL_DIR ${deps_install_dir})
  119. # set(pthread_CMAKEDIR pthread_cmake)
  120. # set(path_var pthread_INSTALL_DIR pthread_CMAKEDIR)
  121. #else()
  122. # set(path_var)
  123. #endif()
  124. #if (WIN32 AND NOT CYGWIN) # cygwin 不需要编译 dl
  125. # foreach(tgt dlfcn pcre2 fflags)
  126. # set(${tgt}_INSTALL_DIR ${deps_install_dir})
  127. # set(${tgt}_CMAKEDIR ${deps_install_dir}/${${tgt}_cmake})
  128. # list(APPEND path_var ${tgt}_INSTALL_DIR ${tgt}_CMAKEDIR)
  129. # endforeach()
  130. #else()
  131. # foreach(tgt pcre2 fflags)
  132. # set(${tgt}_INSTALL_DIR ${deps_install_dir})
  133. # set(${tgt}_CMAKEDIR ${deps_install_dir}/${${tgt}_cmake})
  134. # list(APPEND path_var ${tgt}_INSTALL_DIR ${tgt}_CMAKEDIR)
  135. # endforeach()
  136. #
  137. # set(dlfcn_INSTALL_DIR \"\") # 空字符串
  138. # set(dlfcn_CMAKEDIR \"\") # 空字符串
  139. #endif()
  140. #
  141. #configure_package_config_file(${PROJECT_SOURCE_DIR}/cmake/aFunlangConfig.cmake.in
  142. # ${CMAKE_BINARY_DIR}/cmake-tmp/aFunlangConfig.cmake
  143. # INSTALL_DESTINATION ${INSTALL_CMAKEDIR}
  144. # PATH_VARS INSTALL_DIR BINDIR LIBDIR CMAKEDIR INCLUDEDIR ${path_var}
  145. # INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) # 指定安装目录 (用于生成相对路径)
  146. #unset(INSTALL_DIR)
  147. #unset(BINDIR)
  148. #unset(LIBDIR)
  149. #unset(CMAKEDIR)
  150. #unset(INCLUDEDIR)
  151. #foreach(tgt dlfcn pcre2 fflags)
  152. # unset(${tgt}_INSTALL_DIR)
  153. # unset(${tgt}_CMAKEDIR)
  154. #endforeach()
  155. #unset(path_var)
  156. #
  157. #install(FILES
  158. # ${CMAKE_BINARY_DIR}/cmake-tmp/aFunlangConfig.cmake
  159. # ${CMAKE_BINARY_DIR}/cmake-tmp/aFunlangConfigVersion.cmake
  160. # DESTINATION ${INSTALL_CMAKEDIR})
  161. #
  162. #function(install_directory dir)
  163. # file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/${dir}) # 安装log输出的目录
  164. # install(CODE "file(MAKE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${dir})") # 创建log目录
  165. #endfunction()
  166. #
  167. #install_directory(${INSTALL_LOGDIR})
  168. #install_directory(${INSTALL_LOCALSTATEDIR})
  169. #install_directory(${INSTALL_LANGDIR})
  170. #
  171. set(BUILD_TEST FALSE CACHE BOOL "Enable run test program")
  172. set(_build_test ${BUILD_TEST})
  173. if (_build_test)
  174. enable_testing()
  175. endif()
  176. add_subdirectory(test) # test的相关内容仍会被构建
  177. #
  178. #include(info)