Skip to content

Commit 558c9d4

Browse files
committed
[cmake] Use generator expressions to change conditionalize target_compile_definition that are for c/c++ only be used for c/c++
I am in the process now of preparing the tree for the addition of Swift code in the optimizer as a normal source of source file. The goal is to make it so that one can just include a random swift library anywhere in the swift project host build and the cmake will use the swift compiler from the host toolchain/compile-link the code just as if it was a normal host side thing (1). In order to do this though, we need to deal with the legacy of our cmake creating compile flags without constraining the flags to only being used if cmake is compiling c/c++ code. To fix this, I just inserted generator expressions into the host side swift build's cmake that uses generator expressions to perform such conditionalization. The result is that the parts of a target that are c/c++ will get these flags, but these flags will not propagate to any Swift files that we add. (1) With time this implies that we will need to be able to bootstrap the swift compiler. We are not crossing that bridge now since the only places that we are going to use this today is in the SILOptimizer optimier passes. These can always be disabled while cross compiling, meaning that we can make progress here without having the bootstrapping completely ironed out.
1 parent 0d4d98e commit 558c9d4

File tree

1 file changed

+43
-43
lines changed

1 file changed

+43
-43
lines changed

cmake/modules/AddSwift.cmake

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -91,24 +91,24 @@ function(_add_host_variant_c_compile_link_flags name)
9191
get_target_triple(target target_variant "${SWIFT_HOST_VARIANT_SDK}" "${SWIFT_HOST_VARIANT_ARCH}"
9292
MACCATALYST_BUILD_FLAVOR ""
9393
DEPLOYMENT_VERSION "${DEPLOYMENT_VERSION}")
94-
target_compile_options(${name} PRIVATE -target;${target})
94+
target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-target;${target}>)
9595
target_link_options(${name} PRIVATE -target;${target})
9696
endif()
9797

9898
set(_sysroot
9999
"${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_ARCH_${SWIFT_HOST_VARIANT_ARCH}_PATH}")
100100
if(SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_USE_ISYSROOT)
101-
target_compile_options(${name} PRIVATE -isysroot;${_sysroot})
101+
target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-isysroot;${_sysroot}>)
102102
elseif(NOT SWIFT_COMPILER_IS_MSVC_LIKE AND NOT "${_sysroot}" STREQUAL "/")
103-
target_compile_options(${name} PRIVATE --sysroot=${_sysroot})
103+
target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:--sysroot=${_sysroot}>)
104104
endif()
105105

106106
if(SWIFT_HOST_VARIANT_SDK STREQUAL ANDROID)
107107
# lld can handle targeting the android build. However, if lld is not
108108
# enabled, then fallback to the linker included in the android NDK.
109109
if(NOT SWIFT_USE_LINKER STREQUAL "lld")
110110
swift_android_tools_path(${SWIFT_HOST_VARIANT_ARCH} tools_path)
111-
target_compile_options(${name} PRIVATE -B${tools_path})
111+
target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-B${tools_path}>)
112112
endif()
113113
endif()
114114

@@ -117,13 +117,15 @@ function(_add_host_variant_c_compile_link_flags name)
117117
# of options by target_compile_options -- this way no undesired
118118
# side effects are introduced should a new search path be added.
119119
target_compile_options(${name} PRIVATE
120+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:
120121
-arch ${SWIFT_HOST_VARIANT_ARCH}
121-
"-F${SWIFT_SDK_${SWIFT_HOST_VARIANT_ARCH}_PATH}/../../../Developer/Library/Frameworks")
122+
"-F${SWIFT_SDK_${SWIFT_HOST_VARIANT_ARCH}_PATH}/../../../Developer/Library/Frameworks"
123+
>)
122124
endif()
123125

124126
_compute_lto_flag("${SWIFT_TOOLS_ENABLE_LTO}" _lto_flag_out)
125127
if (_lto_flag_out)
126-
target_compile_options(${name} PRIVATE ${_lto_flag_out})
128+
target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:${_lto_flag_out}>)
127129
target_link_options(${name} PRIVATE ${_lto_flag_out})
128130
endif()
129131
endfunction()
@@ -135,9 +137,9 @@ function(_add_host_variant_c_compile_flags target)
135137
is_build_type_optimized("${CMAKE_BUILD_TYPE}" optimized)
136138
if(optimized)
137139
if("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
138-
target_compile_options(${target} PRIVATE -Os)
140+
target_compile_options(${target} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-Os>)
139141
else()
140-
target_compile_options(${target} PRIVATE -O2)
142+
target_compile_options(${target} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-O2>)
141143
endif()
142144

143145
# Omit leaf frame pointers on x86 production builds (optimized, no debug
@@ -146,17 +148,17 @@ function(_add_host_variant_c_compile_flags target)
146148
if(NOT debug AND NOT LLVM_ENABLE_ASSERTIONS)
147149
if(SWIFT_HOST_VARIANT_ARCH MATCHES "i?86")
148150
if(NOT SWIFT_COMPILER_IS_MSVC_LIKE)
149-
target_compile_options(${target} PRIVATE -momit-leaf-frame-pointer)
151+
target_compile_options(${target} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-momit-leaf-frame-pointer>)
150152
else()
151-
target_compile_options(${target} PRIVATE /Oy)
153+
target_compile_options(${target} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:/Oy>)
152154
endif()
153155
endif()
154156
endif()
155157
else()
156158
if(NOT SWIFT_COMPILER_IS_MSVC_LIKE)
157-
target_compile_options(${target} PRIVATE -O0)
159+
target_compile_options(${target} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-O0>)
158160
else()
159-
target_compile_options(${target} PRIVATE /Od)
161+
target_compile_options(${target} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:/Od>)
160162
endif()
161163
endif()
162164

@@ -166,7 +168,7 @@ function(_add_host_variant_c_compile_flags target)
166168
if(debuginfo)
167169
_compute_lto_flag("${SWIFT_TOOLS_ENABLE_LTO}" _lto_flag_out)
168170
if(_lto_flag_out)
169-
target_compile_options(${target} PRIVATE -gline-tables-only)
171+
target_compile_options(${target} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-gline-tables-only>)
170172
else()
171173
target_compile_options(${target} PRIVATE -g)
172174
endif()
@@ -179,26 +181,24 @@ function(_add_host_variant_c_compile_flags target)
179181
# MSVC/clang-cl don't support -fno-pic or -fms-compatibility-version.
180182
if(NOT SWIFT_COMPILER_IS_MSVC_LIKE)
181183
target_compile_options(${target} PRIVATE
182-
-fms-compatibility-version=1900
183-
-fno-pic)
184+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-fms-compatibility-version=1900 -fno-pic>)
184185
endif()
185186

186187
target_compile_definitions(${target} PRIVATE
187-
LLVM_ON_WIN32
188-
_CRT_SECURE_NO_WARNINGS
189-
_CRT_NONSTDC_NO_WARNINGS)
188+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:LLVM_ON_WIN32 _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS>)
190189
if(NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
191190
target_compile_definitions(${target} PRIVATE
192-
_CRT_USE_BUILTIN_OFFSETOF)
191+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:_CRT_USE_BUILTIN_OFFSETOF>)
193192
endif()
194193
# TODO(compnerd) permit building for different families
195194
target_compile_definitions(${target} PRIVATE
196-
_CRT_USE_WINAPI_FAMILY_DESKTOP_APP)
195+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:_CRT_USE_WINAPI_FAMILY_DESKTOP_APP>)
197196
if(SWIFT_HOST_VARIANT_ARCH MATCHES arm)
198197
target_compile_definitions(${target} PRIVATE
199-
_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE)
198+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE>)
200199
endif()
201200
target_compile_definitions(${target} PRIVATE
201+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:
202202
# TODO(compnerd) handle /MT
203203
_MD
204204
_DLL
@@ -207,32 +207,32 @@ function(_add_host_variant_c_compile_flags target)
207207
# NOTE: We use over-aligned values for the RefCount side-table
208208
# (see revision d913eefcc93f8c80d6d1a6de4ea898a2838d8b6f)
209209
# This is required to build with VS2017 15.8+
210-
_ENABLE_EXTENDED_ALIGNED_STORAGE=1)
210+
_ENABLE_EXTENDED_ALIGNED_STORAGE=1>)
211211

212212
# msvcprt's std::function requires RTTI, but we do not want RTTI data.
213213
# Emulate /GR-.
214214
# TODO(compnerd) when moving up to VS 2017 15.3 and newer, we can disable
215215
# RTTI again
216216
if(SWIFT_COMPILER_IS_MSVC_LIKE)
217-
target_compile_options(${target} PRIVATE /GR-)
217+
target_compile_options(${target} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:/GR->)
218218
else()
219219
target_compile_options(${target} PRIVATE
220-
-frtti
221-
"SHELL:-Xclang -fno-rtti-data")
220+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-frtti>
221+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>"SHELL:-Xclang -fno-rtti-data">)
222222
endif()
223223
224224
# NOTE: VS 2017 15.3 introduced this to disable the static components of
225225
# RTTI as well. This requires a newer SDK though and we do not have
226226
# guarantees on the SDK version currently.
227227
target_compile_definitions(${target} PRIVATE
228-
_HAS_STATIC_RTTI=0)
228+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:_HAS_STATIC_RTTI=0>)
229229
230230
# NOTE(compnerd) workaround LLVM invoking `add_definitions(-D_DEBUG)` which
231231
# causes failures for the runtime library when cross-compiling due to
232232
# undefined symbols from the standard library.
233233
if(NOT CMAKE_BUILD_TYPE STREQUAL Debug)
234234
target_compile_options(${target} PRIVATE
235-
-U_DEBUG)
235+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-U_DEBUG>)
236236
endif()
237237
endif()
238238
@@ -246,40 +246,39 @@ function(_add_host_variant_c_compile_flags target)
246246
# the build.
247247
if(CMAKE_C_COMPILER_ID MATCHES Clang AND CMAKE_C_COMPILER_VERSION
248248
VERSION_LESS 9.0.0)
249-
target_compile_options(${target} PRIVATE -mcx16)
249+
target_compile_options(${target} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-mcx16>)
250250
endif()
251251
endif()
252252
endif()
253253
254254
if(LLVM_ENABLE_ASSERTIONS)
255-
target_compile_options(${target} PRIVATE -UNDEBUG)
255+
target_compile_options(${target} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-UNDEBUG>)
256256
else()
257-
target_compile_definitions(${target} PRIVATE -DNDEBUG)
257+
target_compile_definitions(${target} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-DNDEBUG>)
258258
endif()
259259
260260
if(SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS)
261261
target_compile_definitions(${target} PRIVATE
262-
SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS)
262+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS>)
263263
endif()
264264
265265
if(SWIFT_ANALYZE_CODE_COVERAGE)
266266
target_compile_options(${target} PRIVATE
267-
-fprofile-instr-generate
268-
-fcoverage-mapping)
267+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-fprofile-instr-generate -fcoverage-mapping>)
269268
endif()
270269
271270
if((SWIFT_HOST_VARIANT_ARCH STREQUAL armv7 OR
272271
SWIFT_HOST_VARIANT_ARCH STREQUAL aarch64) AND
273272
(SWIFT_HOST_VARIANT_SDK STREQUAL LINUX OR
274273
SWIFT_HOST_VARIANT_SDK STREQUAL ANDROID))
275-
target_compile_options(${target} PRIVATE -funwind-tables)
274+
target_compile_options(${target} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-funwind-tables>)
276275
endif()
277276
278277
if(SWIFT_HOST_VARIANT_SDK STREQUAL "LINUX")
279278
if(SWIFT_HOST_VARIANT_ARCH STREQUAL x86_64)
280279
# this is the minimum architecture that supports 16 byte CAS, which is
281280
# necessary to avoid a dependency to libatomic
282-
target_compile_options(${target} PRIVATE -march=core2)
281+
target_compile_options(${target} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-march=core2>)
283282
endif()
284283
endif()
285284
@@ -289,8 +288,7 @@ function(_add_host_variant_c_compile_flags target)
289288
if("${SWIFT_HOST_VARIANT_ARCH}" MATCHES "armv6|armv7|i686" AND
290289
NOT (SWIFT_HOST_VARIANT_SDK STREQUAL ANDROID AND SWIFT_ANDROID_API_LEVEL LESS 24))
291290
target_compile_definitions(${target} PRIVATE
292-
_LARGEFILE_SOURCE
293-
_FILE_OFFSET_BITS=64)
291+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:_LARGEFILE_SOURCE _FILE_OFFSET_BITS=64>)
294292
endif()
295293
endfunction()
296294
@@ -499,14 +497,15 @@ function(add_swift_host_library name)
499497
if(NOT ${CMAKE_C_COMPILER_ID} STREQUAL MSVC)
500498
swift_windows_get_sdk_vfs_overlay(ASHL_VFS_OVERLAY)
501499
target_compile_options(${name} PRIVATE
502-
"SHELL:-Xclang -ivfsoverlay -Xclang ${ASHL_VFS_OVERLAY}")
500+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang -ivfsoverlay -Xclang ${ASHL_VFS_OVERLAY}">)
503501
504502
# MSVC doesn't support -Xclang. We don't need to manually specify
505503
# the dependent libraries as `cl` does so.
506504
target_compile_options(${name} PRIVATE
507-
"SHELL:-Xclang --dependent-lib=oldnames"
505+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang --dependent-lib=oldnames">
508506
# TODO(compnerd) handle /MT, /MTd
509-
"SHELL:-Xclang --dependent-lib=msvcrt$<$<CONFIG:Debug>:d>")
507+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang --dependent-lib=msvcrt$<$<CONFIG:Debug>:d>">
508+
)
510509
endif()
511510
512511
set_target_properties(${name} PROPERTIES
@@ -597,9 +596,10 @@ function(add_swift_host_tool executable)
597596
# MSVC doesn't support -Xclang. We don't need to manually specify
598597
# the dependent libraries as `cl` does so.
599598
target_compile_options(${executable} PRIVATE
600-
"SHELL:-Xclang --dependent-lib=oldnames"
599+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang --dependent-lib=oldnames">
601600
# TODO(compnerd) handle /MT, /MTd
602-
"SHELL:-Xclang --dependent-lib=msvcrt$<$<CONFIG:Debug>:d>")
601+
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"SHELL:-Xclang --dependent-lib=msvcrt$<$<CONFIG:Debug>:d>">
602+
)
603603
endif()
604604
endif()
605605
@@ -627,7 +627,7 @@ function(add_swift_fuzzer_host_tool executable)
627627
628628
# Then make sure that we pass the -fsanitize=fuzzer flag both on the cflags
629629
# and cxx flags line.
630-
target_compile_options(${executable} PRIVATE "-fsanitize=fuzzer")
630+
target_compile_options(${executable} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:"-fsanitize=fuzzer">)
631631
target_link_libraries(${executable} PRIVATE "-fsanitize=fuzzer")
632632
endfunction()
633633

0 commit comments

Comments
 (0)