CMakeLists.txt 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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)
  9. # CMake系统的相关设定
  10. set(CMAKE_C_STANDARD 11)
  11. set(C_EXTENSIONS ON) # 启动编译器拓展
  12. set(C_STANDARD_REQUIRED OFF)
  13. set(BUILD_SHARED_LIBS OFF) # 默认编译静态库 (该设定不可被修改)
  14. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
  15. set(VISIBILITY_INLINES_HIDDEN TRUE) # 默认内联函数不可见
  16. set(CMAKE_C_VISIBILITY_PRESET "hidden") # 默认所有符号不可见
  17. # 系统检查
  18. include(CheckCCompilerFlag)
  19. check_c_compiler_flag("-fPIC" fpic_work) # 检查是否有fPIC选项
  20. if (fpic_work)
  21. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
  22. endif()
  23. if (MSVC)
  24. set(CMAKE_GNUtoMS TRUE)
  25. check_c_compiler_flag("/utf-8" utf8_work)
  26. if (NOT utf8_work)
  27. message(FATAL_ERROR "The msvc not support utf-8")
  28. endif()
  29. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /utf-8")
  30. else()
  31. check_c_compiler_flag("-fexec-charset=UTF-8" utf8_work)
  32. if (NOT utf8_work)
  33. message(FATAL_ERROR "The compiler not support utf-8")
  34. endif()
  35. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexec-charset=UTF-8")
  36. endif()
  37. # 相关参数
  38. set(PRINT_DIR_INFO ON CACHE BOOL "Print install and build dirs info.")
  39. set(_print_dir ${PRINT_DIR_INFO})
  40. include(CFEP) # 搜索CFEP.cmake
  41. if (_print_dir)
  42. set(PRINT_DIR_INFO OFF CACHE BOOL "Print install and build dirs info." FORCE)
  43. wi_set_install_dir(NAMES aFunlang) # 设置安装路径
  44. else()
  45. wi_set_install_dir_quiet(NAMES aFunlang) # 设置安装路径
  46. endif()
  47. include(info)
  48. # CMake对象属性的初始化值的相关设定
  49. set(CMAKE_INSTALL_RPATH
  50. "${CMAKE_INSTALL_PREFIX}/${INSTALL_LIBDIR}"
  51. "${CMAKE_INSTALL_PREFIX}/${deps_install_dir}/${INSTALL_LIBDIR}") # INSTALL_RPATH 初始化值
  52. set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
  53. set(CMAKE_MACOSX_RPATH TRUE)
  54. include_directories(${CMAKE_SOURCE_DIR}/include ${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}) # 添加默认的include路径
  55. set(base_compile_definitions
  56. aFunVersion="${PROJECT_VERSION}"
  57. aFunDescription="${PROJECT_DESCRIPTION}"
  58. systemName="${CMAKE_SYSTEM_NAME}"
  59. compilerID="${CMAKE_C_COMPILER_ID}"
  60. aFunMajorVersion=${PROJECT_VERSION_MAJOR}
  61. aFunMinorVersion=${PROJECT_VERSION_MINOR}
  62. aFunPatchVersion=${PROJECT_VERSION_PATCH}) # 默认的预定义宏
  63. if (WIN32 OR CYGWIN)
  64. list(APPEND base_compile_definitions aFunWIN32=1)
  65. endif()
  66. add_compile_definitions(${base_compile_definitions})
  67. include(${CMAKE_CURRENT_LIST_DIR}/deps/deps.cmake) # 安装依赖
  68. add_subdirectory(src)
  69. include(aFunHeader)
  70. install(EXPORT aFunlang
  71. NAMESPACE "aFunlang::"
  72. DESTINATION ${INSTALL_CMAKEDIR}
  73. COMPONENT dev)
  74. include(CMakePackageConfigHelpers)
  75. write_basic_package_version_file(${CMAKE_BINARY_DIR}/cmake-tmp/aFunlangConfigVersion.cmake
  76. VERSION ${aFunVersion}
  77. COMPATIBILITY SameMinorVersion)
  78. # 生成Config.cmake文件
  79. set(INSTALL_DIR ${CMAKE_INSTALL_PREFIX})
  80. set(BINDIR ${INSTALL_BINDIR})
  81. set(LIBDIR ${INSTALL_LIBDIR})
  82. set(CMAKEDIR ${INSTALL_CMAKEDIR})
  83. set(INCLUDEDIR ${INSTALL_INCLUDEDIR})
  84. set(path_var)
  85. if (WIN32 AND NOT CYGWIN) # cygwin 不需要编译 dl
  86. foreach(tgt dlfcn pcre2 fflags)
  87. set(${tgt}_INSTALL_DIR ${deps_install_dir})
  88. set(${tgt}_CMAKEDIR ${deps_install_dir}/${${tgt}_cmake})
  89. list(APPEND path_var ${tgt}_INSTALL_DIR ${tgt}_CMAKEDIR)
  90. endforeach()
  91. else()
  92. foreach(tgt pcre2 fflags)
  93. set(${tgt}_INSTALL_DIR ${deps_install_dir})
  94. set(${tgt}_CMAKEDIR ${deps_install_dir}/${${tgt}_cmake})
  95. list(APPEND path_var ${tgt}_INSTALL_DIR ${tgt}_CMAKEDIR)
  96. endforeach()
  97. set(dlfcn_INSTALL_DIR \"\") # 空字符串
  98. set(dlfcn_CMAKEDIR \"\") # 空字符串
  99. endif()
  100. configure_package_config_file(${PROJECT_SOURCE_DIR}/cmake/aFunlangConfig.cmake.in
  101. ${CMAKE_BINARY_DIR}/cmake-tmp/aFunlangConfig.cmake
  102. INSTALL_DESTINATION ${INSTALL_CMAKEDIR}
  103. PATH_VARS INSTALL_DIR BINDIR LIBDIR CMAKEDIR INCLUDEDIR ${path_var}
  104. INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) # 指定安装目录 (用于生成相对路径)
  105. unset(INSTALL_DIR)
  106. unset(BINDIR)
  107. unset(LIBDIR)
  108. unset(CMAKEDIR)
  109. unset(INCLUDEDIR)
  110. foreach(tgt dlfcn pcre2 fflags)
  111. unset(${tgt}_INSTALL_DIR)
  112. unset(${tgt}_CMAKEDIR)
  113. endforeach()
  114. unset(path_var)
  115. install(FILES
  116. ${CMAKE_BINARY_DIR}/cmake-tmp/aFunlangConfig.cmake
  117. ${CMAKE_BINARY_DIR}/cmake-tmp/aFunlangConfigVersion.cmake
  118. DESTINATION ${INSTALL_CMAKEDIR})
  119. set(BUILD_TEST FALSE CACHE BOOL "Enable run test program")
  120. set(_build_test ${BUILD_TEST})
  121. if (_build_test)
  122. enable_testing()
  123. endif()
  124. add_subdirectory(test) # test的相关内容仍会被构建