CMakeLists.txt 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. # Cmake config largely taken from catch2
  2. cmake_minimum_required(VERSION 3.5)
  3. # detect if Catch is being bundled,
  4. # disable testsuite in that case
  5. if(NOT DEFINED PROJECT_NAME)
  6. set(NOT_SUBPROJECT ON)
  7. else()
  8. set(NOT_SUBPROJECT OFF)
  9. endif()
  10. option(RAPIDFUZZ_BUILD_TESTING "Build tests" OFF)
  11. option(RAPIDFUZZ_BUILD_BENCHMARKS "Build benchmarks" OFF)
  12. option(RAPIDFUZZ_BUILD_FUZZERS "Build fuzzers" OFF)
  13. # RapidFuzz's build breaks if done in-tree. You probably should not build
  14. # things in tree anyway, but we can allow projects that include RapidFuzz
  15. # as a subproject to build in-tree as long as it is not in our tree.
  16. if (CMAKE_BINARY_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
  17. message(FATAL_ERROR "Building in-source is not supported! Create a build dir and remove ${CMAKE_SOURCE_DIR}/CMakeCache.txt")
  18. endif()
  19. project(rapidfuzz LANGUAGES CXX VERSION 1.1.0)
  20. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
  21. include(GNUInstallDirs)
  22. include(CMakePackageConfigHelpers)
  23. # Basic paths
  24. set(BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
  25. set(SOURCES_DIR ${BASE_DIR}/rapidfuzz)
  26. set(TEST_DIR ${BASE_DIR}/test)
  27. set(BENCHMARK_DIR ${BASE_DIR}/tests/bench)
  28. set(EXAMPLES_DIR ${BASE_DIR}/examples)
  29. add_library(rapidfuzz INTERFACE)
  30. # provide a namespaced alias for clients to 'link' against if RapidFuzz is included as a sub-project
  31. add_library(rapidfuzz::rapidfuzz ALIAS rapidfuzz)
  32. target_compile_features(rapidfuzz INTERFACE cxx_std_14)
  33. target_include_directories(rapidfuzz
  34. INTERFACE
  35. $<BUILD_INTERFACE:${SOURCES_DIR}/..>
  36. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  37. )
  38. # Build tests only if requested
  39. if(RAPIDFUZZ_BUILD_TESTING AND NOT_SUBPROJECT)
  40. include(CTest)
  41. enable_testing()
  42. add_subdirectory(test)
  43. endif()
  44. # Build examples only if requested
  45. if(RAPIDFUZZ_BUILD_EXAMPLES)
  46. #add_subdirectory(examples)
  47. endif()
  48. # Build benchmarks only if requested
  49. if(RAPIDFUZZ_BUILD_BENCHMARKS)
  50. add_subdirectory(bench)
  51. endif()
  52. # Build fuzz tests only if requested
  53. if(RAPIDFUZZ_BUILD_FUZZERS)
  54. add_subdirectory(fuzzing)
  55. endif()
  56. # Only perform the installation steps when RapidFuzz is not being used as
  57. # a subproject via `add_subdirectory`
  58. if (NOT_SUBPROJECT)
  59. set(RAPIDFUZZ_CMAKE_CONFIG_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/rapidfuzz")
  60. install(
  61. TARGETS
  62. rapidfuzz
  63. EXPORT
  64. rapidfuzzTargets
  65. DESTINATION
  66. ${CMAKE_INSTALL_LIBDIR}
  67. )
  68. install(
  69. EXPORT
  70. rapidfuzzTargets
  71. NAMESPACE
  72. rapidfuzz::
  73. DESTINATION
  74. ${RAPIDFUZZ_CMAKE_CONFIG_DESTINATION}
  75. )
  76. install(
  77. DIRECTORY
  78. rapidfuzz
  79. DESTINATION
  80. ${CMAKE_INSTALL_INCLUDEDIR}
  81. FILES_MATCHING
  82. PATTERN "*.hpp"
  83. PATTERN "*.impl"
  84. )
  85. configure_package_config_file(
  86. ${CMAKE_CURRENT_LIST_DIR}/cmake/${PROJECT_NAME}Config.cmake.in
  87. ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
  88. INSTALL_DESTINATION ${RAPIDFUZZ_CMAKE_CONFIG_DESTINATION}
  89. )
  90. write_basic_package_version_file(
  91. "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
  92. COMPATIBILITY SameMajorVersion
  93. )
  94. install(
  95. FILES
  96. "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
  97. "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
  98. DESTINATION
  99. ${RAPIDFUZZ_CMAKE_CONFIG_DESTINATION}
  100. )
  101. # CPack/CMake started taking the package version from project version 3.12
  102. # So we need to set the version manually for older CMake versions
  103. if(${CMAKE_VERSION} VERSION_LESS "3.12.0")
  104. set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
  105. endif()
  106. set(CPACK_PACKAGE_VENDOR "Max Bachmann")
  107. set(CPACK_PACKAGE_CONTACT "https://github.com/maxbachmann/rapidfuzz-cpp")
  108. include(CPack)
  109. endif(NOT_SUBPROJECT)