Changeset View
Changeset View
Standalone View
Standalone View
cmake/modules/AddCompilerFlags.cmake
# Allow to easily add flags for C and C++ | # Allow to easily add flags for C and C++ | ||||
include(CheckCXXCompilerFlag) | include(CheckCXXCompilerFlag) | ||||
include(CheckCCompilerFlag) | include(CheckCCompilerFlag) | ||||
macro(build_test_name_from_flag TEST_NAME FLAG) | macro(build_test_name_from_flag TEST_NAME FLAG) | ||||
# Remove leading '-' chars | # Remove leading '-' chars | ||||
string(REGEX REPLACE "-*(.+)" "\\1" ${TEST_NAME} "${FLAG}") | string(REGEX REPLACE "-*(.+)" "\\1" ${TEST_NAME} "${FLAG}") | ||||
# Replace non printable char with '_' | # Replace non printable char with '_' | ||||
string(REGEX REPLACE "[^a-zA-Z0-9_]" "_" ${TEST_NAME} "${${TEST_NAME}}") | string(REGEX REPLACE "[^a-zA-Z0-9_]" "_" ${TEST_NAME} "${${TEST_NAME}}") | ||||
# Append "_is_supported" to the test name | # Append "_is_supported" to the test name | ||||
string(APPEND ${TEST_NAME} "_is_supported") | string(APPEND ${TEST_NAME} "_is_supported") | ||||
endmacro() | endmacro() | ||||
macro(append_flag_to_variable TARGET_VAR FLAG) | |||||
if(NOT "${${TARGET_VAR}}" STREQUAL "") | |||||
string(APPEND ${TARGET_VAR} " ") | |||||
endif() | |||||
string(APPEND ${TARGET_VAR} "${FLAG}") | |||||
endmacro() | |||||
function(add_c_compiler_flag) | function(add_c_compiler_flag) | ||||
foreach(f ${ARGN}) | foreach(f ${ARGN}) | ||||
build_test_name_from_flag(FLAG_IS_SUPPORTED ${f}) | build_test_name_from_flag(FLAG_IS_SUPPORTED ${f}) | ||||
CHECK_C_COMPILER_FLAG(${f} ${FLAG_IS_SUPPORTED}) | CHECK_C_COMPILER_FLAG(${f} ${FLAG_IS_SUPPORTED}) | ||||
if(${FLAG_IS_SUPPORTED}) | if(${FLAG_IS_SUPPORTED}) | ||||
string(APPEND CMAKE_C_FLAGS " ${f}") | append_flag_to_variable(CMAKE_C_FLAGS ${f}) | ||||
endif() | endif() | ||||
endforeach() | endforeach() | ||||
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} PARENT_SCOPE) | set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} PARENT_SCOPE) | ||||
endfunction() | endfunction() | ||||
function(add_cxx_compiler_flag) | function(add_cxx_compiler_flag) | ||||
foreach(f ${ARGN}) | foreach(f ${ARGN}) | ||||
build_test_name_from_flag(FLAG_IS_SUPPORTED ${f}) | build_test_name_from_flag(FLAG_IS_SUPPORTED ${f}) | ||||
CHECK_CXX_COMPILER_FLAG(${f} ${FLAG_IS_SUPPORTED}) | CHECK_CXX_COMPILER_FLAG(${f} ${FLAG_IS_SUPPORTED}) | ||||
if(${FLAG_IS_SUPPORTED}) | if(${FLAG_IS_SUPPORTED}) | ||||
string(APPEND CMAKE_CXX_FLAGS " ${f}") | append_flag_to_variable(CMAKE_CXX_FLAGS ${f}) | ||||
endif() | endif() | ||||
endforeach() | endforeach() | ||||
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} PARENT_SCOPE) | set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} PARENT_SCOPE) | ||||
endfunction() | endfunction() | ||||
macro(add_compiler_flag) | macro(add_compiler_flag) | ||||
add_c_compiler_flag(${ARGN}) | add_c_compiler_flag(${ARGN}) | ||||
add_cxx_compiler_flag(${ARGN}) | add_cxx_compiler_flag(${ARGN}) | ||||
Show All 16 Lines | macro(remove_compiler_flags) | ||||
endforeach() | endforeach() | ||||
endmacro() | endmacro() | ||||
# Note that CMake does not provide any facility to check that a linker flag is | # Note that CMake does not provide any facility to check that a linker flag is | ||||
# supported by the compiler, but most linker will just drop any unsupported flag | # supported by the compiler, but most linker will just drop any unsupported flag | ||||
# (eventually with a warning). | # (eventually with a warning). | ||||
function(add_linker_flag) | function(add_linker_flag) | ||||
foreach(f ${ARGN}) | foreach(f ${ARGN}) | ||||
string(APPEND CMAKE_EXE_LINKER_FLAGS " ${f}") | append_flag_to_variable(CMAKE_EXE_LINKER_FLAGS ${f}) | ||||
endforeach() | endforeach() | ||||
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} PARENT_SCOPE) | set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} PARENT_SCOPE) | ||||
endfunction() | endfunction() |