[CMake] Unify llvm_check_linker_flag and llvm_check_compiler_linker_flag
These have the same purposes but two different implementations. llvm_check_compiler_linker_flag uses CMAKE_REQUIRED_FLAGS which affects flags used both for compilation and linking which is problematic because some flags may be link-only and trigger unused argument warning when set during compilation. llvm_check_linker_flag does not have this issue so we chose it as the prevailaing implementation. Differential Revision: https://reviews.llvm.org/D143052
This commit is contained in:
@@ -1,35 +0,0 @@
|
||||
include(CMakePushCheckState)
|
||||
|
||||
include(CheckCompilerFlag OPTIONAL)
|
||||
|
||||
if(NOT COMMAND check_compiler_flag)
|
||||
include(CheckCCompilerFlag)
|
||||
include(CheckCXXCompilerFlag)
|
||||
endif()
|
||||
|
||||
function(llvm_check_compiler_linker_flag lang flag out_var)
|
||||
# If testing a flag with check_c_compiler_flag, it gets added to the compile
|
||||
# command only, but not to the linker command in that test. If the flag
|
||||
# is vital for linking to succeed, the test would fail even if it would
|
||||
# have succeeded if it was included on both commands.
|
||||
#
|
||||
# Therefore, try adding the flag to CMAKE_REQUIRED_FLAGS, which gets
|
||||
# added to both compiling and linking commands in the tests.
|
||||
|
||||
cmake_push_check_state()
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${flag}")
|
||||
if(COMMAND check_compiler_flag)
|
||||
check_compiler_flag("${lang}" "" ${out_var})
|
||||
else()
|
||||
# Until the minimum CMAKE version is 3.19
|
||||
# cmake builtin compatible, except we assume lang is C or CXX
|
||||
if("${lang}" STREQUAL "C")
|
||||
check_c_compiler_flag("" ${out_var})
|
||||
elseif("${lang}" STREQUAL "CXX")
|
||||
check_cxx_compiler_flag("" ${out_var})
|
||||
else()
|
||||
message(FATAL_ERROR "\"${lang}\" is not C or CXX")
|
||||
endif()
|
||||
endif()
|
||||
cmake_pop_check_state()
|
||||
endfunction()
|
||||
@@ -1,10 +1,10 @@
|
||||
include(CMakePushCheckState)
|
||||
include(LLVMCheckCompilerLinkerFlag)
|
||||
include(LLVMCheckLinkerFlag)
|
||||
include(CheckCCompilerFlag)
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(CheckIncludeFiles)
|
||||
include(CheckLibraryExists)
|
||||
include(LLVMCheckCompilerLinkerFlag)
|
||||
include(LLVMCheckLinkerFlag)
|
||||
include(CheckSymbolExists)
|
||||
include(TestBigEndian)
|
||||
|
||||
@@ -15,7 +15,7 @@ include(TestBigEndian)
|
||||
# libunwind (and the compiler implicit -lunwind wouldn't succeed as the newly
|
||||
# built libunwind isn't installed yet). For those cases, it'd be good to
|
||||
# link with --uwnindlib=none. Check if that option works.
|
||||
llvm_check_compiler_linker_flag(C "--unwindlib=none" CXX_SUPPORTS_UNWINDLIB_NONE_FLAG)
|
||||
llvm_check_linker_flag(C "--unwindlib=none" CXX_SUPPORTS_UNWINDLIB_NONE_FLAG)
|
||||
|
||||
check_library_exists(c fopen "" COMPILER_RT_HAS_LIBC)
|
||||
if (COMPILER_RT_USE_BUILTINS_LIBRARY)
|
||||
@@ -195,12 +195,12 @@ check_library_exists(c++ __cxa_throw "" COMPILER_RT_HAS_LIBCXX)
|
||||
check_library_exists(stdc++ __cxa_throw "" COMPILER_RT_HAS_LIBSTDCXX)
|
||||
|
||||
# Linker flags.
|
||||
llvm_check_compiler_linker_flag(C "-Wl,-z,text" COMPILER_RT_HAS_Z_TEXT)
|
||||
llvm_check_compiler_linker_flag(C "-fuse-ld=lld" COMPILER_RT_HAS_FUSE_LD_LLD_FLAG)
|
||||
llvm_check_linker_flag(C "-Wl,-z,text" COMPILER_RT_HAS_Z_TEXT)
|
||||
llvm_check_linker_flag(C "-fuse-ld=lld" COMPILER_RT_HAS_FUSE_LD_LLD_FLAG)
|
||||
|
||||
if(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
|
||||
set(VERS_COMPAT_OPTION "-Wl,-z,gnu-version-script-compat")
|
||||
llvm_check_compiler_linker_flag(C "${VERS_COMPAT_OPTION}" COMPILER_RT_HAS_GNU_VERSION_SCRIPT_COMPAT)
|
||||
llvm_check_linker_flag(C "${VERS_COMPAT_OPTION}" COMPILER_RT_HAS_GNU_VERSION_SCRIPT_COMPAT)
|
||||
endif()
|
||||
|
||||
set(DUMMY_VERS ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/dummy.vers)
|
||||
@@ -211,10 +211,10 @@ if(COMPILER_RT_HAS_GNU_VERSION_SCRIPT_COMPAT)
|
||||
# -z gnu-version-script-compat.
|
||||
string(APPEND VERS_OPTION " ${VERS_COMPAT_OPTION}")
|
||||
endif()
|
||||
llvm_check_compiler_linker_flag(C "${VERS_OPTION}" COMPILER_RT_HAS_VERSION_SCRIPT)
|
||||
llvm_check_linker_flag(C "${VERS_OPTION}" COMPILER_RT_HAS_VERSION_SCRIPT)
|
||||
|
||||
if(ANDROID)
|
||||
llvm_check_compiler_linker_flag(C "-Wl,-z,global" COMPILER_RT_HAS_Z_GLOBAL)
|
||||
llvm_check_linker_flag(C "-Wl,-z,global" COMPILER_RT_HAS_Z_GLOBAL)
|
||||
check_library_exists(log __android_log_write "" COMPILER_RT_HAS_LIBLOG)
|
||||
endif()
|
||||
|
||||
@@ -478,7 +478,7 @@ if(APPLE)
|
||||
-lc++
|
||||
-lc++abi)
|
||||
|
||||
llvm_check_compiler_linker_flag(C "-fapplication-extension" COMPILER_RT_HAS_APP_EXTENSION)
|
||||
llvm_check_linker_flag(C "-fapplication-extension" COMPILER_RT_HAS_APP_EXTENSION)
|
||||
if(COMPILER_RT_HAS_APP_EXTENSION)
|
||||
list(APPEND DARWIN_COMMON_LINK_FLAGS "-fapplication-extension")
|
||||
endif()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
include(CMakePushCheckState)
|
||||
include(CheckLibraryExists)
|
||||
include(LLVMCheckCompilerLinkerFlag)
|
||||
include(LLVMCheckLinkerFlag)
|
||||
include(CheckCCompilerFlag)
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(CheckCSourceCompiles)
|
||||
@@ -12,7 +12,7 @@ include(CheckCSourceCompiles)
|
||||
# libunwind (and the compiler implicit -lunwind wouldn't succeed as the newly
|
||||
# built libunwind isn't installed yet). For those cases, it'd be good to
|
||||
# link with --uwnindlib=none. Check if that option works.
|
||||
llvm_check_compiler_linker_flag(C "--unwindlib=none" CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG)
|
||||
llvm_check_linker_flag(C "--unwindlib=none" CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG)
|
||||
|
||||
if(WIN32 AND NOT MINGW)
|
||||
# NOTE(compnerd) this is technically a lie, there is msvcrt, but for now, lets
|
||||
|
||||
@@ -2,14 +2,14 @@ include(CMakePushCheckState)
|
||||
include(CheckCCompilerFlag)
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(CheckLibraryExists)
|
||||
include(LLVMCheckCompilerLinkerFlag)
|
||||
include(LLVMCheckLinkerFlag)
|
||||
include(CheckSymbolExists)
|
||||
include(CheckCSourceCompiles)
|
||||
|
||||
# The compiler driver may be implicitly trying to link against libunwind, which
|
||||
# might not work if libunwind doesn't exist yet. Try to check if
|
||||
# --unwindlib=none is supported, and use that if possible.
|
||||
llvm_check_compiler_linker_flag(C "--unwindlib=none" CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG)
|
||||
llvm_check_linker_flag(C "--unwindlib=none" CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG)
|
||||
|
||||
check_library_exists(c fopen "" LIBUNWIND_HAS_C_LIB)
|
||||
|
||||
@@ -31,11 +31,11 @@ endif()
|
||||
# required for the link to go through. We remove sanitizers from the
|
||||
# configuration checks to avoid spurious link errors.
|
||||
|
||||
llvm_check_compiler_linker_flag(CXX "-nostdlib++" CXX_SUPPORTS_NOSTDLIBXX_FLAG)
|
||||
llvm_check_linker_flag(CXX "-nostdlib++" CXX_SUPPORTS_NOSTDLIBXX_FLAG)
|
||||
if (CXX_SUPPORTS_NOSTDLIBXX_FLAG)
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nostdlib++")
|
||||
else()
|
||||
llvm_check_compiler_linker_flag(C "-nodefaultlibs" C_SUPPORTS_NODEFAULTLIBS_FLAG)
|
||||
llvm_check_linker_flag(C "-nodefaultlibs" C_SUPPORTS_NODEFAULTLIBS_FLAG)
|
||||
if (C_SUPPORTS_NODEFAULTLIBS_FLAG)
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nodefaultlibs")
|
||||
endif()
|
||||
|
||||
@@ -78,7 +78,7 @@ set(LLVM_CMAKE_DIR ${LLVM_MAIN_SRC_DIR}/cmake/modules)
|
||||
set(LLVM_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../llvm)
|
||||
|
||||
include(CheckLibraryExists)
|
||||
include(LLVMCheckCompilerLinkerFlag)
|
||||
include(LLVMCheckLinkerFlag)
|
||||
include(CheckCCompilerFlag)
|
||||
include(CheckCXXCompilerFlag)
|
||||
|
||||
@@ -110,7 +110,7 @@ if (NOT LLVM_RUNTIMES_LINKING_WORKS)
|
||||
# --unwindlib=none is supported, and use that if possible.
|
||||
# Don't add this if not necessary to fix linking, as it can break using
|
||||
# e.g. ASAN/TSAN.
|
||||
llvm_check_compiler_linker_flag(C "--unwindlib=none" CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG)
|
||||
llvm_check_linker_flag(C "--unwindlib=none" CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG)
|
||||
if (CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG)
|
||||
set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} --unwindlib=none")
|
||||
@@ -140,7 +140,7 @@ endif()
|
||||
# Check for -nostdlib++ first; if there's no C++ standard library yet,
|
||||
# all check_cxx_compiler_flag commands will fail until we add -nostdlib++
|
||||
# (or -nodefaultlibs).
|
||||
llvm_check_compiler_linker_flag(CXX "-nostdlib++" CXX_SUPPORTS_NOSTDLIBXX_FLAG)
|
||||
llvm_check_linker_flag(CXX "-nostdlib++" CXX_SUPPORTS_NOSTDLIBXX_FLAG)
|
||||
if (CXX_SUPPORTS_NOSTDLIBXX_FLAG)
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nostdlib++")
|
||||
endif()
|
||||
|
||||
Reference in New Issue
Block a user