Skip to content

Commit e0621e9

Browse files
committed
cmake: Add TryAppendLinkerFlag module
1 parent ae430cf commit e0621e9

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# Copyright (c) 2023-present The Bitcoin Core developers
2+
# Distributed under the MIT software license, see the accompanying
3+
# file COPYING or https://opensource.org/license/mit/.
4+
5+
include_guard(GLOBAL)
6+
include(CheckCXXSourceCompiles)
7+
8+
#[=[
9+
Usage example:
10+
11+
try_append_linker_flag(core "-Wl,--major-subsystem-version,6")
12+
13+
14+
In configuration output, this function prints a string by the following pattern:
15+
16+
-- Performing Test LINKER_SUPPORTS_[flag]
17+
-- Performing Test LINKER_SUPPORTS_[flag] - Success
18+
19+
]=]
20+
function(try_append_linker_flag target flag)
21+
cmake_parse_arguments(PARSE_ARGV 2
22+
TALF # prefix
23+
"" # options
24+
"SOURCE;RESULT_VAR" # one_value_keywords
25+
"IF_CHECK_PASSED;IF_CHECK_FAILED" # multi_value_keywords
26+
)
27+
28+
string(MAKE_C_IDENTIFIER "${flag}" result)
29+
string(TOUPPER "${result}" result)
30+
set(result "LINKER_SUPPORTS_${result}")
31+
32+
# Every subsequent check_cxx_source_compiles((<code> <resultVar>) run will re-use
33+
# the cached result rather than performing the check again, even if the <code> changes.
34+
# Removing the cached result in order to force the check to be re-evaluated.
35+
unset(${result} CACHE)
36+
37+
if(NOT DEFINED TALF_SOURCE)
38+
set(TALF_SOURCE "int main() { return 0; }")
39+
endif()
40+
41+
# This forces running a linker.
42+
set(CMAKE_TRY_COMPILE_TARGET_TYPE EXECUTABLE)
43+
44+
get_target_property(working_linker_werror_flag internal_werror INTERFACE_LINK_OPTIONS)
45+
if(NOT working_linker_werror_flag)
46+
set(working_linker_werror_flag)
47+
endif()
48+
if(CMAKE_VERSION VERSION_LESS 3.14)
49+
set(CMAKE_REQUIRED_LIBRARIES ${flag} ${working_linker_werror_flag})
50+
else()
51+
set(CMAKE_REQUIRED_LINK_OPTIONS ${flag} ${working_linker_werror_flag})
52+
endif()
53+
54+
check_cxx_source_compiles("${TALF_SOURCE}" ${result})
55+
56+
if(${result})
57+
if(DEFINED TALF_IF_CHECK_PASSED)
58+
target_link_options(${target} INTERFACE ${TALF_IF_CHECK_PASSED})
59+
else()
60+
target_link_options(${target} INTERFACE ${flag})
61+
endif()
62+
elseif(DEFINED TALF_IF_CHECK_FAILED)
63+
target_link_options(${target} INTERFACE ${TALF_IF_CHECK_FAILED})
64+
endif()
65+
66+
set(${TALF_RESULT_VAR} "${${result}}" PARENT_SCOPE)
67+
endfunction()
68+
69+
if(NOT TARGET internal_werror)
70+
add_library(internal_werror INTERFACE)
71+
endif()
72+
if(MSVC)
73+
set(warning_as_error_flag /WX)
74+
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
75+
set(warning_as_error_flag -Wl,-fatal_warnings)
76+
else()
77+
set(warning_as_error_flag -Wl,--fatal-warnings)
78+
endif()
79+
try_append_linker_flag(internal_werror "${warning_as_error_flag}")
80+
unset(warning_as_error_flag)

0 commit comments

Comments
 (0)