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