Skip to content

Commit 470ade3

Browse files
committed
ensure tune flags are passed to clang when building Swift recipes
Yocto defines target-specific tune flags in the TARGET_CC_ARCH variable. Expand these and include them in destination.json so they are used when SwiftPM is compiling C.
1 parent 2bdd14f commit 470ade3

File tree

3 files changed

+45
-3
lines changed

3 files changed

+45
-3
lines changed

classes/swift-cmake-base.bbclass

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,27 @@ TARGET_CPU_NAME = "${@oe.utils.conditional('TARGET_ARCH', 'arm', 'armv7-a', '${T
1212
# Determine SWIFT_GCC_VERSION by examining bitbake's context dictionary key
1313
# RECIPE_MAINTAINER:pn-gcc-source-<version>
1414
python () {
15+
import shlex
16+
1517
gcc_src_maint_pkg = [x for x in d if x.startswith("RECIPE_MAINTAINER:pn-gcc-source-")][0]
1618
gcc_ver = gcc_src_maint_pkg.rpartition("-")[2]
1719

1820
d.setVar("SWIFT_GCC_VERSION", gcc_ver)
21+
22+
def expand_swiftc_cc_flags(flags):
23+
flags = [['-Xcc', flag] for flag in flags]
24+
return sum(flags, [])
25+
26+
def concat_flags(flags):
27+
return " ".join(flags)
28+
29+
# ensure target-specific tune CC flags are propagated to clang and swiftc.
30+
# Note we are not doing this at present for LD flags, as there are none in
31+
# the architectures we support (and it would make the string expansion more
32+
# complicated).
33+
target_cc_arch = shlex.split(d.getVar("TARGET_CC_ARCH"))
34+
35+
d.setVar("SWIFT_EXTRA_SWIFTC_CC_FLAGS", concat_flags(expand_swiftc_cc_flags(target_cc_arch)))
1936
}
2037

2138
EXTRA_INCLUDE_FLAGS ?= "\
@@ -48,8 +65,8 @@ OECMAKE_C_COMPILER = "clang"
4865
OECMAKE_CXX_COMPILER = "clang++"
4966

5067
# Point clang to where the C++ runtime is for our target arch
51-
RUNTIME_FLAGS = "-w -fuse-ld=lld -B${STAGING_DIR_TARGET}/usr/lib/${TARGET_SYS}/${SWIFT_GCC_VERSION}"
52-
TARGET_LDFLAGS:append = " -w -fuse-ld=lld -L${STAGING_DIR_TARGET}/usr/lib/${TARGET_SYS}/${SWIFT_GCC_VERSION}"
68+
RUNTIME_FLAGS = "${TARGET_CC_ARCH} -w -fuse-ld=lld -B${STAGING_DIR_TARGET}/usr/lib/${TARGET_SYS}/${SWIFT_GCC_VERSION}"
69+
TARGET_LDFLAGS:append = " ${TARGET_LD_ARCH} -w -fuse-ld=lld -L${STAGING_DIR_TARGET}/usr/lib/${TARGET_SYS}/${SWIFT_GCC_VERSION}"
5370

5471
OECMAKE_C_FLAGS:append = " ${RUNTIME_FLAGS} ${EXTRA_INCLUDE_FLAGS}"
5572
OECMAKE_CXX_FLAGS:append = " ${RUNTIME_FLAGS} ${EXTRA_INCLUDE_FLAGS}"
@@ -70,6 +87,7 @@ SWIFT_FLAGS = "-target ${SWIFT_TARGET_NAME} -use-ld=lld \
7087
-module-cache-path ${B}/${BUILD_MODE}/ModuleCache \
7188
-Xclang-linker -B${STAGING_DIR_TARGET}/usr/lib \
7289
-Xclang-linker -B${STAGING_DIR_TARGET}/usr/lib/${TARGET_SYS}/${SWIFT_GCC_VERSION} \
90+
${SWIFT_EXTRA_SWIFTC_CC_FLAGS} \
7391
-Xcc -I${STAGING_DIR_NATIVE}/usr/lib/${TARGET_SYS}/gcc/${TARGET_SYS}/${SWIFT_GCC_VERSION}/include \
7492
-Xcc -I${STAGING_DIR_NATIVE}/usr/lib/${TARGET_SYS}/gcc/${TARGET_SYS}/${SWIFT_GCC_VERSION}/include-fixed \
7593
-L${STAGING_DIR_TARGET} \

classes/swift.bbclass

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ python swift_do_configure() {
9090
import os
9191
import os.path
9292
import shutil
93+
import shlex
9394

9495
workdir = d.getVar("WORKDIR", True)
9596
recipe_sysroot = d.getVar("STAGING_DIR_TARGET", True)
@@ -114,13 +115,31 @@ python swift_do_configure() {
114115

115116
d.setVar('SWIFT_CXX_VERSION', cxx_version)
116117

118+
def expand_swiftc_cc_flags(flags):
119+
flags = [['-Xcc', flag] for flag in flags]
120+
return sum(flags, [])
121+
122+
def concat_flags(flags):
123+
flags = [f'"{flag}"' for flag in flags]
124+
return ", ".join(flags)
125+
126+
# ensure target-specific tune CC flags are propagated to clang and swiftc.
127+
# Note we are not doing this at present for LD flags, as there are none in
128+
# the architectures we support (and it would make the string expansion more
129+
# complicated).
130+
target_cc_arch = shlex.split(d.getVar("TARGET_CC_ARCH"))
131+
132+
d.setVar("SWIFT_EXTRA_CC_FLAGS", concat_flags(target_cc_arch))
133+
d.setVar("SWIFT_EXTRA_SWIFTC_CC_FLAGS", concat_flags(expand_swiftc_cc_flags(target_cc_arch)))
134+
117135
swift_destination_template = """{
118136
"version":1,
119137
"sdk":"${STAGING_DIR_TARGET}/",
120138
"toolchain-bin-dir":"${STAGING_DIR_NATIVE}/usr/bin",
121139
"target":"${SWIFT_TARGET_NAME}",
122140
"dynamic-library-extension":"so",
123141
"extra-cc-flags":[
142+
${SWIFT_EXTRA_CC_FLAGS},
124143
"-fPIC",
125144
"-I${STAGING_INCDIR}",
126145
"-I${STAGING_DIR_TARGET}/usr/include/c++/${SWIFT_CXX_VERSION}",
@@ -166,9 +185,11 @@ python swift_do_configure() {
166185
167186
"-resource-dir", "${STAGING_DIR_TARGET}/usr/lib/swift",
168187
"-module-cache-path", "${B}/${BUILD_MODE}/ModuleCache",
188+
169189
"-Xclang-linker", "-B${STAGING_DIR_TARGET}/usr/lib/${TARGET_SYS}/${SWIFT_CXX_VERSION}",
170190
"-Xclang-linker", "-B${STAGING_DIR_TARGET}/usr/lib",
171191
192+
${SWIFT_EXTRA_SWIFTC_CC_FLAGS},
172193
"-Xcc", "--gcc-install-dir=${STAGING_DIR_TARGET}/usr/lib/gcc/${TARGET_SYS}/${SWIFT_CXX_VERSION}",
173194
174195
"-sdk", "${STAGING_DIR_TARGET}"
@@ -182,6 +203,9 @@ python swift_do_configure() {
182203

183204
d.delVar("SWIFT_CXX_VERSION")
184205

206+
d.delVar("SWIFT_EXTRA_CC_FLAGS")
207+
d.delVar("SWIFT_EXTRA_SWIFTC_CC_FLAGS")
208+
185209
configJSON = open(workdir + "/destination.json", "w")
186210
configJSON.write(swift_destination)
187211
configJSON.close()

recipes-devtools/swift/swift-stdlib.bb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ set(SWIFT_ENABLE_SYNCHRONIZATION ON)
151151
set(SWIFT_PATH_TO_STRING_PROCESSING_SOURCE ${WORKDIR}/swift-experimental-string-processing)
152152
set(SWIFT_SYNTAX_SOURCE_DIR ${WORKDIR}/swift-syntax)
153153
set(SWIFTSYNTAX_SOURCE_DIR ${WORKDIR}/swift-syntax)
154-
set(SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS -Xcc --gcc-install-dir=${STAGING_DIR_TARGET}/usr/lib/gcc/${TARGET_SYS}/${SWIFT_GCC_VERSION} -I${STAGING_DIR_TARGET}/usr/include/c++/${SWIFT_GCC_VERSION} -I${STAGING_DIR_TARGET}/usr/include/c++/${SWIFT_GCC_VERSION}/${TARGET_SYS} -no-verify-emitted-module-interface)
154+
set(SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS -Xcc --gcc-install-dir=${STAGING_DIR_TARGET}/usr/lib/gcc/${TARGET_SYS}/${SWIFT_GCC_VERSION} -I${STAGING_DIR_TARGET}/usr/include/c++/${SWIFT_GCC_VERSION} -I${STAGING_DIR_TARGET}/usr/include/c++/${SWIFT_GCC_VERSION}/${TARGET_SYS} -no-verify-emitted-module-interface ${SWIFT_EXTRA_SWIFTC_CC_FLAGS})
155155
set(SWIFT_SDK_LINUX_CXX_OVERLAY_SWIFT_COMPILE_FLAGS "")
156156

157157
set(ICU_I18N_LIBRARIES ${STAGING_DIR_TARGET}/usr/lib/libicui18n.so)

0 commit comments

Comments
 (0)