179c2e3e6Spatrick# HandleLibcxxFlags - A set of macros used to setup the flags used to compile 279c2e3e6Spatrick# and link libc++abi. These macros add flags to the following CMake variables. 379c2e3e6Spatrick# - LIBCXXABI_COMPILE_FLAGS: flags used to compile libc++abi 479c2e3e6Spatrick# - LIBCXXABI_LINK_FLAGS: flags used to link libc++abi 579c2e3e6Spatrick# - LIBCXXABI_LIBRARIES: libraries to link libc++abi to. 679c2e3e6Spatrick 779c2e3e6Spatrickinclude(CheckCXXCompilerFlag) 879c2e3e6Spatrick 979c2e3e6Spatrickunset(add_flag_if_supported) 1079c2e3e6Spatrick 1179c2e3e6Spatrick# Mangle the name of a compiler flag into a valid CMake identifier. 1279c2e3e6Spatrick# Ex: --std=c++11 -> STD_EQ_CXX11 1379c2e3e6Spatrickmacro(mangle_name str output) 1479c2e3e6Spatrick string(STRIP "${str}" strippedStr) 1579c2e3e6Spatrick string(REGEX REPLACE "^/" "" strippedStr "${strippedStr}") 1679c2e3e6Spatrick string(REGEX REPLACE "^-+" "" strippedStr "${strippedStr}") 1779c2e3e6Spatrick string(REGEX REPLACE "-+$" "" strippedStr "${strippedStr}") 1879c2e3e6Spatrick string(REPLACE "-" "_" strippedStr "${strippedStr}") 1979c2e3e6Spatrick string(REPLACE "=" "_EQ_" strippedStr "${strippedStr}") 2079c2e3e6Spatrick string(REPLACE "+" "X" strippedStr "${strippedStr}") 2179c2e3e6Spatrick string(TOUPPER "${strippedStr}" ${output}) 2279c2e3e6Spatrickendmacro() 2379c2e3e6Spatrick 2479c2e3e6Spatrick# Remove a list of flags from all CMake variables that affect compile flags. 2579c2e3e6Spatrick# This can be used to remove unwanted flags specified on the command line 2679c2e3e6Spatrick# or added in other parts of LLVM's cmake configuration. 2779c2e3e6Spatrickmacro(remove_flags) 2879c2e3e6Spatrick foreach(var ${ARGN}) 2979c2e3e6Spatrick string(REPLACE "${var}" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") 3079c2e3e6Spatrick string(REPLACE "${var}" "" CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}") 3179c2e3e6Spatrick string(REPLACE "${var}" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") 3279c2e3e6Spatrick string(REPLACE "${var}" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") 3379c2e3e6Spatrick string(REPLACE "${var}" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 3479c2e3e6Spatrick string(REPLACE "${var}" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") 3579c2e3e6Spatrick string(REPLACE "${var}" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") 3679c2e3e6Spatrick string(REPLACE "${var}" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") 3779c2e3e6Spatrick string(REPLACE "${var}" "" CMAKE_SHARED_MODULE_FLAGS "${CMAKE_SHARED_MODULE_FLAGS}") 3879c2e3e6Spatrick remove_definitions(${var}) 3979c2e3e6Spatrick endforeach() 4079c2e3e6Spatrickendmacro(remove_flags) 4179c2e3e6Spatrick 4279c2e3e6Spatrickmacro(check_flag_supported flag) 4379c2e3e6Spatrick mangle_name("${flag}" flagname) 44*8f1d5724Srobert check_cxx_compiler_flag("${flag}" "CXX_SUPPORTS_${flagname}_FLAG") 4579c2e3e6Spatrickendmacro() 4679c2e3e6Spatrick 4779c2e3e6Spatrickmacro(append_flags DEST) 4879c2e3e6Spatrick foreach(value ${ARGN}) 4979c2e3e6Spatrick list(APPEND ${DEST} ${value}) 5079c2e3e6Spatrick list(APPEND ${DEST} ${value}) 5179c2e3e6Spatrick endforeach() 5279c2e3e6Spatrickendmacro() 5379c2e3e6Spatrick 5479c2e3e6Spatrick# If the specified 'condition' is true then append the specified list of flags to DEST 5579c2e3e6Spatrickmacro(append_flags_if condition DEST) 5679c2e3e6Spatrick if (${condition}) 5779c2e3e6Spatrick list(APPEND ${DEST} ${ARGN}) 5879c2e3e6Spatrick endif() 5979c2e3e6Spatrickendmacro() 6079c2e3e6Spatrick 6179c2e3e6Spatrick# Add each flag in the list specified by DEST if that flag is supported by the current compiler. 6279c2e3e6Spatrickmacro(append_flags_if_supported DEST) 6379c2e3e6Spatrick foreach(flag ${ARGN}) 6479c2e3e6Spatrick mangle_name("${flag}" flagname) 65*8f1d5724Srobert check_cxx_compiler_flag("${flag}" "CXX_SUPPORTS_${flagname}_FLAG") 66*8f1d5724Srobert append_flags_if(CXX_SUPPORTS_${flagname}_FLAG ${DEST} ${flag}) 6779c2e3e6Spatrick endforeach() 6879c2e3e6Spatrickendmacro() 6979c2e3e6Spatrick 7079c2e3e6Spatrick# Add a macro definition if condition is true. 7179c2e3e6Spatrickmacro(define_if condition def) 7279c2e3e6Spatrick if (${condition}) 7379c2e3e6Spatrick add_definitions(${def}) 7479c2e3e6Spatrick endif() 7579c2e3e6Spatrickendmacro() 7679c2e3e6Spatrick 7779c2e3e6Spatrick# Add a macro definition if condition is not true. 7879c2e3e6Spatrickmacro(define_if_not condition def) 7979c2e3e6Spatrick if (NOT ${condition}) 8079c2e3e6Spatrick add_definitions(${def}) 8179c2e3e6Spatrick endif() 8279c2e3e6Spatrickendmacro() 8379c2e3e6Spatrick 8479c2e3e6Spatrick# Add a macro definition to the __config_site file if the specified condition 8579c2e3e6Spatrick# is 'true'. Note that '-D${def}' is not added. Instead it is expected that 8679c2e3e6Spatrick# the build include the '__config_site' header. 8779c2e3e6Spatrickmacro(config_define_if condition def) 8879c2e3e6Spatrick if (${condition}) 8979c2e3e6Spatrick set(${def} ON) 9079c2e3e6Spatrick set(LIBCXXABI_NEEDS_SITE_CONFIG ON) 9179c2e3e6Spatrick endif() 9279c2e3e6Spatrickendmacro() 9379c2e3e6Spatrick 9479c2e3e6Spatrickmacro(config_define_if_not condition def) 9579c2e3e6Spatrick if (NOT ${condition}) 9679c2e3e6Spatrick set(${def} ON) 9779c2e3e6Spatrick set(LIBCXXABI_NEEDS_SITE_CONFIG ON) 9879c2e3e6Spatrick endif() 9979c2e3e6Spatrickendmacro() 10079c2e3e6Spatrick 10179c2e3e6Spatrickmacro(config_define value def) 10279c2e3e6Spatrick set(${def} ${value}) 10379c2e3e6Spatrick set(LIBCXXABI_NEEDS_SITE_CONFIG ON) 10479c2e3e6Spatrickendmacro() 10579c2e3e6Spatrick 10679c2e3e6Spatrick# Add a list of flags to all of 'CMAKE_CXX_FLAGS', 'CMAKE_C_FLAGS', 10779c2e3e6Spatrick# 'LIBCXXABI_COMPILE_FLAGS' and 'LIBCXXABI_LINK_FLAGS'. 10879c2e3e6Spatrickmacro(add_target_flags) 10979c2e3e6Spatrick foreach(value ${ARGN}) 11079c2e3e6Spatrick set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${value}") 11179c2e3e6Spatrick set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${value}") 11279c2e3e6Spatrick list(APPEND LIBCXXABI_COMPILE_FLAGS ${value}) 11379c2e3e6Spatrick list(APPEND LIBCXXABI_LINK_FLAGS ${value}) 11479c2e3e6Spatrick endforeach() 11579c2e3e6Spatrickendmacro() 11679c2e3e6Spatrick 11779c2e3e6Spatrick# If the specified 'condition' is true then add a list of flags to 11879c2e3e6Spatrick# all of 'CMAKE_CXX_FLAGS', 'CMAKE_C_FLAGS', 'LIBCXXABI_COMPILE_FLAGS' 11979c2e3e6Spatrick# and 'LIBCXXABI_LINK_FLAGS'. 12079c2e3e6Spatrickmacro(add_target_flags_if condition) 12179c2e3e6Spatrick if (${condition}) 12279c2e3e6Spatrick add_target_flags(${ARGN}) 12379c2e3e6Spatrick endif() 12479c2e3e6Spatrickendmacro() 12579c2e3e6Spatrick 1264e0cc08cSpatrick# Add all the flags supported by the compiler to all of 1274e0cc08cSpatrick# 'CMAKE_CXX_FLAGS', 'CMAKE_C_FLAGS', 'LIBCXXABI_COMPILE_FLAGS' 1284e0cc08cSpatrick# and 'LIBCXXABI_LINK_FLAGS'. 1294e0cc08cSpatrickmacro(add_target_flags_if_supported) 1304e0cc08cSpatrick foreach(flag ${ARGN}) 1314e0cc08cSpatrick mangle_name("${flag}" flagname) 132*8f1d5724Srobert check_cxx_compiler_flag("${flag}" "CXX_SUPPORTS_${flagname}_FLAG") 133*8f1d5724Srobert add_target_flags_if(CXX_SUPPORTS_${flagname}_FLAG ${flag}) 1344e0cc08cSpatrick endforeach() 1354e0cc08cSpatrickendmacro() 1364e0cc08cSpatrick 13779c2e3e6Spatrick# Add a specified list of flags to both 'LIBCXXABI_COMPILE_FLAGS' and 13879c2e3e6Spatrick# 'LIBCXXABI_LINK_FLAGS'. 13979c2e3e6Spatrickmacro(add_flags) 14079c2e3e6Spatrick foreach(value ${ARGN}) 14179c2e3e6Spatrick list(APPEND LIBCXXABI_COMPILE_FLAGS ${value}) 14279c2e3e6Spatrick list(APPEND LIBCXXABI_LINK_FLAGS ${value}) 14379c2e3e6Spatrick endforeach() 14479c2e3e6Spatrickendmacro() 14579c2e3e6Spatrick 14679c2e3e6Spatrick# If the specified 'condition' is true then add a list of flags to both 14779c2e3e6Spatrick# 'LIBCXXABI_COMPILE_FLAGS' and 'LIBCXXABI_LINK_FLAGS'. 14879c2e3e6Spatrickmacro(add_flags_if condition) 14979c2e3e6Spatrick if (${condition}) 15079c2e3e6Spatrick add_flags(${ARGN}) 15179c2e3e6Spatrick endif() 15279c2e3e6Spatrickendmacro() 15379c2e3e6Spatrick 15479c2e3e6Spatrick# Add each flag in the list to LIBCXXABI_COMPILE_FLAGS and LIBCXXABI_LINK_FLAGS 15579c2e3e6Spatrick# if that flag is supported by the current compiler. 15679c2e3e6Spatrickmacro(add_flags_if_supported) 15779c2e3e6Spatrick foreach(flag ${ARGN}) 15879c2e3e6Spatrick mangle_name("${flag}" flagname) 159*8f1d5724Srobert check_cxx_compiler_flag("${flag}" "CXX_SUPPORTS_${flagname}_FLAG") 160*8f1d5724Srobert add_flags_if(CXX_SUPPORTS_${flagname}_FLAG ${flag}) 16179c2e3e6Spatrick endforeach() 16279c2e3e6Spatrickendmacro() 16379c2e3e6Spatrick 16479c2e3e6Spatrick# Add a list of flags to 'LIBCXXABI_COMPILE_FLAGS'. 16579c2e3e6Spatrickmacro(add_compile_flags) 16679c2e3e6Spatrick foreach(f ${ARGN}) 16779c2e3e6Spatrick list(APPEND LIBCXXABI_COMPILE_FLAGS ${f}) 16879c2e3e6Spatrick endforeach() 16979c2e3e6Spatrickendmacro() 17079c2e3e6Spatrick 17179c2e3e6Spatrick# If 'condition' is true then add the specified list of flags to 17279c2e3e6Spatrick# 'LIBCXXABI_COMPILE_FLAGS' 17379c2e3e6Spatrickmacro(add_compile_flags_if condition) 17479c2e3e6Spatrick if (${condition}) 17579c2e3e6Spatrick add_compile_flags(${ARGN}) 17679c2e3e6Spatrick endif() 17779c2e3e6Spatrickendmacro() 17879c2e3e6Spatrick 17979c2e3e6Spatrick# For each specified flag, add that flag to 'LIBCXXABI_COMPILE_FLAGS' if the 18079c2e3e6Spatrick# flag is supported by the C++ compiler. 18179c2e3e6Spatrickmacro(add_compile_flags_if_supported) 18279c2e3e6Spatrick foreach(flag ${ARGN}) 18379c2e3e6Spatrick mangle_name("${flag}" flagname) 184*8f1d5724Srobert check_cxx_compiler_flag("${flag}" "CXX_SUPPORTS_${flagname}_FLAG") 185*8f1d5724Srobert add_compile_flags_if(CXX_SUPPORTS_${flagname}_FLAG ${flag}) 18679c2e3e6Spatrick endforeach() 18779c2e3e6Spatrickendmacro() 18879c2e3e6Spatrick 18979c2e3e6Spatrick# For each specified flag, add that flag to 'LIBCXXABI_COMPILE_FLAGS' if the 19079c2e3e6Spatrick# flag is supported by the C compiler. 19179c2e3e6Spatrickmacro(add_c_compile_flags_if_supported) 19279c2e3e6Spatrick foreach(flag ${ARGN}) 19379c2e3e6Spatrick mangle_name("${flag}" flagname) 194*8f1d5724Srobert check_c_compiler_flag("${flag}" "C_SUPPORTS_${flagname}_FLAG") 195*8f1d5724Srobert add_compile_flags_if(C_SUPPORTS_${flagname}_FLAG ${flag}) 19679c2e3e6Spatrick endforeach() 19779c2e3e6Spatrickendmacro() 19879c2e3e6Spatrick 19979c2e3e6Spatrick# Add a list of flags to 'LIBCXXABI_LINK_FLAGS'. 20079c2e3e6Spatrickmacro(add_link_flags) 20179c2e3e6Spatrick foreach(f ${ARGN}) 20279c2e3e6Spatrick list(APPEND LIBCXXABI_LINK_FLAGS ${f}) 20379c2e3e6Spatrick endforeach() 20479c2e3e6Spatrickendmacro() 20579c2e3e6Spatrick 20679c2e3e6Spatrick# If 'condition' is true then add the specified list of flags to 20779c2e3e6Spatrick# 'LIBCXXABI_LINK_FLAGS' 20879c2e3e6Spatrickmacro(add_link_flags_if condition) 20979c2e3e6Spatrick if (${condition}) 21079c2e3e6Spatrick add_link_flags(${ARGN}) 21179c2e3e6Spatrick endif() 21279c2e3e6Spatrickendmacro() 21379c2e3e6Spatrick 21479c2e3e6Spatrick# For each specified flag, add that flag to 'LIBCXXABI_LINK_FLAGS' if the 21579c2e3e6Spatrick# flag is supported by the C++ compiler. 21679c2e3e6Spatrickmacro(add_link_flags_if_supported) 21779c2e3e6Spatrick foreach(flag ${ARGN}) 21879c2e3e6Spatrick mangle_name("${flag}" flagname) 219*8f1d5724Srobert check_cxx_compiler_flag("${flag}" "CXX_SUPPORTS_${flagname}_FLAG") 220*8f1d5724Srobert add_link_flags_if(CXX_SUPPORTS_${flagname}_FLAG ${flag}) 22179c2e3e6Spatrick endforeach() 22279c2e3e6Spatrickendmacro() 22379c2e3e6Spatrick 22479c2e3e6Spatrick# Add a list of libraries or link flags to 'LIBCXXABI_LIBRARIES'. 22579c2e3e6Spatrickmacro(add_library_flags) 22679c2e3e6Spatrick foreach(lib ${ARGN}) 22779c2e3e6Spatrick list(APPEND LIBCXXABI_LIBRARIES ${lib}) 22879c2e3e6Spatrick endforeach() 22979c2e3e6Spatrickendmacro() 23079c2e3e6Spatrick 23179c2e3e6Spatrick# if 'condition' is true then add the specified list of libraries and flags 23279c2e3e6Spatrick# to 'LIBCXXABI_LIBRARIES'. 23379c2e3e6Spatrickmacro(add_library_flags_if condition) 23479c2e3e6Spatrick if(${condition}) 23579c2e3e6Spatrick add_library_flags(${ARGN}) 23679c2e3e6Spatrick endif() 23779c2e3e6Spatrickendmacro() 23879c2e3e6Spatrick 23979c2e3e6Spatrick# Turn a comma separated CMake list into a space separated string. 24079c2e3e6Spatrickmacro(split_list listname) 24179c2e3e6Spatrick string(REPLACE ";" " " ${listname} "${${listname}}") 24279c2e3e6Spatrickendmacro() 243*8f1d5724Srobert 244*8f1d5724Srobert# For each specified flag, add that compile flag to the provided target. 245*8f1d5724Srobert# The flags are added with the given visibility, i.e. PUBLIC|PRIVATE|INTERFACE. 246*8f1d5724Srobertfunction(target_add_compile_flags_if_supported target visibility) 247*8f1d5724Srobert foreach(flag ${ARGN}) 248*8f1d5724Srobert mangle_name("${flag}" flagname) 249*8f1d5724Srobert check_cxx_compiler_flag("${flag}" "CXX_SUPPORTS_${flagname}_FLAG") 250*8f1d5724Srobert if (CXX_SUPPORTS_${flagname}_FLAG) 251*8f1d5724Srobert target_compile_options(${target} ${visibility} ${flag}) 252*8f1d5724Srobert endif() 253*8f1d5724Srobert endforeach() 254*8f1d5724Srobertendfunction() 255