| cmake_minimum_required(VERSION 3.3) |
| |
| # If we are using the Ninja generator, we can check and verify that the |
| # USES_TERMINAL option actually works by examining the Ninja build file. |
| # This is the only way, since CMake doesn't offer a way to examine the |
| # options on a custom command after it has been added. Furthermore, |
| # there isn't an easy way to test for this by actually running Ninja. |
| # |
| # Other generators don't currently support USES_TERMINAL at this time. |
| # This file can be improved to support them if they do. Until then, we |
| # simply assume success for new generator types. |
| # |
| # For Ninja, there is a complication. If the Ninja generator detects a |
| # version of Ninja < 1.5, it won't actually emit the console pool command, |
| # because those Ninja versions don't yet support the console pool. In |
| # that case, we also have to assume success. |
| |
| # Check Ninja build output to verify whether or not a target step is in the |
| # console pool. |
| macro(CheckNinjaStep _target _step _require) |
| if("${_build}" MATCHES |
| " DESC = Performing ${_step} step for '${_target}' |
| pool = console" |
| ) |
| if(NOT ${_require}) |
| set(RunCMake_TEST_FAILED "${_target} ${_step} step is in console pool") |
| return() |
| endif() |
| else() |
| if(${_require}) |
| set(RunCMake_TEST_FAILED "${_target} ${_step} step not in console pool") |
| return() |
| endif() |
| endif() |
| endmacro() |
| |
| # Check Ninja build output to verify whether each target step is in the |
| # console pool. |
| macro(CheckNinjaTarget _target |
| _download _update _configure _build _test _install |
| ) |
| CheckNinjaStep(${_target} download ${_download}) |
| CheckNinjaStep(${_target} update ${_update}) |
| CheckNinjaStep(${_target} configure ${_configure}) |
| CheckNinjaStep(${_target} build ${_build}) |
| CheckNinjaStep(${_target} test ${_test}) |
| CheckNinjaStep(${_target} install ${_install}) |
| endmacro() |
| |
| # Load build/make file, depending on generator |
| if(RunCMake_GENERATOR STREQUAL Ninja) |
| # Check the Ninja version. If < 1.5, console pool isn't supported and |
| # so the generator would not emit console pool usage. That would cause |
| # this test to fail. |
| execute_process(COMMAND ${RunCMake_MAKE_PROGRAM} --version |
| RESULT_VARIABLE _version_result |
| OUTPUT_VARIABLE _version |
| ERROR_QUIET |
| OUTPUT_STRIP_TRAILING_WHITESPACE |
| ) |
| if(_version_result OR _version VERSION_EQUAL "0") |
| set(RunCMake_TEST_FAILED "Failed to get Ninja version") |
| return() |
| endif() |
| if(_version VERSION_LESS "1.5") |
| return() # console pool not supported on Ninja < 1.5 |
| endif() |
| |
| # Read the Ninja build file |
| set(_build_file "${RunCMake_TEST_BINARY_DIR}/build.ninja") |
| |
| if(NOT EXISTS "${_build_file}") |
| set(RunCMake_TEST_FAILED "Ninja build file not created") |
| return() |
| endif() |
| |
| file(READ "${_build_file}" _build) |
| |
| set(_target_check_macro CheckNinjaTarget) |
| elseif((RunCMake_GENERATOR STREQUAL "") OR NOT DEFINED RunCMake_GENERATOR) |
| # protection in case somebody renamed RunCMake_GENERATOR |
| set(RunCMake_TEST_FAILED "Unknown generator") |
| return() |
| else() |
| # We don't yet know how to test USES_TERMINAL on this generator. |
| return() |
| endif() |
| |
| # Actual tests: |
| CheckNinjaTarget(TerminalTest1 |
| true true true true true true ) |
| CheckNinjaTarget(TerminalTest2 |
| true false true false true false) |
| CheckNinjaTarget(TerminalTest3 |
| false true false true false true ) |
| CheckNinjaTarget(TerminalTest4 |
| false false false false false false) |