98 lines
3.3 KiB
CMake
98 lines
3.3 KiB
CMake
|
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)
|