blob: 19f17223ec3bc1851f129378f191129ae0f2b74f [file] [log] [blame]
include(CMakeParseArguments)
function(precondition var)
cmake_parse_arguments(
PRECONDITION # prefix
"NEGATE" # options
"MESSAGE" # single-value args
"" # multi-value args
${ARGN})
if (PRECONDITION_NEGATE)
if (${var})
if (PRECONDITION_MESSAGE)
message(FATAL_ERROR "Error! ${PRECONDITION_MESSAGE}")
else()
message(FATAL_ERROR "Error! Variable ${var} is true or not empty. The value of ${var} is ${${var}}.")
endif()
endif()
else()
if (NOT ${var})
if (PRECONDITION_MESSAGE)
message(FATAL_ERROR "Error! ${PRECONDITION_MESSAGE}")
else()
message(FATAL_ERROR "Error! Variable ${var} is false, empty or not set.")
endif()
endif()
endif()
endfunction()
# Assert is 'NOT ${LHS} ${OP} ${RHS}' is true.
function(precondition_binary_op OP LHS RHS)
cmake_parse_arguments(
PRECONDITIONBINOP # prefix
"NEGATE" # options
"MESSAGE" # single-value args
"" # multi-value args
${ARGN})
if (PRECONDITIONBINOP_NEGATE)
if (${LHS} ${OP} ${RHS})
if (PRECONDITIONBINOP_MESSAGE)
message(FATAL_ERROR "Error! ${PRECONDITIONBINOP_MESSAGE}")
else()
message(FATAL_ERROR "Error! ${LHS} ${OP} ${RHS} is true!")
endif()
endif()
else()
if (NOT ${LHS} ${OP} ${RHS})
if (PRECONDITIONBINOP_MESSAGE)
message(FATAL_ERROR "Error! ${PRECONDITIONBINOP_MESSAGE}")
else()
message(FATAL_ERROR "Error! ${LHS} ${OP} ${RHS} is false!")
endif()
endif()
endif()
endfunction()
# Translate a yes/no variable to the presence of a given string in a
# variable.
#
# Usage:
# translate_flag(is_set flag_name var_name)
#
# If is_set is true, sets ${var_name} to ${flag_name}. Otherwise,
# unsets ${var_name}.
function(translate_flag is_set flag_name var_name)
if(${is_set})
set("${var_name}" "${flag_name}" PARENT_SCOPE)
else()
set("${var_name}" "" PARENT_SCOPE)
endif()
endfunction()
macro(translate_flags prefix options)
foreach(var ${options})
translate_flag("${${prefix}_${var}}" "${var}" "${prefix}_${var}_keyword")
endforeach()
endmacro()
# Set ${outvar} to ${${invar}}, asserting if ${invar} is not set.
function(precondition_translate_flag invar outvar)
precondition(${invar})
set(${outvar} "${${invar}}" PARENT_SCOPE)
endfunction()
function(is_build_type_optimized build_type result_var_name)
if("${build_type}" STREQUAL "Debug")
set("${result_var_name}" FALSE PARENT_SCOPE)
elseif("${build_type}" STREQUAL "RelWithDebInfo" OR
"${build_type}" STREQUAL "Release" OR
"${build_type}" STREQUAL "MinSizeRel")
set("${result_var_name}" TRUE PARENT_SCOPE)
else()
message(FATAL_ERROR "Unknown build type: ${build_type}")
endif()
endfunction()
function(is_build_type_with_debuginfo build_type result_var_name)
if("${build_type}" STREQUAL "Debug" OR
"${build_type}" STREQUAL "RelWithDebInfo")
set("${result_var_name}" TRUE PARENT_SCOPE)
elseif("${build_type}" STREQUAL "Release" OR
"${build_type}" STREQUAL "MinSizeRel")
set("${result_var_name}" FALSE PARENT_SCOPE)
else()
message(FATAL_ERROR "Unknown build type: ${build_type}")
endif()
endfunction()
# Set variable to value if value is not null or false. Otherwise set variable to
# default_value.
function(set_with_default variable value)
cmake_parse_argument(
SWD
""
"DEFAULT"
"" ${ARGN})
precondition(SWD_DEFAULT
MESSAGE "Must specify a default argument")
if (value)
set(${variable} ${value} PARENT_SCOPE)
else()
set(${variable} ${SWD_DEFAULT} PARENT_SCOPE)
endif()
endfunction()
function(swift_create_post_build_symlink target)
set(options IS_DIRECTORY)
set(oneValueArgs SOURCE DESTINATION WORKING_DIRECTORY COMMENT)
cmake_parse_arguments(CS
"${options}"
"${oneValueArgs}"
""
${ARGN})
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
if(CS_IS_DIRECTORY)
set(cmake_symlink_option "copy_directory")
else()
set(cmake_symlink_option "copy_if_different")
endif()
else()
set(cmake_symlink_option "create_symlink")
endif()
add_custom_command(TARGET "${target}" POST_BUILD
COMMAND
"${CMAKE_COMMAND}" "-E" "${cmake_symlink_option}"
"${CS_SOURCE}"
"${CS_DESTINATION}"
WORKING_DIRECTORY "${CS_WORKING_DIRECTORY}"
COMMENT "${CS_COMMENT}")
endfunction()
function(dump_swift_vars)
set(SWIFT_STDLIB_GLOBAL_CMAKE_CACHE)
get_cmake_property(variableNames VARIABLES)
foreach(variableName ${variableNames})
if(variableName MATCHES "^SWIFT")
set(SWIFT_STDLIB_GLOBAL_CMAKE_CACHE "${SWIFT_STDLIB_GLOBAL_CMAKE_CACHE}set(${variableName} \"${${variableName}}\")\n")
message("set(${variableName} \"${${variableName}}\")")
endif()
endforeach()
endfunction()
function(is_sdk_requested name result_var_name)
if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "${name}")
set("${result_var_name}" "TRUE" PARENT_SCOPE)
else()
if("${name}" IN_LIST SWIFT_SDKS)
set("${result_var_name}" "TRUE" PARENT_SCOPE)
else()
set("${result_var_name}" "FALSE" PARENT_SCOPE)
endif()
endif()
endfunction()