CMakeLists.txt 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #=============================================================================
  2. # Copyright (c) 2017 Paul Fultz II
  3. # CMakeLists.txt
  4. # Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. #==============================================================================
  7. cmake_minimum_required (VERSION 2.8)
  8. project (boost_hof)
  9. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
  10. foreach(level MAJOR MINOR PATCH)
  11. file(STRINGS include/boost/hof/version.hpp
  12. _define_${level}
  13. REGEX "#define BOOST_HOF_${level}_VERSION")
  14. string(REGEX MATCH "([0-9]+)" boost_hof_VERSION_${level} "${_define_${level}}")
  15. endforeach()
  16. include(CheckCXXCompilerFlag)
  17. enable_language(CXX)
  18. if(NOT CMAKE_CXX_FLAGS MATCHES "-std=")
  19. if(CMAKE_HOST_APPLE)
  20. check_cxx_compiler_flag("-stdlib=libc++" COMPILER_HAS_CXX_FLAG_libcxx)
  21. if(COMPILER_HAS_CXX_FLAG_libcxx)
  22. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
  23. endif()
  24. endif()
  25. set(ENABLE_CXXFLAGS_TO_CHECK
  26. -std=gnu++17
  27. -std=c++17
  28. -std=gnu++1z
  29. -std=c++1z
  30. -std=gnu++14
  31. -std=c++14
  32. -std=gnu++1y
  33. -std=c++1y
  34. -std=gnu++11
  35. -std=c++11
  36. -std=gnu++0x
  37. -std=c++0x)
  38. foreach(flag ${ENABLE_CXXFLAGS_TO_CHECK})
  39. string(REPLACE "-std=" "_" flag_var ${flag})
  40. string(REPLACE "+" "x" flag_var ${flag_var})
  41. check_cxx_compiler_flag("${flag}" COMPILER_HAS_CXX_FLAG${flag_var})
  42. if(COMPILER_HAS_CXX_FLAG${flag_var})
  43. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}")
  44. break()
  45. endif()
  46. endforeach()
  47. endif()
  48. install (DIRECTORY include/boost DESTINATION include)
  49. configure_file(boost_hof.pc.in boost_hof.pc)
  50. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/boost_hof.pc DESTINATION lib/pkgconfig)
  51. include(SphinxDoc)
  52. add_sphinx_doc(${CMAKE_CURRENT_SOURCE_DIR}/doc HTML_DIR ${CMAKE_CURRENT_SOURCE_DIR}/doc/html)
  53. include(BCMTest)
  54. include_directories(include)
  55. file(GLOB TESTS test/*.cpp)
  56. foreach(TEST ${TESTS})
  57. get_filename_component(BASE_NAME ${TEST} NAME_WE)
  58. bcm_add_test(NAME ${BASE_NAME} SOURCES ${TEST})
  59. set_tests_properties(${BASE_NAME} PROPERTIES FAIL_REGULAR_EXPRESSION "FAILED")
  60. endforeach()
  61. bcm_add_test(NAME static_def SOURCES test/static_def/static_def.cpp test/static_def/static_def2.cpp)
  62. set_tests_properties(static_def PROPERTIES FAIL_REGULAR_EXPRESSION "FAILED")
  63. file(GLOB FAIL_TESTS test/fail/*.cpp)
  64. foreach(TEST ${FAIL_TESTS})
  65. get_filename_component(BASE_NAME ${TEST} NAME_WE)
  66. bcm_add_test(NAME fail-${BASE_NAME} COMPILE_ONLY WILL_FAIL SOURCES ${TEST})
  67. endforeach()
  68. file(GLOB HEADERS include/boost/hof/*.hpp)
  69. foreach(HEADER ${HEADERS})
  70. get_filename_component(BASE_NAME ${HEADER} NAME_WE)
  71. bcm_test_header(NAME ${BASE_NAME} HEADER boost/hof/${BASE_NAME}.hpp STATIC)
  72. endforeach()
  73. bcm_test_header(NAME hof HEADER boost/hof.hpp STATIC)
  74. function(extract_doc SOURCE OUTPUTVAR)
  75. file(READ ${SOURCE} CONTENT)
  76. string(REGEX REPLACE "(\n(/[^/][^/]|//[^/]|[^/][^/][^/])([^\n])*)" "" CONTENT "\n${CONTENT}")
  77. string(REPLACE "/// " "" CONTENT "${CONTENT}")
  78. set(${OUTPUTVAR} "${CONTENT}" PARENT_SCOPE)
  79. endfunction()
  80. function(build_example SECTIONCONTENT NAME)
  81. string(MD5 MD5_SECTION "${SECTIONCONTENT}")
  82. set(TARGET_NAME "example-${NAME}-${MD5_SECTION}")
  83. set(CONTENT "")
  84. foreach(LINE ${SECTIONCONTENT})
  85. if(LINE MATCHES "^ ")
  86. string(SUBSTRING ${LINE} "4" "-1" OUTPUT_LINE)
  87. list(APPEND CONTENT ${OUTPUT_LINE})
  88. endif()
  89. endforeach()
  90. string(REPLACE ";" "\n" CONTENT "${CONTENT}")
  91. string(REPLACE "$$__semicolon__$$" ";" CONTENT "${CONTENT}")
  92. if(NOT CONTENT MATCHES "int main")
  93. string(APPEND CONTENT "int main() {}")
  94. endif()
  95. message(STATUS "Adding example: ${TARGET_NAME}")
  96. bcm_add_test(NAME ${TARGET_NAME} CONTENT "${CONTENT}\n")
  97. endfunction()
  98. function(extract_example SOURCE)
  99. extract_doc(${SOURCE} CONTENT)
  100. string(REPLACE ";" "$$__semicolon__$$" CONTENT "${CONTENT}")
  101. string(REPLACE "\n" ";" CONTENT "${CONTENT}")
  102. get_filename_component(BASE_NAME ${SOURCE} NAME_WE)
  103. set(SECTION "")
  104. set(PREVLINE "")
  105. set(APPEND_SECTION Off)
  106. foreach(LINE ${CONTENT})
  107. if(APPEND_SECTION)
  108. if((LINE MATCHES "^---") OR (LINE MATCHES "^==="))
  109. build_example("${SECTION}" ${BASE_NAME})
  110. set(APPEND_SECTION Off)
  111. set(SECTION "")
  112. elseif(NOT PREVLINE MATCHES "^---")
  113. list(APPEND SECTION ${PREVLINE})
  114. endif()
  115. else()
  116. if((LINE MATCHES "^---") AND (PREVLINE MATCHES "^Example"))
  117. set(APPEND_SECTION One)
  118. endif()
  119. endif()
  120. set(PREVLINE "${LINE}")
  121. endforeach()
  122. list(APPEND SECTION ${PREVLINE})
  123. if(APPEND_SECTION)
  124. build_example("${SECTION}" ${BASE_NAME})
  125. endif()
  126. endfunction()
  127. set(BUILD_EXAMPLES off CACHE BOOL "Set this to build the examples")
  128. if (BUILD_EXAMPLES)
  129. file(GLOB EXAMPLES example/*.cpp)
  130. foreach(EXAMPLE ${EXAMPLES})
  131. get_filename_component(BASE_NAME ${EXAMPLE} NAME_WE)
  132. bcm_add_test(NAME example-${BASE_NAME} SOURCES ${EXAMPLE})
  133. endforeach()
  134. foreach(HEADER ${HEADERS})
  135. extract_example(${HEADER})
  136. endforeach()
  137. endif()