diff --git a/cmake/GaudiProjectConfig.cmake b/cmake/GaudiProjectConfig.cmake index 7854b3225acd53b9a07df4197c04ff8c9b1ae3ea..74aa6d281ff56f7a5f1f34c203d7b10736309aef 100644 --- a/cmake/GaudiProjectConfig.cmake +++ b/cmake/GaudiProjectConfig.cmake @@ -41,19 +41,27 @@ option(CMAKE_EXPORT_COMPILE_COMMANDS "Generate compile_commands.json file" ON) # It handles versions strings like "vXrY[pZ[aN]]" and "1.2.3.4" set(GAUDI_VERSION_REGEX "v?([0-9]+)[r.]([0-9]+)([p.]([0-9]+)(([a-z.])([0-9]+))?)?") +# Reset the accumulators GAUDI_RULE_LAUNCH_* in case this is executed multiple times +foreach(_rule COMPILE LINK CUSTOM) + set(GAUDI_RULE_LAUNCH_${_rule}) + set(GAUDI_RULE_LAUNCH_${_rule}_ENV) # holds env to be prepended to command +endforeach() + +# Hooks for modifying the launch rules if (GAUDI_BUILD_PREFIX_CMD) - set(GAUDI_RULE_LAUNCH_COMPILE "${GAUDI_RULE_LAUNCH_COMPILE} ${GAUDI_BUILD_PREFIX_CMD}") + set(GAUDI_RULE_LAUNCH_COMPILE "${GAUDI_BUILD_PREFIX_CMD}") endif() find_program(ccache_cmd NAMES ccache ccache-swig) find_program(distcc_cmd distcc) +find_program(icecc_cmd icecc) set(_clang_format_names) foreach(_clang_version 5.0 4.0 3.9 3.8 3.7) list(APPEND _clang_format_names lcg-clang-format-${_clang_version} clang-format-${_clang_version}) endforeach() list(APPEND _clang_format_names clang-format) find_program(clang_format_cmd NAMES ${_clang_format_names}) -mark_as_advanced(ccache_cmd distcc_cmd clang_format_cmd) +mark_as_advanced(ccache_cmd distcc_cmd icecc_cmd clang_format_cmd) if(ccache_cmd) option(CMAKE_USE_CCACHE "Use ccache to speed up compilation." OFF) @@ -63,16 +71,29 @@ if(ccache_cmd) endif() endif() +set(_distributed_compiler) if(distcc_cmd) option(CMAKE_USE_DISTCC "Use distcc to speed up compilation." OFF) if(CMAKE_USE_DISTCC) - if(CMAKE_USE_CCACHE) - set(GAUDI_RULE_LAUNCH_COMPILE "${GAUDI_RULE_LAUNCH_COMPILE} CCACHE_PREFIX=${distcc_cmd} ${ccache_cmd}") - message(STATUS "Enabling distcc builds in ccache") - else() - set(GAUDI_RULE_LAUNCH_COMPILE "${GAUDI_RULE_LAUNCH_COMPILE} ${distcc_cmd}") - message(STATUS "Using distcc for building") + set(_distributed_compiler distcc) + endif() +endif() +if(icecc_cmd) + option(CMAKE_USE_ICECC "Use icecc to speed up compilation." OFF) + if(CMAKE_USE_ICECC) + if(_distributed_compiler) + message(FATAL_ERROR "Cannot use multiple distributed compilers at the same time") endif() + set(_distributed_compiler icecc) + endif() +endif() +if(_distributed_compiler) + if(CMAKE_USE_CCACHE) + set(GAUDI_RULE_LAUNCH_COMPILE_ENV "${GAUDI_RULE_LAUNCH_COMPILE_ENV} CCACHE_PREFIX=${_distributed_compiler}") + message(STATUS "Enabling ${_distributed_compiler} builds in ccache") + else() + set(GAUDI_RULE_LAUNCH_COMPILE "${GAUDI_RULE_LAUNCH_COMPILE} ${_distributed_compiler}") + message(STATUS "Using ${_distributed_compiler} for building") endif() endif() @@ -107,13 +128,16 @@ if(GAUDI_USE_CTEST_LAUNCHERS) endif() set(GAUDI_RULE_LAUNCH_COMPILE - "CTEST_LAUNCH_LOGS=${CMAKE_BINARY_DIR}/launch_logs \"${CMAKE_CTEST_COMMAND}\" --launch ${__launch_compile_options} -- ${GAUDI_RULE_LAUNCH_COMPILE}") + "\"${CMAKE_CTEST_COMMAND}\" --launch ${__launch_compile_options} -- ${GAUDI_RULE_LAUNCH_COMPILE}") + set(GAUDI_RULE_LAUNCH_COMPILE_ENV "${GAUDI_RULE_LAUNCH_COMPILE_ENV} CTEST_LAUNCH_LOGS=${CMAKE_BINARY_DIR}/launch_logs") set(GAUDI_RULE_LAUNCH_LINK - "CTEST_LAUNCH_LOGS=${CMAKE_BINARY_DIR}/launch_logs \"${CMAKE_CTEST_COMMAND}\" --launch ${__launch_link_options} -- ${GAUDI_RULE_LAUNCH_LINK}") + "\"${CMAKE_CTEST_COMMAND}\" --launch ${__launch_link_options} -- ${GAUDI_RULE_LAUNCH_LINK}") + set(GAUDI_RULE_LAUNCH_LINK_ENV "${GAUDI_RULE_LAUNCH_LINK_ENV} CTEST_LAUNCH_LOGS=${CMAKE_BINARY_DIR}/launch_logs") set(GAUDI_RULE_LAUNCH_CUSTOM - "CTEST_LAUNCH_LOGS=${CMAKE_BINARY_DIR}/launch_logs \"${CMAKE_CTEST_COMMAND}\" --launch ${__launch_custom_options} -- ${GAUDI_RULE_LAUNCH_CUSTOM}") + "\"${CMAKE_CTEST_COMMAND}\" --launch ${__launch_custom_options} -- ${GAUDI_RULE_LAUNCH_CUSTOM}") + set(GAUDI_RULE_LAUNCH_CUSTOM_ENV "${GAUDI_RULE_LAUNCH_CUSTOM_ENV} CTEST_LAUNCH_LOGS=${CMAKE_BINARY_DIR}/launch_logs") if("${CMAKE_GENERATOR}" MATCHES "Make") set(GAUDI_RULE_LAUNCH_LINK "env ${GAUDI_RULE_LAUNCH_LINK}") @@ -124,8 +148,9 @@ endif() foreach(_rule COMPILE LINK CUSTOM) if(GAUDI_RULE_LAUNCH_${_rule}) string(STRIP "${GAUDI_RULE_LAUNCH_${_rule}}" GAUDI_RULE_LAUNCH_${_rule}) - set_property(GLOBAL PROPERTY RULE_LAUNCH_${_rule} "${GAUDI_RULE_LAUNCH_${_rule}}") - message(STATUS "Prefix ${_rule} commands with '${GAUDI_RULE_LAUNCH_${_rule}}'") + set_property(GLOBAL PROPERTY RULE_LAUNCH_${_rule} + "${GAUDI_RULE_LAUNCH_${_rule}_ENV} ${GAUDI_RULE_LAUNCH_${_rule}}") + message(STATUS "Prefix ${_rule} commands with '${GAUDI_RULE_LAUNCH_${_rule}_ENV} ${GAUDI_RULE_LAUNCH_${_rule}}'") endif() endforeach()