| macro(add_to_alloptions _NEWNAME) |
| list(APPEND ALLOPTIONS ${_NEWNAME}) |
| string(LENGTH ${_NEWNAME} _SLEN) |
| if(${LONGESTOPTIONNAME} LESS ${_SLEN}) |
| set(LONGESTOPTIONNAME ${_SLEN}) |
| endif() |
| endmacro() |
| |
| macro(set_option _NAME _DESC) |
| add_to_alloptions(${_NAME}) |
| if(${ARGC} EQUAL 3) |
| set(_DEFLT ${ARGV2}) |
| else() |
| set(_DEFLT OFF) |
| endif() |
| option(${_NAME} ${_DESC} ${_DEFLT}) |
| endmacro() |
| |
| macro(dep_option _NAME _DESC _DEFLT _DEPTEST _FAILDFLT) |
| add_to_alloptions("${_NAME}") |
| cmake_dependent_option("${_NAME}" "${_DESC}" "${_DEFLT}" "${_DEPTEST}" "${_FAILDFLT}") |
| endmacro() |
| |
| macro(option_string _NAME _DESC _VALUE) |
| add_to_alloptions(${_NAME}) |
| set(${_NAME} ${_VALUE} CACHE STRING "${_DESC}") |
| set(HAVE_${_NAME} ${_VALUE}) |
| ENDMACRO() |
| |
| # Message Output |
| macro(message_warn _TEXT) |
| message(WARNING "${_TEXT}") |
| endmacro() |
| |
| macro(message_error _TEXT) |
| message(FATAL_ERROR "*** ERROR: ${_TEXT}") |
| endmacro() |
| |
| macro(message_bool_option _NAME _VALUE) |
| set(_PAD "\t") |
| if(${ARGC} EQUAL 3) |
| set(_PAD ${ARGV2}) |
| endif() |
| if(${_VALUE}) |
| message(STATUS " ${_NAME}:${_PAD}ON") |
| else() |
| message(STATUS " ${_NAME}:${_PAD}OFF") |
| endif() |
| endmacro() |
| |
| macro(message_tested_option _NAME) |
| set(_REQVALUE ${${_NAME}}) |
| set(_PAD " ") |
| if(${ARGC} EQUAL 2) |
| set(_PAD ${ARGV1}) |
| endif() |
| string(SUBSTRING "${_NAME}" 0 4 _NAMESTART) |
| if(_NAMESTART STREQUAL "SDL_") |
| string(SUBSTRING "${_NAME}" 4 -1 _STRIPPEDNAME) |
| else() |
| set(_STRIPPEDNAME "${_NAME}") |
| endif() |
| if(NOT HAVE_${_STRIPPEDNAME}) |
| set(HAVE_${_STRIPPEDNAME} OFF) |
| elseif("${HAVE_${_STRIPPEDNAME}}" MATCHES "1|TRUE|YES|Y") |
| set(HAVE_${_STRIPPEDNAME} ON) |
| endif() |
| message(STATUS " ${_NAME}${_PAD}(Wanted: ${_REQVALUE}): ${HAVE_${_STRIPPEDNAME}}") |
| endmacro() |
| |
| function(listtostr LIST OUTPUT) |
| if(${ARGC} EQUAL 3) |
| # prefix for each element |
| set(LPREFIX ${ARGV2}) |
| else() |
| set(LPREFIX "") |
| endif() |
| # Do not use string(REPLACE ";" " ") here to avoid messing up list entries |
| set(res) |
| foreach(ITEM ${${LIST}}) |
| if(ITEM MATCHES "^SHELL:") |
| string(SUBSTRING "${ITEM}" 6 -1 ITEM) |
| endif() |
| if(ITEM) |
| set(res "${res} ${LPREFIX}${ITEM}") |
| endif() |
| endforeach() |
| string(STRIP "${res}" res) |
| set(${OUTPUT} "${res}" PARENT_SCOPE) |
| endfunction() |
| |
| function(find_stringlength_longest_item inList outLength) |
| set(maxLength 0) |
| foreach(item IN LISTS ${inList}) |
| string(LENGTH "${item}" slen) |
| if(slen GREATER maxLength) |
| set(maxLength ${slen}) |
| endif() |
| endforeach() |
| set("${outLength}" ${maxLength} PARENT_SCOPE) |
| endfunction() |
| |
| function(message_dictlist inList) |
| find_stringlength_longest_item(${inList} maxLength) |
| foreach(name IN LISTS ${inList}) |
| # Get the padding |
| string(LENGTH ${name} nameLength) |
| math(EXPR padLength "(${maxLength} + 1) - ${nameLength}") |
| string(RANDOM LENGTH ${padLength} ALPHABET " " padding) |
| message_tested_option(${name} ${padding}) |
| endforeach() |
| endfunction() |
| |
| if(CMAKE_VERSION VERSION_LESS 3.16.0 OR SDL3_SUBPROJECT) |
| # - CMake versions <3.16 do not support the OBJC language |
| # - When SDL is built as a subproject and when the main project does not enable OBJC, |
| # CMake fails due to missing internal CMake variables (CMAKE_OBJC_COMPILE_OBJECT) |
| # (reproduced with CMake 3.24.2) |
| macro(CHECK_OBJC_SOURCE_COMPILES SOURCE VAR) |
| set(PREV_REQUIRED_DEFS "${CMAKE_REQUIRED_DEFINITIONS}") |
| set(CMAKE_REQUIRED_DEFINITIONS "-x objective-c ${PREV_REQUIRED_DEFS}") |
| CHECK_C_SOURCE_COMPILES("${SOURCE}" ${VAR}) |
| set(CMAKE_REQUIRED_DEFINITIONS "${PREV_REQUIRED_DEFS}") |
| endmacro() |
| else() |
| include(CheckOBJCSourceCompiles) |
| if (APPLE) |
| enable_language(OBJC) |
| endif() |
| endif() |
| |
| if(CMAKE_VERSION VERSION_LESS 3.18) |
| function(check_linker_flag LANG FLAG VAR) |
| cmake_push_check_state() |
| list(APPEND CMAKE_REQUIRED_LINK_OPTIONS ${FLAG} ) |
| if(LANG STREQUAL "C") |
| include(CheckCSourceCompiles) |
| check_c_source_compiles("int main(int argc,char*argv[]){(void)argc;(void)argv;return 0;}" ${VAR} FAIL_REGEX "warning") |
| elseif(LANG STREQUAL "CXX") |
| include(CheckCXXSourceCompiles) |
| check_cxx_source_compiles("int main(int argc,char*argv[]){(void)argc;(void)argv;return 0;}" ${VAR} FAIL_REGEX "warning") |
| else() |
| message(FATAL_ERROR "Unsupported language: ${LANG}") |
| endif() |
| cmake_pop_check_state() |
| endfunction() |
| else() |
| cmake_policy(SET CMP0057 NEW) # Support new if() IN_LIST operator. (used inside check_linker_flag, used in CMake 3.18) |
| include(CheckLinkerFlag) |
| endif() |
| |
| if(APPLE) |
| check_language(OBJC) |
| if(NOT CMAKE_OBJC_COMPILER) |
| message(WARNING "Cannot find working OBJC compiler.") |
| endif() |
| endif() |
| |
| if(CMAKE_VERSION VERSION_LESS 3.13.0) |
| macro(target_link_directories _TARGET _SCOPE) |
| link_directories(${ARGN}) |
| endmacro() |
| endif() |