• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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