Skip to content

Instantly share code, notes, and snippets.

@colemancda
Last active May 18, 2022 06:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save colemancda/e2d7923b51697edec61c0004dfece150 to your computer and use it in GitHub Desktop.
Save colemancda/e2d7923b51697edec61c0004dfece150 to your computer and use it in GitHub Desktop.
Swift support for Buildroot
diff --git a/package/Config.in b/package/Config.in
index 517e66cce7..a742b540e5 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -2020,6 +2020,11 @@ comment "linux-pam plugins"
endif
source "package/liquid-dsp/Config.in"
source "package/llvm/Config.in"
+ source "package/swift/Config.in"
+ source "package/libdispatch/Config.in"
+ source "package/libswiftdispatch/Config.in"
+ source "package/foundation/Config.in"
+ source "package/xctest/Config.in"
source "package/lttng-libust/Config.in"
source "package/matio/Config.in"
source "package/mpc/Config.in"
diff --git a/package/Makefile.in b/package/Makefile.in
index 508ea7c366..07e7ef6f94 100644
--- a/package/Makefile.in
+++ b/package/Makefile.in
@@ -449,3 +449,4 @@ include package/pkg-golang.mk
include package/pkg-meson.mk
include package/pkg-qmake.mk
include package/pkg-cargo.mk
+include package/pkg-swift.mk
diff --git a/package/foundation/Config.in b/package/foundation/Config.in
new file mode 100644
index 0000000000..7a9dc8b514
--- /dev/null
+++ b/package/foundation/Config.in
@@ -0,0 +1,14 @@
+if BR2_PACKAGE_SWIFT
+
+config BR2_PACKAGE_FOUNDATION
+ bool "foundation"
+ depends on BR2_PACKAGE_SWIFT
+ select BR2_PACKAGE_LIBSWIFTDISPATCH
+ select BR2_PACKAGE_LIBCURL
+ select BR2_PACKAGE_LIBXML2
+ help
+ The Foundation framework defines a base layer of functionality that is required for almost all applications. It provides primitive classes and introduces several paradigms that define functionality not provided by either the Objective-C runtime and language or Swift standard library and language.
+
+ http://swift.org
+
+endif
diff --git a/package/foundation/foundation.hash b/package/foundation/foundation.hash
new file mode 100644
index 0000000000..45f35c4294
--- /dev/null
+++ b/package/foundation/foundation.hash
@@ -0,0 +1 @@
+sha256 21d28ad500279eb66bb8dc9e33e4c8036e1472f30e82eeb76329b69aa4b622fc foundation-5.6.1.tar.gz
diff --git a/package/foundation/foundation.mk b/package/foundation/foundation.mk
new file mode 100644
index 0000000000..3e8c71f9fe
--- /dev/null
+++ b/package/foundation/foundation.mk
@@ -0,0 +1,89 @@
+### Foundation
+FOUNDATION_VERSION = 5.6.1
+FOUNDATION_SITE = $(call github,apple,swift-corelibs-foundation,swift-$(FOUNDATION_VERSION)-RELEASE)
+FOUNDATION_LICENSE = Apache-2.0
+FOUNDATION_LICENSE_FILES = LICENSE
+FOUNDATION_INSTALL_STAGING = YES
+FOUNDATION_INSTALL_TARGET = YES
+FOUNDATION_SUPPORTS_IN_SOURCE_BUILD = NO
+FOUNDATION_DEPENDENCIES = icu libxml2 libcurl swift libswiftdispatch
+
+FOUNDATION_CONF_OPTS += \
+ -DCMAKE_Swift_FLAGS=${SWIFTC_FLAGS} \
+ -DCMAKE_Swift_FLAGS_DEBUG="" \
+ -DCMAKE_Swift_FLAGS_RELEASE="" \
+ -DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+ -DCF_DEPLOYMENT_SWIFT=ON \
+ -Ddispatch_DIR="$(LIBSWIFTDISPATCH_BUILDDIR)/cmake/modules" \
+ -DICU_I18N_LIBRARY_RELEASE=${STAGING_DIR}/usr/lib/libicui18n.so \
+ -DICU_UC_LIBRARY_RELEASE=${STAGING_DIR}/usr/lib/libicuuc.so \
+ -DICU_I18N_LIBRARY_DEBUG=${STAGING_DIR}/usr/lib/libicui18n.so \
+ -DICU_UC_LIBRARY_DEBUG=${STAGING_DIR}/usr/lib/libicuuc.so \
+ -DICU_INCLUDE_DIR="${STAGING_DIR}/usr/include" \
+ -DCURL_LIBRARY_RELEASE=${STAGING_DIR}/usr/lib/libcurl.so \
+ -DCURL_INCLUDE_DIR="${STAGING_DIR}/usr/include" \
+ -DLIBXML2_LIBRARY=${STAGING_DIR}/usr/lib/libxml2.so \
+ -DLIBXML2_INCLUDE_DIR=${STAGING_DIR}/usr/include/libxml2 \
+
+ifeq (FOUNDATION_SUPPORTS_IN_SOURCE_BUILD),YES)
+FOUNDATION_BUILDDIR = $(FOUNDATION_SRCDIR)
+else
+FOUNDATION_BUILDDIR = $(FOUNDATION_SRCDIR)/build
+endif
+
+define FOUNDATION_CONFIGURE_CMDS
+ # Workaround Dispatch defined with cmake and module
+ rm -rf ${STAGING_DIR}/usr/lib/swift/dispatch
+ # Clean
+ rm -rf $(FOUNDATION_BUILDDIR)
+ rm -rf $(STAGING_DIR)/usr/lib/swift/CoreFoundation
+ # Configure
+ (mkdir -p $(FOUNDATION_BUILDDIR) && \
+ cd $(FOUNDATION_BUILDDIR) && \
+ rm -f CMakeCache.txt && \
+ PATH=$(BR_PATH):$(SWIFT_NATIVE_PATH) \
+ $(FOUNDATION_CONF_ENV) $(BR2_CMAKE) -S $(FOUNDATION_SRCDIR) -B $(FOUNDATION_BUILDDIR) -G Ninja \
+ -DCMAKE_INSTALL_PREFIX="/usr" \
+ -DBUILD_SHARED_LIBS=ON \
+ -DCMAKE_BUILD_TYPE=$(if $(BR2_ENABLE_RUNTIME_DEBUG),Debug,Release) \
+ -DCMAKE_C_COMPILER=$(SWIFT_NATIVE_PATH)/clang \
+ -DCMAKE_C_FLAGS="-w -fuse-ld=lld -target $(SWIFT_TARGET_NAME) --sysroot=$(STAGING_DIR) $(SWIFT_EXTRA_FLAGS) -I$(STAGING_DIR)/usr/include -B$(STAGING_DIR)/usr/lib -B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) -L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION))" \
+ -DCMAKE_C_LINK_FLAGS="-target $(SWIFT_TARGET_NAME) --sysroot=$(STAGING_DIR)" \
+ -DCMAKE_ASM_FLAGS="-target $(SWIFT_TARGET_NAME) --sysroot=$(STAGING_DIR)" \
+ $(FOUNDATION_CONF_OPTS) \
+ )
+endef
+
+define FOUNDATION_BUILD_CMDS
+ # Compile
+ (cd $(FOUNDATION_BUILDDIR) && ninja)
+endef
+
+define FOUNDATION_INSTALL_TARGET_CMDS
+ cp $(FOUNDATION_BUILDDIR)/lib/*.so $(TARGET_DIR)/usr/lib/
+endef
+
+define FOUNDATION_INSTALL_STAGING_CMDS
+ # Copy libraries
+ cp $(FOUNDATION_BUILDDIR)/lib/*.so $(STAGING_DIR)/usr/lib/swift/linux/
+ # Copy CoreFoundation module
+ mkdir -p ${STAGING_DIR}/usr/lib/swift/CoreFoundation
+ cp $(FOUNDATION_BUILDDIR)/CoreFoundation.framework/Headers/*.h ${STAGING_DIR}/usr/lib/swift/CoreFoundation/
+ touch ${STAGING_DIR}/usr/lib/swift/CoreFoundation/module.map
+ echo 'framework module CoreFoundation [extern_c] [system] { umbrella header "${STAGING_DIR}/usr/lib/swift/CoreFoundation/CoreFoundation.h" }' > ${STAGING_DIR}/usr/lib/swift/CoreFoundation/module.map
+ # Copy CFXMLInterface module
+ mkdir -p ${STAGING_DIR}/usr/lib/swift/CFXMLInterface
+ touch ${STAGING_DIR}/usr/lib/swift/CFXMLInterface/module.map
+ echo 'framework module CFXMLInterface [extern_c] [system] { umbrella header "${STAGING_DIR}/usr/lib/swift/CFXMLInterface/CFXMLInterface.h" }' > ${STAGING_DIR}/usr/lib/swift/CFXMLInterface/module.map
+ # Copy CFURLSessionInterface module
+ mkdir -p ${STAGING_DIR}/usr/lib/swift/CFURLSessionInterface
+ touch ${STAGING_DIR}/usr/lib/swift/CFURLSessionInterface/module.map
+ echo 'framework module CFURLSessionInterface [extern_c] [system] { umbrella header "${STAGING_DIR}/usr/lib/swift/CFURLSessionInterface/CFURLSessionInterface.h" }' > ${STAGING_DIR}/usr/lib/swift/CFURLSessionInterface/module.map
+ # Copy Swift modules
+ cp $(FOUNDATION_BUILDDIR)/swift/* ${STAGING_DIR}/usr/lib/swift/linux/$(SWIFT_TARGET_ARCH)/
+ # Restore Dispatch headers
+ $(LIBSWIFTDISPATCH_INSTALL_STAGING_CMDS)
+
+endef
+
+$(eval $(generic-package))
diff --git a/package/libdispatch/Config.in b/package/libdispatch/Config.in
new file mode 100644
index 0000000000..f4fa5e47fb
--- /dev/null
+++ b/package/libdispatch/Config.in
@@ -0,0 +1,43 @@
+config BR2_PACKAGE_LIBDISPATCH_ARCH_SUPPORTS
+ bool
+ default y if BR2_x86_64
+ default y if BR2_aarch64
+ default y if BR2_arm
+ default y if BR2_powerpc
+ default y if BR2_mips
+ default y if BR2_mipsel
+ default y if BR2_mips64
+ default y if BR2_mips64el
+ default y if BR2_RISCV_64
+
+config BR2_PACKAGE_LIBDISPATCH_TARGET_ARCH
+ string
+ default "aarch64" if BR2_aarch64
+ default "armv5" if BR2_ARM_CPU_ARMV5
+ default "armv6" if BR2_ARM_CPU_ARMV6
+ default "armv7" if BR2_ARM_CPU_ARMV7A
+ default "x86_64" if BR2_x86_64
+ default "powerpc" if BR2_powerpc
+ default "mips" if BR2_mips
+ default "mipsel" if BR2_mipsel
+ default "mips64" if BR2_mips64
+ default "mips64el" if BR2_mips64el
+ default "riscv64" if BR2_RISCV_64
+
+config BR2_PACKAGE_LIBDISPATCH
+ bool "libdispatch"
+ depends on BR2_PACKAGE_LIBDISPATCH_ARCH_SUPPORTS
+ depends on BR2_TOOLCHAIN_HAS_THREADS
+ depends on !BR2_STATIC_LIBS
+ depends on BR2_TOOLCHAIN_USES_GLIBC
+ select BR2_PACKAGE_LIBBSD
+
+ help
+ Grand Central Dispatch (GCD or libdispatch) provides comprehensive support for concurrent code execution on multicore hardware.
+
+ http://swift.org
+
+comment "libdispatch needs a toolchain w/ Glibc, wchar, threads, C++, dynamic library"
+ depends on BR2_PACKAGE_LIBDISPATCH_ARCH_SUPPORTS
+ depends on !BR2_TOOLCHAIN_USES_GLIBC || !BR2_TOOLCHAIN_HAS_THREADS || !BR2_INSTALL_LIBSTDCPP \
+ || BR2_STATIC_LIBS || !BR2_USE_WCHAR
\ No newline at end of file
diff --git a/package/libdispatch/arm-yield.patch b/package/libdispatch/arm-yield.patch
new file mode 100644
index 0000000000..fa7cf7cce4
--- /dev/null
+++ b/package/libdispatch/arm-yield.patch
@@ -0,0 +1,13 @@
+diff --git a/src/shims/yield.c b/src/shims/yield.c
+index 43f0017..d0c5fff 100644
+--- a/src/shims/yield.c
++++ b/src/shims/yield.c
+@@ -36,7 +36,7 @@ void *
+ _dispatch_wait_for_enqueuer(void **ptr)
+ {
+ #if !DISPATCH_HW_CONFIG_UP
+-#if defined(__arm__) || defined(__arm64__)
++#if (defined(__arm__) && defined(__APPLE__)) || defined(__arm64__)
+ int spins = DISPATCH_WAIT_SPINS_WFE;
+ void *value;
+ while (unlikely(spins-- > 0)) {
diff --git a/package/libdispatch/libdispatch.hash b/package/libdispatch/libdispatch.hash
new file mode 100644
index 0000000000..8ca1a5a626
--- /dev/null
+++ b/package/libdispatch/libdispatch.hash
@@ -0,0 +1 @@
+sha256 856c9ffcf2ab2bbb28a6e0fa344277fc41aa0771419b283c7c4db69dad2b4cf9 libdispatch-5.6.1.tar.gz
diff --git a/package/libdispatch/libdispatch.mk b/package/libdispatch/libdispatch.mk
new file mode 100644
index 0000000000..742c122481
--- /dev/null
+++ b/package/libdispatch/libdispatch.mk
@@ -0,0 +1,58 @@
+### Grand Central Dispatch
+LIBDISPATCH_VERSION = 5.6.1
+LIBDISPATCH_SITE = $(call github,apple,swift-corelibs-libdispatch,swift-$(LIBDISPATCH_VERSION)-RELEASE)
+LIBDISPATCH_LICENSE = Apache-2.0
+LIBDISPATCH_LICENSE_FILES = LICENSE
+LIBDISPATCH_INSTALL_STAGING = YES
+LIBDISPATCH_SUPPORTS_IN_SOURCE_BUILD = NO
+LIBDISPATCH_DEPENDENCIES = libbsd
+
+LIBDISPATCH_TARGET_ARCH = $(call qstrip,$(BR2_PACKAGE_LIBDISPATCH_TARGET_ARCH))
+
+ifeq ($(BR2_PACKAGE_SWIFT),y)
+LIBDISPATCH_CLANG_PATH = $(SWIFT_NATIVE_PATH)
+else
+LIBDISPATCH_CLANG_PATH = $(HOST_DIR)/bin
+LIBDISPATCH_DEPENDENCIES += host-clang host-lld
+endif
+
+ifeq ($(LIBDISPATCH_TARGET_ARCH),armv7)
+LIBDISPATCH_TARGET_NAME = armv7-unknown-linux-gnueabihf
+else ifeq ($(LIBDISPATCH_TARGET_ARCH),armv6)
+LIBDISPATCH_TARGET_NAME = armv6-unknown-linux-gnueabihf
+else ifeq ($(LIBDISPATCH_TARGET_ARCH),armv5)
+LIBDISPATCH_TARGET_NAME = armv5-unknown-linux-gnueabi
+else
+LIBDISPATCH_TARGET_NAME = $(LIBDISPATCH_TARGET_ARCH)-unknown-linux-gnu
+endif
+
+ifeq ($(LIBDISPATCH_TARGET_ARCH),armv5)
+LIBDISPATCH_EXTRA_FLAGS = -march=armv5te
+else ifeq ($(LIBDISPATCH_TARGET_ARCH),riscv64)
+LIBDISPATCH_EXTRA_FLAGS = -mno-relax -mabi=lp64 -march=rv64imac -mfloat-abi=soft
+else ifeq ($(LIBDISPATCH_TARGET_ARCH),mipsel)
+LIBDISPATCH_EXTRA_FLAGS = -msoft-float
+else ifeq ($(LIBDISPATCH_TARGET_ARCH),mips64el)
+LIBDISPATCH_EXTRA_FLAGS = -msoft-float
+else ifeq ($(LIBDISPATCH_TARGET_ARCH),powerpc)
+LIBDISPATCH_EXTRA_FLAGS = -mcpu=7400
+else
+LIBDISPATCH_EXTRA_FLAGS =
+endif
+
+LIBDISPATCH_CONF_OPTS += \
+ -DLibRT_LIBRARIES="${STAGING_DIR}/usr/lib/librt.a" \
+ -DCMAKE_C_COMPILER=$(LIBDISPATCH_CLANG_PATH)/clang \
+ -DCMAKE_CXX_COMPILER=$(LIBDISPATCH_CLANG_PATH)/clang++ \
+ -DCMAKE_C_FLAGS="-w -fuse-ld=lld $(LIBDISPATCH_EXTRA_FLAGS) -target $(LIBDISPATCH_TARGET_NAME) --sysroot=$(STAGING_DIR) -I$(STAGING_DIR)/usr/include -B$(STAGING_DIR)/usr/lib -B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) -L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION))" \
+ -DCMAKE_C_LINK_FLAGS="-target $(LIBDISPATCH_TARGET_NAME) --sysroot=$(STAGING_DIR)" \
+ -DCMAKE_CXX_FLAGS="-w -fuse-ld=lld $(LIBDISPATCH_EXTRA_FLAGS) -target $(LIBDISPATCH_TARGET_NAME) --sysroot=$(STAGING_DIR) -I$(STAGING_DIR)/usr/include -I$(HOST_DIR)/$(GNU_TARGET_NAME)/include/c++/$(call qstrip,$(BR2_GCC_VERSION))/ -I$(HOST_DIR)/$(GNU_TARGET_NAME)/include/c++/$(call qstrip,$(BR2_GCC_VERSION))/$(GNU_TARGET_NAME) -B$(STAGING_DIR)/usr/lib -B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) -L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION))" \
+ -DCMAKE_CXX_LINK_FLAGS="-target $(LIBDISPATCH_TARGET_NAME) --sysroot=$(STAGING_DIR)" \
+
+define LIBDISPATCH_INSTALL_TARGET_CMDS
+ (cd $(LIBDISPATCH_BUILDDIR) && \
+ cp ./*.so $(TARGET_DIR)/usr/lib/ \
+ )
+endef
+
+$(eval $(cmake-package))
diff --git a/package/libswiftdispatch/Config.in b/package/libswiftdispatch/Config.in
new file mode 100644
index 0000000000..c16ed3217c
--- /dev/null
+++ b/package/libswiftdispatch/Config.in
@@ -0,0 +1,12 @@
+config BR2_PACKAGE_LIBSWIFTDISPATCH
+ bool "libswiftdispatch"
+ depends on BR2_TOOLCHAIN_HAS_THREADS
+ depends on !BR2_STATIC_LIBS
+ depends on BR2_TOOLCHAIN_USES_GLIBC
+ depends on BR2_PACKAGE_LIBBSD
+ depends on BR2_PACKAGE_SWIFT
+
+ help
+ Swift overlay for libdispatch.
+
+ http://swift.org
diff --git a/package/libswiftdispatch/arm-yield.patch b/package/libswiftdispatch/arm-yield.patch
new file mode 100644
index 0000000000..fa7cf7cce4
--- /dev/null
+++ b/package/libswiftdispatch/arm-yield.patch
@@ -0,0 +1,13 @@
+diff --git a/src/shims/yield.c b/src/shims/yield.c
+index 43f0017..d0c5fff 100644
+--- a/src/shims/yield.c
++++ b/src/shims/yield.c
+@@ -36,7 +36,7 @@ void *
+ _dispatch_wait_for_enqueuer(void **ptr)
+ {
+ #if !DISPATCH_HW_CONFIG_UP
+-#if defined(__arm__) || defined(__arm64__)
++#if (defined(__arm__) && defined(__APPLE__)) || defined(__arm64__)
+ int spins = DISPATCH_WAIT_SPINS_WFE;
+ void *value;
+ while (unlikely(spins-- > 0)) {
diff --git a/package/libswiftdispatch/libswiftdispatch.hash b/package/libswiftdispatch/libswiftdispatch.hash
new file mode 100644
index 0000000000..9b315731e7
--- /dev/null
+++ b/package/libswiftdispatch/libswiftdispatch.hash
@@ -0,0 +1 @@
+sha256 856c9ffcf2ab2bbb28a6e0fa344277fc41aa0771419b283c7c4db69dad2b4cf9 libswiftdispatch-5.6.1.tar.gz
diff --git a/package/libswiftdispatch/libswiftdispatch.mk b/package/libswiftdispatch/libswiftdispatch.mk
new file mode 100644
index 0000000000..650bbc5f1a
--- /dev/null
+++ b/package/libswiftdispatch/libswiftdispatch.mk
@@ -0,0 +1,68 @@
+### Grand Central Dispatch with Swift overlay
+LIBSWIFTDISPATCH_VERSION = 5.6.1
+LIBSWIFTDISPATCH_SITE = $(call github,apple,swift-corelibs-libdispatch,swift-$(LIBSWIFTDISPATCH_VERSION)-RELEASE)
+LIBSWIFTDISPATCH_LICENSE = Apache-2.0
+LIBSWIFTDISPATCH_LICENSE_FILES = LICENSE
+LIBSWIFTDISPATCH_INSTALL_STAGING = YES
+LIBSWIFTDISPATCH_INSTALL_TARGET = YES
+LIBSWIFTDISPATCH_SUPPORTS_IN_SOURCE_BUILD = NO
+LIBSWIFTDISPATCH_DEPENDENCIES = libbsd swift
+
+LIBSWIFTDISPATCH_CONF_OPTS += \
+ -DLibRT_LIBRARIES="${STAGING_DIR}/usr/lib/librt.a" \
+ -DENABLE_SWIFT=YES \
+ -DCMAKE_Swift_FLAGS=${SWIFTC_FLAGS} \
+ -DCMAKE_Swift_FLAGS_DEBUG="" \
+ -DCMAKE_Swift_FLAGS_RELEASE="" \
+ -DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+ifeq (LIBSWIFTDISPATCH_SUPPORTS_IN_SOURCE_BUILD),YES)
+LIBSWIFTDISPATCH_BUILDDIR = $(LIBSWIFTDISPATCH_SRCDIR)
+else
+LIBSWIFTDISPATCH_BUILDDIR = $(LIBSWIFTDISPATCH_SRCDIR)/build
+endif
+
+define LIBSWIFTDISPATCH_CONFIGURE_CMDS
+ # Configure for Ninja
+ (mkdir -p $(LIBSWIFTDISPATCH_BUILDDIR) && \
+ cd $(LIBSWIFTDISPATCH_BUILDDIR) && \
+ rm -f CMakeCache.txt && \
+ PATH=$(BR_PATH):$(SWIFT_NATIVE_PATH) \
+ $(LIBSWIFTDISPATCH_CONF_ENV) $(BR2_CMAKE) -S $(LIBSWIFTDISPATCH_SRCDIR) -B $(LIBSWIFTDISPATCH_BUILDDIR) -G Ninja \
+ -DCMAKE_INSTALL_PREFIX="$(STAGING_DIR)/usr" \
+ -DCMAKE_COLOR_MAKEFILE=OFF \
+ -DBUILD_DOC=OFF \
+ -DBUILD_DOCS=OFF \
+ -DBUILD_EXAMPLE=OFF \
+ -DBUILD_EXAMPLES=OFF \
+ -DBUILD_TEST=OFF \
+ -DBUILD_TESTS=OFF \
+ -DBUILD_TESTING=OFF \
+ -DBUILD_SHARED_LIBS=ON \
+ -DCMAKE_BUILD_TYPE=$(if $(BR2_ENABLE_RUNTIME_DEBUG),Debug,Release) \
+ -DCMAKE_C_COMPILER=$(SWIFT_NATIVE_PATH)/clang \
+ -DCMAKE_CXX_COMPILER=$(SWIFT_NATIVE_PATH)/clang++ \
+ -DCMAKE_C_FLAGS="-w -fuse-ld=lld -target $(SWIFT_TARGET_NAME) --sysroot=$(STAGING_DIR) $(SWIFT_EXTRA_FLAGS) -I$(STAGING_DIR)/usr/include -B$(STAGING_DIR)/usr/lib -B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) -L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION))" \
+ -DCMAKE_C_LINK_FLAGS="-target $(SWIFT_TARGET_NAME) --sysroot=$(STAGING_DIR)" \
+ -DCMAKE_CXX_FLAGS="-w -fuse-ld=lld -target $(SWIFT_TARGET_NAME) --sysroot=$(STAGING_DIR) $(SWIFT_EXTRA_FLAGS) -I$(STAGING_DIR)/usr/include -I$(HOST_DIR)/$(GNU_TARGET_NAME)/include/c++/$(call qstrip,$(BR2_GCC_VERSION))/ -I$(HOST_DIR)/$(GNU_TARGET_NAME)/include/c++/$(call qstrip,$(BR2_GCC_VERSION))/$(GNU_TARGET_NAME) -B$(STAGING_DIR)/usr/lib -B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) -L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION))" \
+ -DCMAKE_CXX_LINK_FLAGS="-target $(SWIFT_TARGET_NAME) --sysroot=$(STAGING_DIR)" \
+ $(LIBSWIFTDISPATCH_CONF_OPTS) \
+ )
+endef
+
+define LIBSWIFTDISPATCH_BUILD_CMDS
+ # Compile
+ (cd $(LIBSWIFTDISPATCH_BUILDDIR) && ninja)
+endef
+
+define LIBSWIFTDISPATCH_INSTALL_TARGET_CMDS
+ (cd $(LIBSWIFTDISPATCH_BUILDDIR) && \
+ cp ./*.so $(TARGET_DIR)/usr/lib/ \
+ )
+endef
+
+define LIBSWIFTDISPATCH_INSTALL_STAGING_CMDS
+ (cd $(LIBSWIFTDISPATCH_BUILDDIR) && ninja install)
+endef
+
+$(eval $(generic-package))
diff --git a/package/pkg-swift.mk b/package/pkg-swift.mk
new file mode 100644
index 0000000000..1efb0dc52a
--- /dev/null
+++ b/package/pkg-swift.mk
@@ -0,0 +1,147 @@
+################################################################################
+# Swift package infrastructure
+#
+# This file implements an infrastructure that eases development of package .mk
+# files for Swift packages. It should be used for all packages that are written in
+# Swift.
+#
+# See the Buildroot documentation for details on the usage of this
+# infrastructure
+#
+#
+# In terms of implementation, this swift infrastructure requires the .mk file
+# to only specify metadata information about the package: name, version,
+# download URL, etc.
+#
+# We still allow the package .mk file to override what the different steps are
+# doing, if needed. For example, if <PKG>_BUILD_CMDS is already defined, it is
+# used as the list of commands to perform to build the package, instead of the
+# default swift behavior. The package can also define some post operation
+# hooks.
+#
+################################################################################
+
+HOST_SWIFT_SUPPORT_DIR = $(HOST_DIR)/usr/share/swift
+SWIFT_BIN = $(HOST_SWIFT_SUPPORT_DIR)/bin/swift
+SWIFT_DESTINATION_FILE = $(HOST_SWIFT_SUPPORT_DIR)/toolchain.json
+
+################################################################################
+# inner-swift-package -- defines how the configuration, compilation and
+# installation of a Go package should be done, implements a few hooks to tune
+# the build process for Go specificities and calls the generic package
+# infrastructure to generate the necessary make targets
+#
+# argument 1 is the lowercase package name
+# argument 2 is the uppercase package name, including a HOST_ prefix for host
+# packages
+# argument 3 is the uppercase package name, without the HOST_ prefix for host
+# packages
+# argument 4 is the type (target or host)
+#
+################################################################################
+
+define inner-swift-package
+
+$(2)_BUILDDIR = $$($(2)_SRCDIR)/.build/$(if $(BR2_ENABLE_RUNTIME_DEBUG),debug,release)
+
+$(2)_BUILD_OPTS += \
+ --configuration $(if $(BR2_ENABLE_RUNTIME_DEBUG),debug,release) \
+ -j $$(PARALLEL_JOBS) \
+
+# Target packages need the Swift compiler and runtime
+$(2)_DEPENDENCIES += swift
+
+# Build step. Only define it if not already defined by the package .mk
+# file.
+ifndef $(2)_BUILD_CMDS
+ifeq ($(4),target)
+
+# Build package for target
+define $(2)_BUILD_CMDS
+ ( \
+ cd $$($(2)_SRCDIR) && \
+ PATH=$(BR_PATH):$(HOST_SWIFT_SUPPORT_DIR)/bin \
+ $(SWIFT_BIN) build \
+ --destination $(SWIFT_DESTINATION_FILE) \
+ $$($(2)_BUILD_OPTS) \
+ )
+endef
+else
+# Build package for host
+define $(2)_BUILD_CMDS
+ ( \
+ cd $$($(2)_SRCDIR) && \
+ PATH=$(BR_PATH):$(HOST_SWIFT_SUPPORT_DIR)/bin \
+ $(SWIFT_BIN) build \
+ $(2)_BUILD_OPTS \
+ )
+endef
+endif
+endif
+
+#
+# Staging installation step. Only define it if not already defined by
+# the package .mk file.
+#
+ifndef $(2)_INSTALL_STAGING_CMDS
+define $(2)_INSTALL_STAGING_CMDS
+ # Copy executables
+ $$(foreach d,$$($(2)_EXECUTABLES),\
+ cp -f $$($(2)_BUILDDIR)/$$(d) $(STAGING_DIR)/usr/bin/
+ )
+ # Copy dynamic libraries
+ $$(foreach d,$$($(2)_LIBRARIES),\
+ cp -f $$($(2)_BUILDDIR)/lib$$(d).so $(STAGING_DIR)/usr/lib/swift/linux/
+ cp -f $$($(2)_BUILDDIR)/$$(d).swiftdoc $(STAGING_DIR)/usr/lib/swift/linux/$(call qstrip,$(BR2_PACKAGE_SWIFT_TARGET_ARCH))/
+ cp -f $$($(2)_BUILDDIR)/$$(d).swiftmodule $(STAGING_DIR)/usr/lib/swift/linux/$(call qstrip,$(BR2_PACKAGE_SWIFT_TARGET_ARCH))/
+ cp -f $$($(2)_BUILDDIR)/$$(d).swiftsourceinfo $(STAGING_DIR)/usr/lib/swift/linux/$(call qstrip,$(BR2_PACKAGE_SWIFT_TARGET_ARCH))/
+ cp -f $$($(2)_BUILDDIR)/$$(d).abi.json $(STAGING_DIR)/usr/lib/swift/linux/$(call qstrip,$(BR2_PACKAGE_SWIFT_TARGET_ARCH))/
+ )
+endef
+endif
+
+# Target installation step. Only define it if not already defined by the
+# package .mk file.
+ifndef $(2)_INSTALL_TARGET_CMDS
+define $(2)_INSTALL_TARGET_CMDS
+ # Copy executables
+ $$(foreach d,$$($(2)_EXECUTABLES),\
+ cp -f $$($(2)_BUILDDIR)/$$(d) $(TARGET_DIR)/usr/bin/
+ )
+ # Copy dynamic libraries
+ $$(foreach d,$$($(2)_LIBRARIES),\
+ cp -f $$($(2)_BUILDDIR)/lib$$(d).so $(TARGET_DIR)/usr/lib/
+ )
+endef
+endif
+
+# Host installation step
+ifndef $(2)_INSTALL_CMDS
+define $(2)_INSTALL_CMDS
+ # Copy executables
+ $$(foreach d,$$($(2)_EXECUTABLES),\
+ cp -f $$($(2)_BUILDDIR)/$$(d) $(HOST_DIR)/usr/bin/
+ )
+ # Copy dynamic libraries
+ $$(foreach d,$$($(2)_LIBRARIES),\
+ cp -f $$($(2)_BUILDDIR)/lib$$(d).so $(HOST_DIR)/usr/lib/swift/linux/
+ cp -f $$($(2)_BUILDDIR)/lib$$(d).swiftdoc $(HOST_DIR)/usr/lib/swift/linux/$(call qstrip,$(BR2_PACKAGE_SWIFT_TARGET_ARCH))/
+ cp -f $$($(2)_BUILDDIR)/lib$$(d).swiftmodule $(HOST_DIR)/usr/lib/swift/linux/$(call qstrip,$(BR2_PACKAGE_SWIFT_TARGET_ARCH))/
+ cp -f $$($(2)_BUILDDIR)/lib$$(d).swiftsourceinfo $(HOST_DIR)/usr/lib/swift/linux/$(call qstrip,$(BR2_PACKAGE_SWIFT_TARGET_ARCH))/
+ cp -f $$($(2)_BUILDDIR)/lib$$(d).abi.json $(HOST_DIR)/usr/lib/swift/linux/$(call qstrip,$(BR2_PACKAGE_SWIFT_TARGET_ARCH))/
+ )
+endef
+endif
+
+# Call the generic package infrastructure to generate the necessary make
+# targets
+$(call inner-generic-package,$(1),$(2),$(3),$(4))
+
+endef # inner-swift-package
+
+################################################################################
+# swift-package -- the target generator macro for Swift packages
+################################################################################
+
+swift-package = $(call inner-swift-package,$(pkgname),$(call UPPERCASE,$(pkgname)),$(call UPPERCASE,$(pkgname)),target)
+host-swift-package = $(call inner-swift-package,host-$(pkgname),$(call UPPERCASE,host-$(pkgname)),$(call UPPERCASE,$(pkgname)),host)
diff --git a/package/swift/Config.in b/package/swift/Config.in
new file mode 100644
index 0000000000..97c59a8b70
--- /dev/null
+++ b/package/swift/Config.in
@@ -0,0 +1,55 @@
+config BR2_PACKAGE_SWIFT_ARCH_SUPPORTS
+ bool
+ default y if BR2_x86_64
+ default y if BR2_aarch64
+ default y if BR2_arm
+ default y if BR2_powerpc
+ default y if BR2_mips
+ default y if BR2_mipsel
+ default y if BR2_mips64
+ default y if BR2_mips64el
+ default y if BR2_RISCV_64
+
+config BR2_PACKAGE_SWIFT_TARGET_ARCH
+ string
+ default "aarch64" if BR2_aarch64
+ default "armv5" if BR2_ARM_CPU_ARMV5
+ default "armv6" if BR2_ARM_CPU_ARMV6
+ default "armv7" if BR2_ARM_CPU_ARMV7A
+ default "x86_64" if BR2_x86_64
+ default "powerpc" if BR2_powerpc
+ default "mips" if BR2_mips
+ default "mipsel" if BR2_mipsel
+ default "mips64" if BR2_mips64
+ default "mips64el" if BR2_mips64el
+ default "riscv64" if BR2_RISCV_64
+
+config BR2_PACKAGE_SWIFT
+ bool "swift"
+ depends on BR2_PACKAGE_SWIFT_ARCH_SUPPORTS
+ depends on BR2_TOOLCHAIN_HAS_THREADS
+ depends on !BR2_STATIC_LIBS
+ depends on BR2_TOOLCHAIN_USES_GLIBC
+ select BR2_PACKAGE_ICU
+ select BR2_PACKAGE_LIBDISPATCH
+ help
+ Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
+
+ http://swift.org
+
+if BR2_PACKAGE_SWIFT || BR2_PACKAGE_LIBDISPATCH
+
+config BR2_PACKAGE_SWIFT_NATIVE_TOOLS
+ string "Path to host Swift toolchain"
+ default "/usr/bin"
+
+config BR2_PACKAGE_SWIFT_LLVM_DIR
+ string "Path to host LLVM library path"
+ default "/usr/lib/llvm-12"
+
+endif
+
+comment "swift needs a toolchain w/ Glibc, ICU, wchar, threads, C++, dynamic library"
+ depends on BR2_PACKAGE_SWIFT_ARCH_SUPPORTS
+ depends on !BR2_TOOLCHAIN_USES_GLIBC || !BR2_TOOLCHAIN_HAS_THREADS || !BR2_INSTALL_LIBSTDCPP \
+ || BR2_STATIC_LIBS || !BR2_USE_WCHAR
diff --git a/package/swift/Float16.patch b/package/swift/Float16.patch
new file mode 100644
index 0000000000..2768d0cd20
--- /dev/null
+++ b/package/swift/Float16.patch
@@ -0,0 +1,13 @@
+diff --git a/stdlib/public/runtime/Float16Support.cpp b/stdlib/public/runtime/Float16Support.cpp
+index 817739d4cdf..b1896a4e364 100644
+--- a/stdlib/public/runtime/Float16Support.cpp
++++ b/stdlib/public/runtime/Float16Support.cpp
+@@ -29,7 +29,7 @@
+
+ // Android NDK <r21 do not provide `__aeabi_d2h` in the compiler runtime,
+ // provide shims in that case.
+-#if (defined(__ANDROID__) && defined(__ARM_ARCH_7A__) && defined(__ARM_EABI__)) || \
++#if ((defined(__ANDROID__) || defined(__linux__)) && defined(__arm__)) || \
+ ((defined(__i386__) || defined(__i686__) || defined(__x86_64__)) && !defined(__APPLE__))
+
+ #include "../SwiftShims/Visibility.h"
diff --git a/package/swift/RefCount.h.diff b/package/swift/RefCount.h.diff
new file mode 100644
index 0000000000..332ff549dc
--- /dev/null
+++ b/package/swift/RefCount.h.diff
@@ -0,0 +1,18 @@
+diff --git a/stdlib/public/SwiftShims/RefCount.h b/stdlib/public/SwiftShims/RefCount.h
+index 5c8211f5e9f..fe54839aaae 100644
+--- a/stdlib/public/SwiftShims/RefCount.h
++++ b/stdlib/public/SwiftShims/RefCount.h
+@@ -1319,7 +1319,12 @@ class HeapObjectSideTableEntry {
+
+ public:
+ HeapObjectSideTableEntry(HeapObject *newObject)
+- : object(newObject), refCounts()
++ : object(newObject),
++#if __arm__ // https://bugs.swift.org/browse/SR-5846
++ refCounts(SideTableRefCounts::Initialized)
++#else
++ refCounts()
++#endif
+ { }
+
+ #pragma clang diagnostic push
diff --git a/package/swift/swift-5.6-armv5.patch b/package/swift/swift-5.6-armv5.patch
new file mode 100644
index 0000000000..61557a6e62
--- /dev/null
+++ b/package/swift/swift-5.6-armv5.patch
@@ -0,0 +1,161 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index bc9b6790922..5c15bc7048b 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -713,6 +713,8 @@ else()
+ set(SWIFT_HOST_VARIANT_ARCH_default "powerpc64le")
+ elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "s390x")
+ set(SWIFT_HOST_VARIANT_ARCH_default "s390x")
++ elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "armv5|armv5te")
++ set(SWIFT_HOST_VARIANT_ARCH_default "armv5")
+ # FIXME: Only matches v6l/v7l - by far the most common variants
+ elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv6l")
+ set(SWIFT_HOST_VARIANT_ARCH_default "armv6")
+diff --git a/cmake/modules/AddSwift.cmake b/cmake/modules/AddSwift.cmake
+index a448bcb23c4..4bafb119105 100644
+--- a/cmake/modules/AddSwift.cmake
++++ b/cmake/modules/AddSwift.cmake
+@@ -338,7 +338,7 @@ function(_add_host_variant_link_flags target)
+ target_link_libraries(${target} PRIVATE
+ pthread
+ dl)
+- if("${SWIFT_HOST_VARIANT_ARCH}" MATCHES "armv6|armv7|i686")
++ if("${SWIFT_HOST_VARIANT_ARCH}" MATCHES "armv5|armv6|armv7|i686")
+ target_link_libraries(${target} PRIVATE atomic)
+ endif()
+ elseif(SWIFT_HOST_VARIANT_SDK STREQUAL FREEBSD)
+diff --git a/cmake/modules/AddSwiftUnittests.cmake b/cmake/modules/AddSwiftUnittests.cmake
+index 54a3138bec7..4b9dcf11197 100644
+--- a/cmake/modules/AddSwiftUnittests.cmake
++++ b/cmake/modules/AddSwiftUnittests.cmake
+@@ -37,7 +37,7 @@ function(add_swift_unittest test_dirname)
+ if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64")
+ target_compile_options(${test_dirname} PRIVATE
+ -march=core2)
+- elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "armv6|armv7|i686")
++ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "armv5|armv6|armv7|i686")
+ set_property(TARGET "${test_dirname}" APPEND PROPERTY LINK_LIBRARIES
+ "atomic")
+ endif()
+diff --git a/cmake/modules/SwiftConfigureSDK.cmake b/cmake/modules/SwiftConfigureSDK.cmake
+index 3c866f2e65c..103f1296fad 100644
+--- a/cmake/modules/SwiftConfigureSDK.cmake
++++ b/cmake/modules/SwiftConfigureSDK.cmake
+@@ -323,7 +323,9 @@ macro(configure_sdk_unix name architectures)
+ endif()
+
+ if("${prefix}" STREQUAL "LINUX")
+- if(arch MATCHES "(armv6|armv7)")
++ if(arch MATCHES "(armv5)")
++ set(SWIFT_SDK_LINUX_ARCH_${arch}_TRIPLE "${arch}-unknown-linux-gnueabi")
++ elseif(arch MATCHES "(armv6|armv7)")
+ set(SWIFT_SDK_LINUX_ARCH_${arch}_TRIPLE "${arch}-unknown-linux-gnueabihf")
+ elseif(arch MATCHES "(aarch64|i686|powerpc64|powerpc64le|s390x|x86_64)")
+ set(SWIFT_SDK_LINUX_ARCH_${arch}_TRIPLE "${arch}-unknown-linux-gnu")
+diff --git a/cmake/modules/SwiftSetIfArchBitness.cmake b/cmake/modules/SwiftSetIfArchBitness.cmake
+index fa29d77fe26..74a43e33343 100644
+--- a/cmake/modules/SwiftSetIfArchBitness.cmake
++++ b/cmake/modules/SwiftSetIfArchBitness.cmake
+@@ -9,6 +9,7 @@ function(set_if_arch_bitness var_name)
+ if("${SIA_ARCH}" STREQUAL "i386" OR
+ "${SIA_ARCH}" STREQUAL "i686" OR
+ "${SIA_ARCH}" STREQUAL "x86" OR
++ "${SIA_ARCH}" STREQUAL "armv5" OR
+ "${SIA_ARCH}" STREQUAL "armv6" OR
+ "${SIA_ARCH}" STREQUAL "armv7" OR
+ "${SIA_ARCH}" STREQUAL "armv7k" OR
+diff --git a/lib/Basic/Platform.cpp b/lib/Basic/Platform.cpp
+index 141655332d8..47759ba6b8e 100644
+--- a/lib/Basic/Platform.cpp
++++ b/lib/Basic/Platform.cpp
+@@ -218,6 +218,8 @@ StringRef swift::getMajorArchitectureName(const llvm::Triple &Triple) {
+ return "armv7";
+ case llvm::Triple::SubArchType::ARMSubArch_v6:
+ return "armv6";
++ case llvm::Triple::SubArchType::ARMSubArch_v5:
++ return "armv5";
+ default:
+ break;
+ }
+diff --git a/lib/IDE/Utils.cpp b/lib/IDE/Utils.cpp
+index fe5d0111dee..a92f0d01790 100644
+--- a/lib/IDE/Utils.cpp
++++ b/lib/IDE/Utils.cpp
+@@ -401,6 +401,10 @@ static std::string adjustClangTriple(StringRef TripleStr) {
+ OS << "armv6k"; break;
+ case llvm::Triple::SubArchType::ARMSubArch_v6t2:
+ OS << "armv6t2"; break;
++ case llvm::Triple::SubArchType::ARMSubArch_v5:
++ OS << "armv5"; break;
++ case llvm::Triple::SubArchType::ARMSubArch_v5te:
++ OS << "armv5te"; break;
+ default:
+ // Adjust i386-macosx to x86_64 because there is no Swift stdlib for i386.
+ if ((Triple.getOS() == llvm::Triple::MacOSX ||
+diff --git a/stdlib/cmake/modules/AddSwiftStdlib.cmake b/stdlib/cmake/modules/AddSwiftStdlib.cmake
+index 104cea4df59..2cf19b3e5bb 100644
+--- a/stdlib/cmake/modules/AddSwiftStdlib.cmake
++++ b/stdlib/cmake/modules/AddSwiftStdlib.cmake
+@@ -404,7 +404,7 @@ function(_add_target_variant_link_flags)
+ MACCATALYST_BUILD_FLAVOR "${LFLAGS_MACCATALYST_BUILD_FLAVOR}")
+ if("${LFLAGS_SDK}" STREQUAL "LINUX")
+ list(APPEND link_libraries "pthread" "dl")
+- if("${LFLAGS_ARCH}" MATCHES "armv6|armv7|i686")
++ if("${LFLAGS_ARCH}" MATCHES "armv5|armv6|armv7|i686")
+ list(APPEND link_libraries "atomic")
+ endif()
+ elseif("${LFLAGS_SDK}" STREQUAL "FREEBSD")
+diff --git a/utils/build-script-impl b/utils/build-script-impl
+index 074e6f6cad2..fc05eee2894 100755
+--- a/utils/build-script-impl
++++ b/utils/build-script-impl
+@@ -452,6 +452,7 @@ function verify_host_is_supported() {
+ | haiku-x86_64 \
+ | linux-x86_64 \
+ | linux-i686 \
++ | linux-armv5 \
+ | linux-armv6 \
+ | linux-armv7 \
+ | linux-aarch64 \
+@@ -545,6 +546,10 @@ function set_build_options_for_host() {
+ ;;
+ esac
+ ;;
++ linux-armv5)
++ SWIFT_HOST_TRIPLE="armv5-unknown-linux-gnueabi"
++ llvm_target_arch="ARM"
++ ;;
+ linux-armv6)
+ SWIFT_HOST_TRIPLE="armv6-unknown-linux-gnueabihf"
+ llvm_target_arch="ARM"
+@@ -1099,7 +1104,7 @@ function false_true() {
+ CROSS_COMPILE_HOSTS=($CROSS_COMPILE_HOSTS)
+ for t in "${CROSS_COMPILE_HOSTS[@]}"; do
+ case ${t} in
+- macosx* | iphone* | appletv* | watch* | linux-armv6 | linux-armv7 | android-* )
++ macosx* | iphone* | appletv* | watch*| linux-armv5 | linux-armv6 | linux-armv7 | android-* )
+ ;;
+ *)
+ echo "Unknown host to cross-compile for: ${t}"
+diff --git a/utils/swift_build_support/swift_build_support/targets.py b/utils/swift_build_support/swift_build_support/targets.py
+index 05966defe28..e69c4272a02 100644
+--- a/utils/swift_build_support/swift_build_support/targets.py
++++ b/utils/swift_build_support/swift_build_support/targets.py
+@@ -224,6 +224,7 @@ class StdlibDeploymentTarget(object):
+ Linux = Platform("linux", archs=[
+ "x86_64",
+ "i686",
++ "armv5",
+ "armv6",
+ "armv7",
+ "aarch64",
+@@ -304,6 +305,9 @@ class StdlibDeploymentTarget(object):
+ elif machine.startswith('armv6'):
+ # linux-armv6* is canonicalized to 'linux-armv6'
+ return StdlibDeploymentTarget.Linux.armv6
++ elif machine.startswith('armv5'):
++ # linux-armv5* is canonicalized to 'linux-armv5'
++ return StdlibDeploymentTarget.Linux.armv5
+ elif machine == 'aarch64':
+ return StdlibDeploymentTarget.Linux.aarch64
+ elif machine == 'ppc64':
diff --git a/package/swift/swift.hash b/package/swift/swift.hash
new file mode 100644
index 0000000000..2d47c540a5
--- /dev/null
+++ b/package/swift/swift.hash
@@ -0,0 +1 @@
+sha256 39e4e2b7343756e26627b945a384e1b828e38778b34cc5b0f3ecc23f18d22fd6 swift-5.6.1.tar.gz
diff --git a/package/swift/swift.mk b/package/swift/swift.mk
new file mode 100644
index 0000000000..a01aae8cd9
--- /dev/null
+++ b/package/swift/swift.mk
@@ -0,0 +1,235 @@
+### Apple's Swift Programming Language
+SWIFT_VERSION = 5.6.1
+SWIFT_SITE = $(call github,apple,swift,swift-$(SWIFT_VERSION)-RELEASE)
+SWIFT_LICENSE = Apache-2.0
+SWIFT_LICENSE_FILES = LICENSE.txt
+SWIFT_TARGET_ARCH = $(call qstrip,$(BR2_PACKAGE_SWIFT_TARGET_ARCH))
+SWIFT_NATIVE_PATH = $(call qstrip,$(BR2_PACKAGE_SWIFT_NATIVE_TOOLS))
+SWIFT_LLVM_DIR = $(call qstrip,$(BR2_PACKAGE_SWIFT_LLVM_DIR))
+SWIFT_INSTALL_STAGING = YES
+SWIFT_INSTALL_TARGET = YES
+SWIFT_SUPPORTS_IN_SOURCE_BUILD = NO
+SWIFT_DEPENDENCIES = host-swift icu libxml2 libbsd libdispatch
+
+ifeq ($(BR2_TOOLCHAIN_HAS_LIBATOMIC),y)
+SWIFT_CONF_ENV += LIBS="-latomic"
+endif
+
+ifeq ($(SWIFT_TARGET_ARCH),armv7)
+SWIFT_TARGET_NAME = armv7-unknown-linux-gnueabihf
+else ifeq ($(SWIFT_TARGET_ARCH),armv6)
+SWIFT_TARGET_NAME = armv6-unknown-linux-gnueabihf
+else ifeq ($(SWIFT_TARGET_ARCH),armv5)
+SWIFT_TARGET_NAME = armv5-unknown-linux-gnueabi
+else
+SWIFT_TARGET_NAME = $(SWIFT_TARGET_ARCH)-unknown-linux-gnu
+endif
+
+ifeq ($(SWIFT_TARGET_ARCH),armv7)
+SWIFT_EXTRA_FLAGS =
+else ifeq ($(SWIFT_TARGET_ARCH),armv5)
+SWIFT_EXTRA_FLAGS = -march=armv5te
+else ifeq ($(SWIFT_TARGET_ARCH),riscv64)
+SWIFT_EXTRA_FLAGS = -mno-relax -mabi=lp64 -march=rv64imac -mfloat-abi=soft
+else ifeq ($(SWIFT_TARGET_ARCH),mipsel)
+SWIFT_EXTRA_FLAGS = -msoft-float
+else ifeq ($(SWIFT_TARGET_ARCH),mips64el)
+SWIFT_EXTRA_FLAGS = -msoft-float
+else ifeq ($(SWIFT_TARGET_ARCH),powerpc)
+SWIFT_EXTRA_FLAGS = -mcpu=7400
+else
+SWIFT_EXTRA_FLAGS =
+endif
+
+SWIFTC_FLAGS="-target $(SWIFT_TARGET_NAME) -use-ld=lld \
+-resource-dir ${STAGING_DIR}/usr/lib/swift \
+-Xclang-linker -B${STAGING_DIR}/usr/lib \
+-Xclang-linker -B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) \
+-Xcc -I${STAGING_DIR}/usr/include \
+-Xcc -I$(HOST_DIR)/$(GNU_TARGET_NAME)/include/c++/$(call qstrip,$(BR2_GCC_VERSION)) \
+-Xcc -I$(HOST_DIR)/$(GNU_TARGET_NAME)/include/c++/$(call qstrip,$(BR2_GCC_VERSION))/$(GNU_TARGET_NAME) \
+-Xcc $(SWIFT_EXTRA_FLAGS) \
+-L${STAGING_DIR}/lib \
+-L${STAGING_DIR}/usr/lib \
+-L${STAGING_DIR}/usr/lib/swift \
+-L${STAGING_DIR}/usr/lib/swift/linux \
+-L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) \
+-sdk ${STAGING_DIR} \
+"
+
+ifeq (SWIFT_SUPPORTS_IN_SOURCE_BUILD),YES)
+SWIFT_BUILDDIR = $(SWIFT_SRCDIR)
+else
+SWIFT_BUILDDIR = $(SWIFT_SRCDIR)/build
+endif
+
+SWIFT_CONF_OPTS = \
+ -DCMAKE_C_COMPILER=$(SWIFT_NATIVE_PATH)/clang \
+ -DCMAKE_CXX_COMPILER=$(SWIFT_NATIVE_PATH)/clang++ \
+ -DCMAKE_C_FLAGS="-w -fuse-ld=lld -target $(SWIFT_TARGET_NAME) --sysroot $(STAGING_DIR) -latomic $(SWIFT_EXTRA_FLAGS) -I$(STAGING_DIR)/usr/include -B$(STAGING_DIR)/usr/lib -B$(STAGING_DIR)/lib -B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) -L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION))" \
+ -DCMAKE_CXX_FLAGS="-w -fuse-ld=lld -target $(SWIFT_TARGET_NAME) --sysroot $(STAGING_DIR) -latomic $(SWIFT_EXTRA_FLAGS) -I$(STAGING_DIR)/usr/include -B$(STAGING_DIR)/usr/lib -B$(STAGING_DIR)/lib -B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) -L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) -I$(HOST_DIR)/$(GNU_TARGET_NAME)/include/c++/$(call qstrip,$(BR2_GCC_VERSION))/ -I$(HOST_DIR)/$(GNU_TARGET_NAME)/include/c++/$(call qstrip,$(BR2_GCC_VERSION))/$(GNU_TARGET_NAME)" \
+ -DCMAKE_C_LINK_FLAGS="--sysroot $(STAGING_DIR) -latomic $(SWIFT_EXTRA_FLAGS)" \
+ -DCMAKE_CXX_LINK_FLAGS="--sysroot $(STAGING_DIR) -latomic $(SWIFT_EXTRA_FLAGS)" \
+ -DSWIFT_USE_LINKER=lld \
+ -DLLVM_USE_LINKER=lld \
+ -DLLVM_DIR=${SWIFT_LLVM_DIR}/lib/cmake/llvm \
+ -DLLVM_BUILD_LIBRARY_DIR=${SWIFT_LLVM_DIR} \
+ -DSWIFT_BUILD_RUNTIME_WITH_HOST_COMPILER=ON \
+ -DSWIFT_NATIVE_CLANG_TOOLS_PATH=${SWIFT_NATIVE_PATH} \
+ -DSWIFT_NATIVE_SWIFT_TOOLS_PATH=${SWIFT_NATIVE_PATH} \
+ -DSWIFT_BUILD_DYNAMIC_SDK_OVERLAY=ON \
+ -DSWIFT_BUILD_DYNAMIC_STDLIB=ON \
+ -DSWIFT_BUILD_REMOTE_MIRROR=OFF \
+ -DSWIFT_BUILD_SOURCEKIT=OFF \
+ -DSWIFT_BUILD_STDLIB_EXTRA_TOOLCHAIN_CONTENT=OFF \
+ -DSWIFT_BUILD_SYNTAXPARSERLIB=OFF \
+ -DSWIFT_BUILD_REMOTE_MIRROR=OFF \
+ -DSWIFT_ENABLE_SOURCEKIT_TESTS=OFF \
+ -DSWIFT_INCLUDE_DOCS=OFF \
+ -DSWIFT_INCLUDE_TOOLS=OFF \
+ -DSWIFT_INCLUDE_TESTS=OFF \
+ -DSWIFT_HOST_VARIANT_ARCH=${SWIFT_TARGET_ARCH} \
+ -DSWIFT_SDKS=LINUX \
+ -DSWIFT_SDK_LINUX_ARCH_${SWIFT_TARGET_ARCH}_PATH=${STAGING_DIR} \
+ -DSWIFT_SDK_LINUX_ARCH_${SWIFT_TARGET_ARCH}_LIBC_INCLUDE_DIRECTORY=${STAGING_DIR}/usr/include \
+ -DSWIFT_PATH_TO_LIBDISPATCH_SOURCE=${LIBDISPATCH_SRCDIR} \
+ -DSWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY=ON \
+ -DZLIB_LIBRARY=$(STAGING_DIR)/usr/lib/libz.so \
+
+ifeq ($(SWIFT_TARGET_ARCH),armv7)
+SWIFT_CONF_OPTS += \
+ -DCMAKE_Swift_FLAGS_DEBUG="" \
+ -DCMAKE_Swift_FLAGS_RELEASE="" \
+ -DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else ifeq ($(SWIFT_TARGET_ARCH),armv6)
+SWIFT_CONF_OPTS += \
+ -DCMAKE_Swift_FLAGS_DEBUG="" \
+ -DCMAKE_Swift_FLAGS_RELEASE="" \
+ -DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else ifeq ($(SWIFT_TARGET_ARCH),armv5)
+SWIFT_CONF_OPTS += \
+ -DCMAKE_Swift_FLAGS_DEBUG="" \
+ -DCMAKE_Swift_FLAGS_RELEASE="" \
+ -DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else ifeq ($(SWIFT_TARGET_ARCH),riscv64)
+SWIFT_CONF_OPTS += \
+ -DCMAKE_Swift_FLAGS="-Xcc -mno-relax" \
+ -DCMAKE_Swift_FLAGS_DEBUG="" \
+ -DCMAKE_Swift_FLAGS_RELEASE="" \
+ -DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else ifeq ($(SWIFT_TARGET_ARCH),mipsel)
+SWIFT_CONF_OPTS += \
+ -DCMAKE_Swift_FLAGS_DEBUG="" \
+ -DCMAKE_Swift_FLAGS_RELEASE="" \
+ -DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else ifeq ($(SWIFT_TARGET_ARCH),mips64el)
+SWIFT_CONF_OPTS += \
+ -DCMAKE_Swift_FLAGS_DEBUG="" \
+ -DCMAKE_Swift_FLAGS_RELEASE="" \
+ -DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else ifeq ($(SWIFT_TARGET_ARCH),powerpc)
+SWIFT_CONF_OPTS += \
+ -DCMAKE_Swift_FLAGS_DEBUG="" \
+ -DCMAKE_Swift_FLAGS_RELEASE="" \
+ -DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else
+endif
+
+define SWIFT_CONFIGURE_CMDS
+ # Configure for Ninja
+ (mkdir -p $(SWIFT_BUILDDIR) && \
+ cd $(SWIFT_BUILDDIR) && \
+ rm -f CMakeCache.txt && \
+ PATH=$(BR_PATH):$(SWIFT_NATIVE_PATH) \
+ $(SWIFT_CONF_ENV) $(BR2_CMAKE) -S $(SWIFT_SRCDIR) -B $(SWIFT_BUILDDIR) -G Ninja \
+ -DCMAKE_INSTALL_PREFIX="$(STAGING_DIR)/usr" \
+ -DBUILD_SHARED_LIBS=ON \
+ -DCMAKE_BUILD_TYPE=$(if $(BR2_ENABLE_RUNTIME_DEBUG),Debug,Release) \
+ $(SWIFT_CONF_OPTS) \
+ )
+endef
+
+define SWIFT_BUILD_CMDS
+ # Compile
+ (cd $(SWIFT_BUILDDIR) && ninja)
+endef
+
+define SWIFT_INSTALL_TARGET_CMDS
+ cp -f $(SWIFT_BUILDDIR)/lib/swift/linux/*.so $(TARGET_DIR)/usr/lib
+endef
+
+define SWIFT_INSTALL_STAGING_CMDS
+ # Copy runtime libraries and swift interfaces
+ (cd $(SWIFT_BUILDDIR) && ninja install)
+endef
+
+define HOST_SWIFT_INSTALL_CMDS
+ # Create Swift support directory
+ mkdir -p $(HOST_SWIFT_SUPPORT_DIR)
+ # Generate SwiftPM cross compilation toolchain file
+ rm -f $(SWIFT_DESTINATION_FILE)
+ touch $(SWIFT_DESTINATION_FILE)
+ echo '{' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "version":1,' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "sdk":"$(STAGING_DIR)",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "toolchain-bin-dir":"$(SWIFT_NATIVE_PATH)",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "target":"$(SWIFT_TARGET_NAME)",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "dynamic-library-extension":"so",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "extra-cc-flags":[' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-fPIC",' >> $(SWIFT_DESTINATION_FILE)
+
+ @if [ "$(SWIFT_TARGET_ARCH)" = "armv5" ]; then\
+ echo ' "-march=armv5te",' >> $(SWIFT_DESTINATION_FILE);\
+ fi
+
+ echo ' ],' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "extra-swiftc-flags":[' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-target", "$(SWIFT_TARGET_NAME)",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-use-ld=lld",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-tools-directory", "$(SWIFT_NATIVE_PATH)",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-Xlinker", "-rpath", "-Xlinker", "/usr/lib/swift/linux",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-Xlinker", "-L$(STAGING_DIR)",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-Xlinker", "-L$(STAGING_DIR)/lib",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-Xlinker", "-L$(STAGING_DIR)/usr/lib",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-Xlinker", "-L$(STAGING_DIR)/usr/lib/swift/linux",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-Xlinker", "-L$(STAGING_DIR)/usr/lib/swift/linux/$(SWIFT_TARGET_ARCH)",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-Xlinker", "-L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION))",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-Xlinker", "--build-id=sha1",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-I$(STAGING_DIR)/usr/include",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-I$(STAGING_DIR)/usr/lib/swift",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-resource-dir", "$(STAGING_DIR)/usr/lib/swift",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-Xclang-linker", "-B$(STAGING_DIR)/usr/lib",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-Xclang-linker", "-B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION))",' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-Xclang-linker", "-latomic",' >> $(SWIFT_DESTINATION_FILE);\
+
+ @if [ "$(SWIFT_TARGET_ARCH)" = "powerpc" ]; then\
+ echo ' "-Xcc", "-mcpu=7400",' >> $(SWIFT_DESTINATION_FILE);\
+ fi
+
+ @if [ "$(SWIFT_TARGET_ARCH)" = "armv5" ]; then\
+ echo ' "-Xcc", "-march=armv5te",' >> $(SWIFT_DESTINATION_FILE);\
+ fi
+
+ echo ' "-sdk", "$(STAGING_DIR)"' >> $(SWIFT_DESTINATION_FILE)
+ echo ' ],' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "extra-cpp-flags":[' >> $(SWIFT_DESTINATION_FILE)
+ echo ' "-lstdc++"' >> $(SWIFT_DESTINATION_FILE)
+ echo ' ]' >> $(SWIFT_DESTINATION_FILE)
+ echo '}' >> $(SWIFT_DESTINATION_FILE)
+
+ # Copy swift toolchain
+ mkdir -p $(HOST_SWIFT_SUPPORT_DIR)/bin/
+ cp -rf $(SWIFT_NATIVE_PATH)/* $(HOST_SWIFT_SUPPORT_DIR)/bin/
+ mkdir -p $(HOST_SWIFT_SUPPORT_DIR)/lib/
+ cp -rf $(SWIFT_NATIVE_PATH)/../lib/* $(HOST_SWIFT_SUPPORT_DIR)/lib/
+endef
+
+$(eval $(generic-package))
+$(eval $(host-generic-package))
diff --git a/package/xctest/Config.in b/package/xctest/Config.in
new file mode 100644
index 0000000000..caecba9d62
--- /dev/null
+++ b/package/xctest/Config.in
@@ -0,0 +1,12 @@
+if BR2_PACKAGE_SWIFT
+
+config BR2_PACKAGE_XCTEST
+ bool "foundation"
+ depends on BR2_PACKAGE_SWIFT
+ select BR2_PACKAGE_FOUNDATION
+ help
+ The XCTest library is designed to provide a common framework for writing unit tests in Swift, for Swift packages and applications.
+
+ http://swift.org
+
+endif
diff --git a/package/xctest/xctest.mk b/package/xctest/xctest.mk
new file mode 100644
index 0000000000..0c06dc67ca
--- /dev/null
+++ b/package/xctest/xctest.mk
@@ -0,0 +1,63 @@
+### XCTest
+XCTEST_VERSION = 5.6.1
+XCTEST_SITE = $(call github,apple,swift-corelibs-xctest,swift-$(XCTEST_VERSION)-RELEASE)
+XCTEST_LICENSE = Apache-2.0
+XCTEST_LICENSE_FILES = LICENSE
+XCTEST_INSTALL_STAGING = YES
+XCTEST_INSTALL_TARGET = YES
+XCTEST_SUPPORTS_IN_SOURCE_BUILD = NO
+XCTEST_DEPENDENCIES = swift foundation
+
+XCTEST_CONF_OPTS += \
+ -DCMAKE_Swift_FLAGS=${SWIFTC_FLAGS} \
+ -DCMAKE_Swift_FLAGS_DEBUG="" \
+ -DCMAKE_Swift_FLAGS_RELEASE="" \
+ -DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+ -DCF_DEPLOYMENT_SWIFT=ON \
+ -Ddispatch_DIR="$(LIBSWIFTDISPATCH_BUILDDIR)/cmake/modules" \
+ -DFoundation_DIR="$(FOUNDATION_BUILDDIR)/cmake/modules" \
+
+ifeq (XCTEST_SUPPORTS_IN_SOURCE_BUILD),YES)
+XCTEST_BUILDDIR = $(XCTEST_SRCDIR)
+else
+XCTEST_BUILDDIR = $(XCTEST_SRCDIR)/build
+endif
+
+define XCTEST_CONFIGURE_CMDS
+ # Workaround Dispatch defined with cmake and module
+ rm -rf ${STAGING_DIR}/usr/lib/swift/dispatch
+ # Configure
+ (mkdir -p $(XCTEST_BUILDDIR) && \
+ cd $(XCTEST_BUILDDIR) && \
+ rm -f CMakeCache.txt && \
+ PATH=$(BR_PATH):$(SWIFT_NATIVE_PATH) \
+ $(XCTEST_CONF_ENV) $(BR2_CMAKE) -S $(XCTEST_SRCDIR) -B $(XCTEST_BUILDDIR) -G Ninja \
+ -DCMAKE_INSTALL_PREFIX="/usr" \
+ -DBUILD_SHARED_LIBS=ON \
+ -DCMAKE_BUILD_TYPE=$(if $(BR2_ENABLE_RUNTIME_DEBUG),Debug,Release) \
+ -DCMAKE_C_COMPILER=$(SWIFT_NATIVE_PATH)/clang \
+ -DCMAKE_C_FLAGS="-w -fuse-ld=lld -target $(SWIFT_TARGET_NAME) --sysroot=$(STAGING_DIR) $(SWIFT_EXTRA_FLAGS) -I$(STAGING_DIR)/usr/include -B$(STAGING_DIR)/usr/lib -B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) -L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION))" \
+ -DCMAKE_C_LINK_FLAGS="-target $(SWIFT_TARGET_NAME) --sysroot=$(STAGING_DIR)" \
+ $(XCTEST_CONF_OPTS) \
+ )
+endef
+
+define XCTEST_BUILD_CMDS
+ # Compile
+ (cd $(XCTEST_BUILDDIR) && ninja)
+endef
+
+define XCTEST_INSTALL_TARGET_CMDS
+ cp $(XCTEST_BUILDDIR)/*.so $(TARGET_DIR)/usr/lib/
+endef
+
+define XCTEST_INSTALL_STAGING_CMDS
+ # Copy libraries
+ cp $(XCTEST_BUILDDIR)/*.so $(STAGING_DIR)/usr/lib/swift/linux/
+ # Copy Swift modules
+ cp $(XCTEST_BUILDDIR)/swift/* ${STAGING_DIR}/usr/lib/swift/linux/$(SWIFT_TARGET_ARCH)/
+ # Restore Dispatch headers
+ $(LIBSWIFTDISPATCH_INSTALL_STAGING_CMDS)
+endef
+
+$(eval $(generic-package))
diff --git a/support/misc/toolchainfile.cmake.in b/support/misc/toolchainfile.cmake.in
index be575566a4..30c0e63bf2 100644
--- a/support/misc/toolchainfile.cmake.in
+++ b/support/misc/toolchainfile.cmake.in
@@ -14,9 +14,15 @@ string(REPLACE "/share/buildroot" "" RELOCATED_HOST_DIR ${CMAKE_CURRENT_LIST_DIR
# so that it can find our custom platform description.
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
-set(CMAKE_SYSTEM_NAME Buildroot)
-set(CMAKE_SYSTEM_VERSION 1)
-set(CMAKE_SYSTEM_PROCESSOR @@CMAKE_SYSTEM_PROCESSOR@@)
+if(NOT DEFINED CMAKE_SYSTEM_NAME)
+ set(CMAKE_SYSTEM_NAME Buildroot)
+endif()
+if(NOT DEFINED CMAKE_SYSTEM_VERSION)
+ set(CMAKE_SYSTEM_VERSION 1)
+endif()
+if(NOT DEFINED CMAKE_SYSTEM_PROCESSOR)
+ set(CMAKE_SYSTEM_PROCESSOR @@CMAKE_SYSTEM_PROCESSOR@@)
+endif()
# Set the {C,CXX}FLAGS appended by CMake depending on the build type
# defined by Buildroot. CMake defaults these variables with -g and/or
@@ -28,11 +34,17 @@ set(CMAKE_SYSTEM_PROCESSOR @@CMAKE_SYSTEM_PROCESSOR@@)
# Note:
# if the project forces some of these flag variables, Buildroot is
# screwed up and there is nothing Buildroot can do about that :(
-set(CMAKE_C_FLAGS_DEBUG "" CACHE STRING "Debug CFLAGS")
-set(CMAKE_C_FLAGS_RELEASE " -DNDEBUG" CACHE STRING "Release CFLAGS")
+if(NOT DEFINED CMAKE_C_FLAGS_DEBUG)
+ set(CMAKE_C_FLAGS_DEBUG "" CACHE STRING "Debug CFLAGS")
+endif()
+if(NOT DEFINED CMAKE_C_FLAGS_RELEASE)
+ set(CMAKE_C_FLAGS_RELEASE " -DNDEBUG" CACHE STRING "Release CFLAGS")
+endif()
# Build type from the Buildroot configuration
-set(CMAKE_BUILD_TYPE @@CMAKE_BUILD_TYPE@@ CACHE STRING "Buildroot build configuration")
+if(NOT DEFINED CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE @@CMAKE_BUILD_TYPE@@ CACHE STRING "Buildroot build configuration")
+endif()
# Buildroot defaults flags.
# If you are using this toolchainfile.cmake file outside of Buildroot and
@@ -41,33 +53,75 @@ set(CMAKE_BUILD_TYPE @@CMAKE_BUILD_TYPE@@ CACHE STRING "Buildroot build configur
# cmake -DCMAKE_C_FLAGS="@@TARGET_CFLAGS@@ -Dsome_custom_flag" ...
# * and make sure the project's CMake code extends them like this if needed:
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dsome_definitions")
-set(CMAKE_C_FLAGS "@@TARGET_CFLAGS@@" CACHE STRING "Buildroot CFLAGS")
-set(CMAKE_EXE_LINKER_FLAGS "@@TARGET_LDFLAGS@@" CACHE STRING "Buildroot LDFLAGS for executables")
-set(CMAKE_SHARED_LINKER_FLAGS "@@TARGET_LDFLAGS@@" CACHE STRING "Buildroot LDFLAGS for shared libraries")
-set(CMAKE_MODULE_LINKER_FLAGS "@@TARGET_LDFLAGS@@" CACHE STRING "Buildroot LDFLAGS for module libraries")
+if(NOT DEFINED CMAKE_C_FLAGS)
+ set(CMAKE_C_FLAGS "@@TARGET_CFLAGS@@" CACHE STRING "Buildroot CFLAGS")
+endif()
+if(NOT DEFINED CMAKE_EXE_LINKER_FLAGS)
+ set(CMAKE_EXE_LINKER_FLAGS "@@TARGET_LDFLAGS@@" CACHE STRING "Buildroot LDFLAGS for executables")
+endif()
+if(NOT DEFINED CMAKE_SHARED_LINKER_FLAGS)
+ set(CMAKE_SHARED_LINKER_FLAGS "@@TARGET_LDFLAGS@@" CACHE STRING "Buildroot LDFLAGS for shared libraries")
+endif()
+if(NOT DEFINED CMAKE_MODULE_LINKER_FLAGS)
+ set(CMAKE_MODULE_LINKER_FLAGS "@@TARGET_LDFLAGS@@" CACHE STRING "Buildroot LDFLAGS for module libraries")
+endif()
-set(CMAKE_INSTALL_SO_NO_EXE 0)
+if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
+ set(CMAKE_INSTALL_SO_NO_EXE 0)
+endif()
-set(CMAKE_PROGRAM_PATH "${RELOCATED_HOST_DIR}/bin")
-set(CMAKE_SYSROOT "${RELOCATED_HOST_DIR}/@@STAGING_SUBDIR@@")
-set(CMAKE_FIND_ROOT_PATH "${RELOCATED_HOST_DIR}/@@STAGING_SUBDIR@@")
-set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
-set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
-set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
-set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+if(NOT DEFINED CMAKE_PROGRAM_PATH)
+ set(CMAKE_PROGRAM_PATH "${RELOCATED_HOST_DIR}/bin")
+endif()
+if(NOT DEFINED CMAKE_SYSROOT)
+ set(CMAKE_SYSROOT "${RELOCATED_HOST_DIR}/@@STAGING_SUBDIR@@")
+endif()
+if(NOT DEFINED CMAKE_FIND_ROOT_PATH)
+ set(CMAKE_FIND_ROOT_PATH "${RELOCATED_HOST_DIR}/@@STAGING_SUBDIR@@")
+endif()
+if(NOT DEFINED CMAKE_FIND_ROOT_PATH_MODE_PROGRAM)
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+endif()
+if(NOT DEFINED CMAKE_FIND_ROOT_PATH_MODE_PACKAGE)
+ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
+endif()
+if(NOT DEFINED CMAKE_FIND_ROOT_PATH_MODE_LIBRARY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+endif()
+if(NOT DEFINED CMAKE_FIND_ROOT_PATH_MODE_INCLUDE)
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+endif()
set(ENV{PKG_CONFIG_SYSROOT_DIR} "${RELOCATED_HOST_DIR}/@@STAGING_SUBDIR@@")
# This toolchain file can be used both inside and outside Buildroot.
-set(CMAKE_C_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_CC@@")
+if(NOT DEFINED CMAKE_C_COMPILER)
+ set(CMAKE_C_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_CC@@")
+endif()
if(@@TOOLCHAIN_HAS_CXX@@)
- set(CMAKE_CXX_FLAGS_DEBUG "" CACHE STRING "Debug CXXFLAGS")
- set(CMAKE_CXX_FLAGS_RELEASE " -DNDEBUG" CACHE STRING "Release CXXFLAGS")
- set(CMAKE_CXX_FLAGS "@@TARGET_CXXFLAGS@@" CACHE STRING "Buildroot CXXFLAGS")
- set(CMAKE_CXX_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_CXX@@")
+ if(NOT DEFINED CMAKE_CXX_FLAGS_DEBUG)
+ set(CMAKE_CXX_FLAGS_DEBUG "" CACHE STRING "Debug CXXFLAGS")
+ endif()
+ if(NOT DEFINED CMAKE_CXX_FLAGS_RELEASE)
+ set(CMAKE_CXX_FLAGS_RELEASE " -DNDEBUG" CACHE STRING "Release CXXFLAGS")
+ endif()
+ if(NOT DEFINED CMAKE_CXX_FLAGS)
+ set(CMAKE_CXX_FLAGS "@@TARGET_CXXFLAGS@@" CACHE STRING "Buildroot CXXFLAGS")
+ endif()
+ if(NOT DEFINED CMAKE_CXX_COMPILER)
+ set(CMAKE_CXX_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_CXX@@")
+ endif()
endif()
if(@@TOOLCHAIN_HAS_FORTRAN@@)
- set(CMAKE_Fortran_FLAGS_DEBUG "" CACHE STRING "Debug Fortran FLAGS")
- set(CMAKE_Fortran_FLAGS_RELEASE " -DNDEBUG" CACHE STRING "Release Fortran FLAGS")
- set(CMAKE_Fortran_FLAGS "@@TARGET_FCFLAGS@@" CACHE STRING "Buildroot FCFLAGS")
- set(CMAKE_Fortran_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_FC@@")
+ if(NOT DEFINED CMAKE_Fortran_FLAGS_DEBUG)
+ set(CMAKE_Fortran_FLAGS_DEBUG "" CACHE STRING "Debug Fortran FLAGS")
+ endif()
+ if(NOT DEFINED CMAKE_Fortran_FLAGS_RELEASE)
+ set(CMAKE_Fortran_FLAGS_RELEASE " -DNDEBUG" CACHE STRING "Release Fortran FLAGS")
+ endif()
+ if(NOT DEFINED CMAKE_Fortran_FLAGS)
+ set(CMAKE_Fortran_FLAGS "@@TARGET_FCFLAGS@@" CACHE STRING "Buildroot FCFLAGS")
+ endif()
+ if(NOT DEFINED CMAKE_Fortran_COMPILER)
+ set(CMAKE_Fortran_COMPILER "${RELOCATED_HOST_DIR}/@@TARGET_FC@@")
+ endif()
endif()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment