CMakeLists.txt 4.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. # Copyright Louis Dionne 2013-2017
  2. # Distributed under the Boost Software License, Version 1.0.
  3. # (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  4. ##############################################################################
  5. # Required packages, gems and caveats
  6. ##############################################################################
  7. find_package(Ruby 2.1)
  8. if(NOT ${RUBY_FOUND})
  9. message(WARNING "Ruby >= 2.1 was not found; the benchmarks will be unavailable.")
  10. return()
  11. endif()
  12. # Check for the 'ruby-progressbar' and 'tilt' gems
  13. execute_process(COMMAND ${RUBY_EXECUTABLE} -r ruby-progressbar -r tilt -e ""
  14. RESULT_VARIABLE __BOOST_HANA_MISSING_GEMS
  15. OUTPUT_QUIET ERROR_QUIET)
  16. if(${__BOOST_HANA_MISSING_GEMS})
  17. message(WARNING
  18. "The 'ruby-progressbar' and/or 'tilt' gems were not found; "
  19. "the benchmarks will be unavailable."
  20. "Use `gem install ruby-progressbar tilt` to install the missing gems.")
  21. return()
  22. endif()
  23. # Some benchmarks depend on those libraries
  24. find_package(MPL11)
  25. find_package(Meta)
  26. include(CheckCXXCompilerFlag)
  27. check_cxx_compiler_flag(-ftemplate-depth=-1 BOOST_HANA_HAS_FTEMPLATE_DEPTH)
  28. ##############################################################################
  29. # Configure the measure.rb script
  30. ##############################################################################
  31. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/measure.in.rb #input
  32. ${CMAKE_CURRENT_BINARY_DIR}/measure.rb #output
  33. @ONLY)
  34. ##############################################################################
  35. # Add the benchmarks
  36. ##############################################################################
  37. add_custom_target(benchmarks COMMENT "Generate all the benchmarks.")
  38. add_custom_target(travis_compiler_slug USES_TERMINAL
  39. COMMAND ${CMAKE_COMMAND} -E echo "travis_compiler_slug: $<LOWER_CASE:${CMAKE_CXX_COMPILER_ID}-${CMAKE_CXX_COMPILER_VERSION}>")
  40. add_custom_target(travis_config_slug USES_TERMINAL
  41. COMMAND ${CMAKE_COMMAND} -E echo "travis_config_slug: $<LOWER_CASE:$<CONFIG>>")
  42. file(GLOB_RECURSE BOOST_HANA_BENCHMARKS *.erb.json)
  43. foreach(benchmark IN LISTS BOOST_HANA_BENCHMARKS)
  44. boost_hana_target_name_for(target ${benchmark} ".erb.json")
  45. get_filename_component(directory "${benchmark}" DIRECTORY)
  46. file(GLOB cpp_files "${directory}/*.erb.cpp")
  47. configure_file("${benchmark}" "${CMAKE_CURRENT_BINARY_DIR}/${target}.erb.json" @ONLY)
  48. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${target}.measure.cpp" "")
  49. add_executable(${target}.measure EXCLUDE_FROM_ALL "${CMAKE_CURRENT_BINARY_DIR}/${target}.measure.cpp")
  50. target_include_directories(${target}.measure PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
  51. if (MPL11_FOUND)
  52. target_include_directories(${target}.measure PRIVATE "${MPL11_INCLUDE_DIR}")
  53. endif()
  54. if (Meta_FOUND)
  55. target_include_directories(${target}.measure PRIVATE "${Meta_INCLUDE_DIR}")
  56. endif()
  57. if (Boost_FOUND)
  58. target_link_libraries(${target}.measure PRIVATE Boost::boost)
  59. endif()
  60. boost_hana_set_test_properties(${target}.measure)
  61. if (BOOST_HANA_HAS_FTEMPLATE_DEPTH)
  62. target_compile_options(${target}.measure PRIVATE -ftemplate-depth=-1)
  63. endif()
  64. set_target_properties(${target}.measure PROPERTIES RULE_LAUNCH_COMPILE "${CMAKE_CURRENT_BINARY_DIR}/measure.rb")
  65. set_property(TARGET ${target}.measure APPEND PROPERTY INCLUDE_DIRECTORIES "${directory}")
  66. add_custom_target(${target}.measure.run COMMAND ${target}.measure)
  67. add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${target}.json"
  68. COMMAND ${RUBY_EXECUTABLE} -r tilt -r "${CMAKE_CURRENT_BINARY_DIR}/measure.rb"
  69. -e "MEASURE_FILE = '${CMAKE_CURRENT_BINARY_DIR}/${target}.measure.cpp'"
  70. -e "MEASURE_TARGET = '${target}.measure'"
  71. -e "json = Tilt::ERBTemplate.new('${CMAKE_CURRENT_BINARY_DIR}/${target}.erb.json').render"
  72. -e "File.open('${CMAKE_CURRENT_BINARY_DIR}/${target}.json', 'w') { |f| f.write(json) } "
  73. WORKING_DIRECTORY ${directory}
  74. DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${target}.erb.json" ${cpp_files}
  75. VERBATIM USES_TERMINAL
  76. COMMENT "Generating dataset for ${target}"
  77. )
  78. add_custom_target(${target} DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${target}.json")
  79. add_dependencies(benchmarks ${target})
  80. endforeach()