| cmake_minimum_required(VERSION 3.18...3.19) | |
| macro(returnOnError errorMsg) | |
| if(NOT "${errorMsg}" STREQUAL "") | |
| set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}\n${errorMsg}" PARENT_SCOPE) | |
| return() | |
| endif() | |
| endmacro() | |
| function(getTargetFlags mainTarget projFlagsVar flagsVar errorVar) | |
| # The flags variables in the project file might span over multiple lines | |
| # so we can't easily read the flags directly from there. Instead, we use | |
| # the xcodebuild -showBuildSettings option to report it on a single line. | |
| execute_process( | |
| COMMAND ${CMAKE_COMMAND} | |
| --build ${RunCMake_TEST_BINARY_DIR} | |
| --target ${mainTarget} | |
| --config Debug | |
| -- | |
| -showBuildSettings | |
| COMMAND grep ${projFlagsVar} | |
| OUTPUT_VARIABLE flagsContents | |
| RESULT_VARIABLE result | |
| ) | |
| if(result) | |
| set(${errorVar} "Failed to get flags for ${mainTarget}: ${result}" PARENT_SCOPE) | |
| else() | |
| unset(${errorVar} PARENT_SCOPE) | |
| endif() | |
| set(${flagsVar} "${flagsContents}" PARENT_SCOPE) | |
| endfunction() | |
| function(checkFlags projFlagsVar mainTarget present absent) | |
| getTargetFlags(${mainTarget} ${projFlagsVar} flags errorMsg) | |
| returnOnError("${errorMsg}") | |
| foreach(linkTo IN LISTS present) | |
| string(REGEX MATCH "${linkTo}" result "${flags}") | |
| if("${result}" STREQUAL "") | |
| string(APPEND RunCMake_TEST_FAILED | |
| "\n${mainTarget} ${projFlagsVar} is missing ${linkTo}" | |
| ) | |
| endif() | |
| endforeach() | |
| foreach(linkTo IN LISTS absent) | |
| string(REGEX MATCH "${linkTo}" result "${flags}") | |
| if(NOT "${result}" STREQUAL "") | |
| string(APPEND RunCMake_TEST_FAILED | |
| "\n${mainTarget} ${projFlagsVar} unexpectedly contains ${linkTo}" | |
| ) | |
| endif() | |
| endforeach() | |
| set(RunCMake_TEST_FAILED ${RunCMake_TEST_FAILED} PARENT_SCOPE) | |
| endfunction() |