CMakeLists.txt 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. cmake_minimum_required(VERSION 3.16)
  2. project(aFun LANGUAGES C)
  3. # CMake系统的相关设定
  4. set(CMAKE_C_STANDARD 11)
  5. set(C_EXTENSIONS ON) # 启动编译器拓展
  6. set(C_STANDARD_REQUIRED OFF)
  7. set(BUILD_SHARED_LIBS OFF) # 默认编译静态库 (该设定不可被修改)
  8. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
  9. set(VISIBILITY_INLINES_HIDDEN TRUE) # 默认内联函数不可见
  10. set(CMAKE_C_VISIBILITY_PRESET "hidden") # 默认所有符号不可见
  11. # 系统检查
  12. include(CheckCCompilerFlag)
  13. check_c_compiler_flag("-fPIC" fpic_work) # 检查是否有fPIC选项
  14. if (fpic_work)
  15. list(APPEND CMAKE_C_FLAGS "-fPIC")
  16. endif()
  17. if (MSVC)
  18. set(CMAKE_GNUtoMS TRUE)
  19. endif()
  20. # 相关参数
  21. set(PRINT_DIR_INFO ON CACHE BOOL "Print install and build dirs info.")
  22. set(_print_dir ${PRINT_DIR_INFO})
  23. include(CFEP) # 搜索CFEP.cmake
  24. if (_print_dir)
  25. set(PRINT_DIR_INFO OFF CACHE BOOL "Print install and build dirs info." FORCE)
  26. wi_set_install_dir(NAMES aFunlang) # 设置安装路径
  27. else()
  28. wi_set_install_dir_quiet(NAMES aFunlang) # 设置安装路径
  29. endif()
  30. include(info)
  31. # CMake对象属性的初始化值的相关设定
  32. set(CMAKE_INSTALL_RPATH
  33. "${CMAKE_INSTALL_PREFIX}/${INSTALL_LIBDIR}"
  34. "${CMAKE_INSTALL_PREFIX}/${deps_install_dir}/${INSTALL_LIBDIR}") # INSTALL_RPATH 初始化值
  35. set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
  36. set(CMAKE_MACOSX_RPATH TRUE)
  37. include_directories(${CMAKE_SOURCE_DIR}/include ${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}) # 添加默认的include路径
  38. include(${CMAKE_CURRENT_LIST_DIR}/deps/deps.cmake) # 安装依赖
  39. add_subdirectory(src)
  40. include(aFunHeader)
  41. install(EXPORT aFunlang
  42. NAMESPACE "aFunlang::"
  43. DESTINATION ${INSTALL_CMAKEDIR}
  44. COMPONENT dev)
  45. include(CMakePackageConfigHelpers)
  46. write_basic_package_version_file(${CMAKE_BINARY_DIR}/cmake-tmp/aFunlangConfigVersion.cmake
  47. VERSION "0.0.0"
  48. COMPATIBILITY SameMinorVersion)
  49. # 生成Config.cmake文件
  50. set(INSTALL_DIR ${CMAKE_INSTALL_PREFIX})
  51. set(BINDIR ${INSTALL_BINDIR})
  52. set(LIBDIR ${INSTALL_LIBDIR})
  53. set(CMAKEDIR ${INSTALL_CMAKEDIR})
  54. set(INCLUDEDIR ${INSTALL_INCLUDEDIR})
  55. set(path_var)
  56. if (WIN32 AND NOT CYGWIN)
  57. foreach(tgt dlfcn pcre2 fflags)
  58. set(${tgt}_INSTALL_DIR ${deps_install_dir})
  59. set(${tgt}_CMAKEDIR ${deps_install_dir}/${${tgt}_cmake})
  60. list(APPEND path_var ${tgt}_INSTALL_DIR ${tgt}_CMAKEDIR)
  61. endforeach()
  62. else()
  63. foreach(tgt pcre2 fflags)
  64. set(${tgt}_INSTALL_DIR ${deps_install_dir})
  65. set(${tgt}_CMAKEDIR ${deps_install_dir}/${${tgt}_cmake})
  66. list(APPEND path_var ${tgt}_INSTALL_DIR ${tgt}_CMAKEDIR)
  67. endforeach()
  68. set(dlfcn_INSTALL_DIR \"\") # 空字符串
  69. set(dlfcn_CMAKEDIR \"\") # 空字符串
  70. endif()
  71. configure_package_config_file(${PROJECT_SOURCE_DIR}/cmake/aFunlangConfig.cmake.in
  72. ${CMAKE_BINARY_DIR}/cmake-tmp/aFunlangConfig.cmake
  73. INSTALL_DESTINATION ${INSTALL_CMAKEDIR}
  74. PATH_VARS INSTALL_DIR BINDIR LIBDIR CMAKEDIR INCLUDEDIR ${path_var}
  75. INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) # 指定安装目录 (用于生成相对路径)
  76. unset(INSTALL_DIR)
  77. unset(BINDIR)
  78. unset(LIBDIR)
  79. unset(CMAKEDIR)
  80. unset(INCLUDEDIR)
  81. foreach(tgt dlfcn pcre2 fflags)
  82. unset(${tgt}_INSTALL_DIR)
  83. unset(${tgt}_CMAKEDIR)
  84. endforeach()
  85. unset(path_var)
  86. install(FILES
  87. ${CMAKE_BINARY_DIR}/cmake-tmp/aFunlangConfig.cmake
  88. ${CMAKE_BINARY_DIR}/cmake-tmp/aFunlangConfigVersion.cmake
  89. DESTINATION ${INSTALL_CMAKEDIR})
  90. set(BUILD_TEST FALSE CACHE BOOL "Enable run test program")
  91. set(_build_test ${BUILD_TEST})
  92. if (_build_test)
  93. enable_testing()
  94. endif()
  95. add_subdirectory(test) # test的相关内容仍会被构建