# CheckLinkerFlag # ------------------ # # Checks whether a compiler supports a given linker flag. # include(CheckCSourceCompiles) include(CheckCXXSourceCompiles) include(CheckFortranSourceCompiles) include(CMakeCheckCompilerFlagCommonPatterns) # FLAG: the linker flag to check # LANGUAGE: the language to test it on. C, CXX, or Fortran # RESULT: return variable macro(check_linker_flag LANGUAGE FLAG RESULT) if (NOT DEFINED ${RESULT}) set(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") set(CMAKE_REQUIRED_FLAGS "${FLAG}") # Normalize locale during test compilation. set(_CheckLinkerFlag_LOCALE_VARS LC_ALL LC_MESSAGES LANG) foreach (v ${_CheckLinkerFlag_LOCALE_VARS}) set(_CheckLinkerFlag_SAVED_${v} "$ENV{${v}}") set(ENV{${v}} C) endforeach () CHECK_COMPILER_FLAG_COMMON_PATTERNS(_CheckLinkerFlag_COMMON_PATTERNS) if ("${LANGUAGE}" STREQUAL C) CHECK_C_SOURCE_COMPILES( "int main(void) { return 0; }" ${RESULT} # Some compilers do not fail with a bad flag FAIL_REGEX "command line option .* is valid for .* but not for C" # GNU ${_CheckLinkerFlag_COMMON_PATTERNS} ) elseif ("${LANGUAGE}" STREQUAL CXX) check_cxx_source_compiles( "int main(void) { return 0; }" ${RESULT} # Some compilers do not fail with a bad flag FAIL_REGEX "command line option .* is valid for .* but not for C" # GNU ${_CheckLinkerFlag_COMMON_PATTERNS} ) elseif ("${LANGUAGE}" STREQUAL Fortran) check_fortran_source_compiles( "program test print *, \'Hello, world\' end program test" ${RESULT} # Some compilers do not fail with a bad flag FAIL_REGEX "command line option .* is valid for .* but not for Fortran" # GNU ${_CheckLinkerFlag_COMMON_PATTERNS}) else () message(FATAL_ERROR "Invalid LANGUAGE argument ${LANGUAGE}") endif () foreach (v ${_CheckCCompilerFlag_LOCALE_VARS}) set(ENV{${v}} ${_CheckCCompilerFlag_SAVED_${v}}) unset(_CheckCCompilerFlag_SAVED_${v}) endforeach () unset(_CheckCCompilerFlag_LOCALE_VARS) unset(_CheckCCompilerFlag_COMMON_PATTERNS) set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}") endif () endmacro(check_linker_flag)