Skip to content

Instantly share code, notes, and snippets.

@colemancda
Created March 27, 2022 23:05
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/885b0e170acdf4c8ddf8afec586e3bdc to your computer and use it in GitHub Desktop.
Save colemancda/885b0e170acdf4c8ddf8afec586e3bdc to your computer and use it in GitHub Desktop.
Swift 5.6 for Buildroot with PowerPC 32-bit support
diff --git a/package/Config.in b/package/Config.in
index 0d5d763180..b89a49913e 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -1422,6 +1422,7 @@ menu "Crypto"
source "package/openssl/Config.in"
source "package/pkcs11-helper/Config.in"
source "package/rhash/Config.in"
+ source "package/swift-crypto/Config.in"
source "package/tinydtls/Config.in"
source "package/tpm2-pkcs11/Config.in"
source "package/tpm2-tss/Config.in"
@@ -1939,6 +1940,7 @@ menu "Other"
source "package/flann/Config.in"
source "package/flatbuffers/Config.in"
source "package/flatcc/Config.in"
+ source "package/foundation/Config.in"
source "package/gconf/Config.in"
source "package/gflags/Config.in"
source "package/gli/Config.in"
@@ -1968,6 +1970,7 @@ menu "Other"
source "package/libcrossguid/Config.in"
source "package/libcsv/Config.in"
source "package/libdaemon/Config.in"
+ source "package/libdispatch/Config.in"
source "package/libeastl/Config.in"
source "package/libee/Config.in"
source "package/libev/Config.in"
@@ -2001,6 +2004,7 @@ menu "Other"
source "package/libsigc/Config.in"
source "package/libsigsegv/Config.in"
source "package/libspatialindex/Config.in"
+ source "package/libswiftdispatch/Config.in"
source "package/libtalloc/Config.in"
source "package/libtasn1/Config.in"
source "package/libtommath/Config.in"
@@ -2021,6 +2025,10 @@ 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/lttng-libust/Config.in"
source "package/matio/Config.in"
source "package/mpc/Config.in"
@@ -2044,6 +2052,7 @@ endif
source "package/skalibs/Config.in"
source "package/sphinxbase/Config.in"
source "package/startup-notification/Config.in"
+ source "package/swift/Config.in"
source "package/tinycbor/Config.in"
source "package/tz/Config.in"
source "package/tzdata/Config.in"
@@ -2102,6 +2111,7 @@ menu "Mail"
endmenu
menu "Miscellaneous"
+ source "package/swift-hello/Config.in"
source "package/aespipe/Config.in"
source "package/bc/Config.in"
source "package/bitcoin/Config.in"
@@ -2125,6 +2135,7 @@ menu "Miscellaneous"
source "package/rtl_433/Config.in"
source "package/shared-mime-info/Config.in"
source "package/sunwait/Config.in"
+ source "package/swift-hello/Config.in"
source "package/taskd/Config.in"
source "package/wine/Config.in"
source "package/xmrig/Config.in"
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..f15edb8420
--- /dev/null
+++ b/package/foundation/foundation.hash
@@ -0,0 +1 @@
+sha256 3fa96321729ea1e99847320bc3b5eefcbc39ba57eb8750a16700afa0173b6bb0 swift-5.6-RELEASE.tar.gz
diff --git a/package/foundation/foundation.mk b/package/foundation/foundation.mk
new file mode 100644
index 0000000000..93c7cedbdd
--- /dev/null
+++ b/package/foundation/foundation.mk
@@ -0,0 +1,102 @@
+### Foundation
+FOUNDATION_VERSION = $(SWIFT_VERSION)
+FOUNDATION_SOURCE = swift-$(SWIFT_VERSION)-RELEASE.tar.gz
+FOUNDATION_SITE = https://github.com/apple/swift-corelibs-foundation/archive/refs/tags
+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" \
+
+ifeq ($(BR2_PACKAGE_LIBCURL),y)
+ FOUNDATION_DEPENDENCIES += libcurl
+ FOUNDATION_CONF_OPTS += \
+ -DCURL_LIBRARY_RELEASE=${STAGING_DIR}/usr/lib/libcurl.so \
+ -DCURL_INCLUDE_DIR="${STAGING_DIR}/usr/include" \
+
+endif
+
+ifeq ($(BR2_PACKAGE_LIBXML2),y)
+ FOUNDATION_DEPENDENCIES += libxml2
+ FOUNDATION_CONF_OPTS += \
+ -DLIBXML2_LIBRARY=${STAGING_DIR}/usr/lib/libxml2.so \
+ -DLIBXML2_INCLUDE_DIR=${STAGING_DIR}/usr/include/libxml2 \
+
+endif
+
+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..2f7c115375
--- /dev/null
+++ b/package/libdispatch/Config.in
@@ -0,0 +1,11 @@
+config BR2_PACKAGE_LIBDISPATCH
+ bool "libdispatch"
+ 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
diff --git a/package/libdispatch/libdispatch.hash b/package/libdispatch/libdispatch.hash
new file mode 100644
index 0000000000..a89c48c55f
--- /dev/null
+++ b/package/libdispatch/libdispatch.hash
@@ -0,0 +1,2 @@
+sha256 d2bbfb5b98d129caa2c6bd7662c850bf57cb434572d09844b56641c4558906ab swift-5.6-RELEASE.tar.gz
+sha256 c83647dac6a1e36795a62626e3a9c7dab7ed4b46919a757afb5562d5ed49da73 libdispatch-5.5.3-armv5.patch
diff --git a/package/libdispatch/libdispatch.mk b/package/libdispatch/libdispatch.mk
new file mode 100644
index 0000000000..a334c3052d
--- /dev/null
+++ b/package/libdispatch/libdispatch.mk
@@ -0,0 +1,78 @@
+### Grand Central Dispatch (C API)
+LIBDISPATCH_VERSION = $(SWIFT_VERSION)
+LIBDISPATCH_SOURCE = swift-$(SWIFT_VERSION)-RELEASE.tar.gz
+LIBDISPATCH_SITE = https://github.com/apple/swift-corelibs-libdispatch/archive/refs/tags
+LIBDISPATCH_LICENSE = Apache-2.0
+LIBDISPATCH_LICENSE_FILES = LICENSE
+LIBDISPATCH_INSTALL_STAGING = YES
+LIBDISPATCH_INSTALL_TARGET = YES
+LIBDISPATCH_SUPPORTS_IN_SOURCE_BUILD = NO
+LIBDISPATCH_DEPENDENCIES = libbsd
+LIBDISPATCH_PATCH = \
+ https://gist.githubusercontent.com/colemancda/e19ec96d8b3caa7f4a3f9ec9a82f356a/raw/a8a62d61856de09f02618d32d14ac637017cc44f/libdispatch-5.5.3-armv5.patch
+
+LIBDISPATCH_CONF_OPTS += \
+ -DLibRT_LIBRARIES="${STAGING_DIR}/usr/lib/librt.a" \
+
+ifeq (LIBDISPATCH_SUPPORTS_IN_SOURCE_BUILD),YES)
+LIBDISPATCH_BUILDDIR = $(LIBDISPATCH_SRCDIR)
+else
+LIBDISPATCH_BUILDDIR = $(LIBDISPATCH_SRCDIR)/build
+endif
+
+define LIBDISPATCH_CONFIGURE_CMDS
+ # Clean
+ rm -rf $(LIBDISPATCH_BUILDDIR)
+ rm -rf $(STAGING_DIR)/usr/lib/swift/dispatch
+ # Configure for Ninja
+ (mkdir -p $(LIBDISPATCH_BUILDDIR) && \
+ cd $(LIBDISPATCH_BUILDDIR) && \
+ rm -f CMakeCache.txt && \
+ PATH=$(BR_PATH):$(SWIFT_NATIVE_PATH) \
+ $(LIBDISPATCH_CONF_ENV) $(BR2_CMAKE) -S $(LIBDISPATCH_SRCDIR) -B $(LIBDISPATCH_BUILDDIR) -G Ninja \
+ -DCMAKE_INSTALL_PREFIX="/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 $(SWIFT_EXTRA_FLAGS) -target $(SWIFT_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 $(SWIFT_TARGET_NAME) --sysroot=$(STAGING_DIR)" \
+ -DCMAKE_CXX_FLAGS="-w -fuse-ld=lld $(SWIFT_EXTRA_FLAGS) -target $(SWIFT_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 $(SWIFT_TARGET_NAME) --sysroot=$(STAGING_DIR)" \
+ $(LIBDISPATCH_CONF_OPTS) \
+ )
+endef
+
+define LIBDISPATCH_BUILD_CMDS
+ # Compile
+ (cd $(LIBDISPATCH_BUILDDIR) && ninja)
+endef
+
+define LIBDISPATCH_INSTALL_TARGET_CMDS
+ (cd $(LIBDISPATCH_BUILDDIR) && \
+ cp ./*.so $(TARGET_DIR)/usr/lib/ \
+ )
+endef
+
+define LIBDISPATCH_INSTALL_STAGING_CMDS
+ # Copy libraries
+ cp $(LIBDISPATCH_BUILDDIR)/*.so $(STAGING_DIR)/usr/lib/
+ # Copy headers
+ mkdir -p ${STAGING_DIR}/usr/include/dispatch
+ cp $(LIBDISPATCH_SRCDIR)/dispatch/*.h ${STAGING_DIR}/usr/include/dispatch
+ mkdir -p ${STAGING_DIR}/usr/include/Block
+ cp $(LIBDISPATCH_SRCDIR)/src/BlocksRuntime/Block.h ${STAGING_DIR}/usr/include/Block/
+ mkdir -p ${STAGING_DIR}/usr/include/os
+ cp $(LIBDISPATCH_SRCDIR)/os/object.h ${STAGING_DIR}/usr/include/os/
+ cp $(LIBDISPATCH_SRCDIR)/os/generic_unix_base.h ${STAGING_DIR}/usr/include/os/
+endef
+
+$(eval $(generic-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/libswiftdispatch.hash b/package/libswiftdispatch/libswiftdispatch.hash
new file mode 100644
index 0000000000..a89c48c55f
--- /dev/null
+++ b/package/libswiftdispatch/libswiftdispatch.hash
@@ -0,0 +1,2 @@
+sha256 d2bbfb5b98d129caa2c6bd7662c850bf57cb434572d09844b56641c4558906ab swift-5.6-RELEASE.tar.gz
+sha256 c83647dac6a1e36795a62626e3a9c7dab7ed4b46919a757afb5562d5ed49da73 libdispatch-5.5.3-armv5.patch
diff --git a/package/libswiftdispatch/libswiftdispatch.mk b/package/libswiftdispatch/libswiftdispatch.mk
new file mode 100644
index 0000000000..45bef5b8f2
--- /dev/null
+++ b/package/libswiftdispatch/libswiftdispatch.mk
@@ -0,0 +1,86 @@
+### Grand Central Dispatch with Swift overlay
+LIBSWIFTDISPATCH_VERSION = $(SWIFT_VERSION)
+LIBSWIFTDISPATCH_SOURCE = swift-$(SWIFT_VERSION)-RELEASE.tar.gz
+LIBSWIFTDISPATCH_SITE = https://github.com/apple/swift-corelibs-libdispatch/archive/refs/tags
+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_PATCH = \
+ https://gist.githubusercontent.com/colemancda/e19ec96d8b3caa7f4a3f9ec9a82f356a/raw/a8a62d61856de09f02618d32d14ac637017cc44f/libdispatch-5.5.3-armv5.patch
+
+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
+ # Clean
+ rm -rf $(LIBSWIFTDISPATCH_BUILDDIR)
+ rm -rf $(STAGING_DIR)/usr/lib/swift/dispatch
+ # 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="/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
+ # Copy libraries
+ cp $(LIBSWIFTDISPATCH_BUILDDIR)/*.so $(STAGING_DIR)/usr/lib/swift/linux/
+ # Copy headers
+ mkdir -p ${STAGING_DIR}/usr/lib/swift/dispatch
+ cp $(LIBSWIFTDISPATCH_SRCDIR)/dispatch/*.h ${STAGING_DIR}/usr/lib/swift/dispatch/
+ cp $(LIBSWIFTDISPATCH_SRCDIR)/dispatch/module.modulemap ${STAGING_DIR}/usr/lib/swift/dispatch/
+ mkdir -p ${STAGING_DIR}/usr/lib/swift/Block
+ cp $(LIBSWIFTDISPATCH_SRCDIR)/src/BlocksRuntime/Block.h ${STAGING_DIR}/usr/lib/swift/Block/
+ mkdir -p ${STAGING_DIR}/usr/lib/swift/os
+ cp $(LIBSWIFTDISPATCH_SRCDIR)/os/object.h ${STAGING_DIR}/usr/lib/swift/os/
+ cp $(LIBSWIFTDISPATCH_SRCDIR)/os/generic_unix_base.h ${STAGING_DIR}/usr/lib/swift/os/
+ # Copy Swift modules
+ cp $(LIBSWIFTDISPATCH_BUILDDIR)/src/swift/swift/* ${STAGING_DIR}/usr/lib/swift/linux/$(SWIFT_TARGET_ARCH)/
+endef
+
+$(eval $(generic-package))
diff --git a/package/swift-crypto/Config.in b/package/swift-crypto/Config.in
new file mode 100644
index 0000000000..35c42fdc88
--- /dev/null
+++ b/package/swift-crypto/Config.in
@@ -0,0 +1,10 @@
+if BR2_PACKAGE_SWIFT
+
+config BR2_PACKAGE_SWIFT_CRYPTO
+ bool "swift-crypto"
+ depends on BR2_PACKAGE_SWIFT
+ depends on BR2_PACKAGE_FOUNDATION
+ help
+ Swift Crypto is an open-source implementation of a substantial portion of the API of Apple CryptoKit suitable for use on Linux platforms.
+
+endif
diff --git a/package/swift-crypto/swift-crypto-shared-lib.patch b/package/swift-crypto/swift-crypto-shared-lib.patch
new file mode 100644
index 0000000000..049a1a37d5
--- /dev/null
+++ b/package/swift-crypto/swift-crypto-shared-lib.patch
@@ -0,0 +1,13 @@
+diff --git a/Package.swift b/Package.swift
+index 4991568..2cb150f 100644
+--- a/Package.swift
++++ b/Package.swift
+@@ -39,7 +39,7 @@ let package = Package(
+ .tvOS(.v13),
+ ],
+ products: [
+- .library(name: "Crypto", targets: ["Crypto"]),
++ .library(name: "Crypto", type: .dynamic, targets: ["Crypto"]),
+ .library(name: "_CryptoExtras", targets: ["_CryptoExtras"]),
+ /* This target is used only for symbol mangling. It's added and removed automatically because it emits build warnings. MANGLE_START
+ .library(name: "CCryptoBoringSSL", type: .static, targets: ["CCryptoBoringSSL"]),
diff --git a/package/swift-crypto/swift-crypto.mk b/package/swift-crypto/swift-crypto.mk
new file mode 100644
index 0000000000..c0c34f53b3
--- /dev/null
+++ b/package/swift-crypto/swift-crypto.mk
@@ -0,0 +1,36 @@
+### Swift CryptoKit library
+SWIFT_CRYPTO_VERSION = 2.0.5
+SWIFT_CRYPTO_SOURCE = $(SWIFT_CRYPTO_VERSION).tar.gz
+SWIFT_CRYPTO_SITE = https://github.com/apple/swift-crypto/archive/refs/tags/
+SWIFT_CRYPTO_LICENSE = Apache-2.0
+SWIFT_CRYPTO_LICENSE_FILES = LICENSE.txt
+SWIFT_CRYPTO_INSTALL_STAGING = YES
+SWIFT_CRYPTO_INSTALL_TARGET = YES
+SWIFT_CRYPTO_SUPPORTS_IN_SOURCE_BUILD = YES
+SWIFT_CRYPTO_DEPENDENCIES = swift foundation
+SWIFT_CRYPTO_BUILDDIR = $(SWIFT_CRYPTO_SRCDIR)/.build/$(if $(BR2_ENABLE_RUNTIME_DEBUG),debug,release)
+
+define SWIFT_CRYPTO_BUILD_CMDS
+ ( \
+ cd $(SWIFT_CRYPTO_SRCDIR) && \
+ rm -rf .build && \
+ PATH=$(BR_PATH):$(SWIFT_NATIVE_PATH) \
+ $(SWIFT_NATIVE_PATH)/swift build -c $(if $(BR2_ENABLE_RUNTIME_DEBUG),debug,release) --destination $(SWIFTPM_DESTINATION_FILE) \
+ )
+endef
+
+define SWIFT_CRYPTO_INSTALL_TARGET_CMDS
+ # Copy dynamic libraries
+ cp -rf $(SWIFT_CRYPTO_BUILDDIR)/libCrypto.so $(TARGET_DIR)/usr/lib/
+endef
+
+define SWIFT_CRYPTO_INSTALL_STAGING_CMDS
+ # Copy dynamic libraries
+ cp -rf $(SWIFT_CRYPTO_BUILDDIR)/libCrypto.so $(STAGING_DIR)/usr/lib/swift/linux/
+ # Copy Swift module
+ cp -rf $(SWIFT_CRYPTO_BUILDDIR)/Crypto.swiftdoc ${STAGING_DIR}/usr/lib/swift/linux/$(SWIFT_TARGET_ARCH)/
+ cp -rf $(SWIFT_CRYPTO_BUILDDIR)/Crypto.swiftmodule ${STAGING_DIR}/usr/lib/swift/linux/$(SWIFT_TARGET_ARCH)/
+ cp -rf $(SWIFT_CRYPTO_BUILDDIR)/Crypto.swiftsourceinfo ${STAGING_DIR}/usr/lib/swift/linux/$(SWIFT_TARGET_ARCH)/
+endef
+
+$(eval $(generic-package))
diff --git a/package/swift-hello/Config.in b/package/swift-hello/Config.in
new file mode 100644
index 0000000000..cbeed69667
--- /dev/null
+++ b/package/swift-hello/Config.in
@@ -0,0 +1,10 @@
+if BR2_PACKAGE_SWIFT
+
+config BR2_PACKAGE_SWIFT_HELLO
+ bool "swift-hello"
+ depends on BR2_PACKAGE_SWIFT
+ depends on BR2_PACKAGE_FOUNDATION
+ help
+ Demo application for Swift.
+
+endif
diff --git a/package/swift-hello/src/Package.swift b/package/swift-hello/src/Package.swift
new file mode 100644
index 0000000000..d26517480c
--- /dev/null
+++ b/package/swift-hello/src/Package.swift
@@ -0,0 +1,22 @@
+// swift-tools-version:5.5
+import PackageDescription
+
+let package = Package(
+ name: "swift-hello",
+ dependencies: [
+ // Dependencies declare other packages that this package depends on.
+ // .package(url: /* package url */, from: "1.0.0"),
+ ],
+ targets: [
+ // Targets are the basic building blocks of a package. A target can define a module or a test suite.
+ // Targets can depend on other targets in this package, and on products in packages this package depends on.
+ .executableTarget(
+ name: "swift-hello",
+ dependencies: []
+ ),
+ .testTarget(
+ name: "swift-helloTests",
+ dependencies: ["swift-hello"]
+ ),
+ ]
+)
diff --git a/package/swift-hello/src/Sources/swift-hello/Hello.swift b/package/swift-hello/src/Sources/swift-hello/Hello.swift
new file mode 100644
index 0000000000..d68c3fb1a3
--- /dev/null
+++ b/package/swift-hello/src/Sources/swift-hello/Hello.swift
@@ -0,0 +1,31 @@
+import Foundation
+#if canImport(Crypto)
+import Crypto
+#endif
+
+@main
+struct Hello {
+ static func main() async throws {
+ print("Hello, world! 👋")
+ #if canImport(Crypto)
+ print("Swift Crypto installed")
+ #endif
+ let task = Task {
+ var didCatchError = false
+ do { try await errorTest() }
+ catch CocoaError.userCancelled { didCatchError = true }
+ catch { fatalError() }
+ print("Task ran")
+ }
+ for _ in 0 ..< 10 {
+ print(UUID())
+ try await Task.sleep(1_000_000_000)
+ }
+ }
+}
+
+func errorTest() async throws {
+ print("Will throw")
+ throw CocoaError(.userCancelled)
+}
+
diff --git a/package/swift-hello/src/Tests/swift-helloTests/swift_helloTests.swift b/package/swift-hello/src/Tests/swift-helloTests/swift_helloTests.swift
new file mode 100644
index 0000000000..f9ca48cacd
--- /dev/null
+++ b/package/swift-hello/src/Tests/swift-helloTests/swift_helloTests.swift
@@ -0,0 +1,47 @@
+import XCTest
+import class Foundation.Bundle
+
+final class swift_helloTests: XCTestCase {
+ func testExample() throws {
+ // This is an example of a functional test case.
+ // Use XCTAssert and related functions to verify your tests produce the correct
+ // results.
+
+ // Some of the APIs that we use below are available in macOS 10.13 and above.
+ guard #available(macOS 10.13, *) else {
+ return
+ }
+
+ // Mac Catalyst won't have `Process`, but it is supported for executables.
+ #if !targetEnvironment(macCatalyst)
+
+ let fooBinary = productsDirectory.appendingPathComponent("swift-hello")
+
+ let process = Process()
+ process.executableURL = fooBinary
+
+ let pipe = Pipe()
+ process.standardOutput = pipe
+
+ try process.run()
+ process.waitUntilExit()
+
+ let data = pipe.fileHandleForReading.readDataToEndOfFile()
+ let output = String(data: data, encoding: .utf8)
+
+ XCTAssertEqual(output, "Hello, world!\n")
+ #endif
+ }
+
+ /// Returns path to the built products directory.
+ var productsDirectory: URL {
+ #if os(macOS)
+ for bundle in Bundle.allBundles where bundle.bundlePath.hasSuffix(".xctest") {
+ return bundle.bundleURL.deletingLastPathComponent()
+ }
+ fatalError("couldn't find the products directory")
+ #else
+ return Bundle.main.bundleURL
+ #endif
+ }
+}
diff --git a/package/swift-hello/swift-hello.mk b/package/swift-hello/swift-hello.mk
new file mode 100644
index 0000000000..b3cded3f7c
--- /dev/null
+++ b/package/swift-hello/swift-hello.mk
@@ -0,0 +1,33 @@
+### Swift Demo
+SWIFT_HELLO_VERSION = 0.1.0
+SWIFT_HELLO_SITE = $(SWIFT_HELLO_PKGDIR)/src
+SWIFT_HELLO_SITE_METHOD = local
+SWIFT_HELLO_INSTALL_STAGING = NO
+SWIFT_HELLO_INSTALL_TARGET = YES
+SWIFT_HELLO_SUPPORTS_IN_SOURCE_BUILD = YES
+SWIFT_HELLO_DEPENDENCIES = swift foundation
+SWIFT_HELLO_EXECUTABLES = swift-hello
+SWIFT_HELLO_BUILDDIR = $(SWIFT_HELLO_SRCDIR)/.build/$(if $(BR2_ENABLE_RUNTIME_DEBUG),debug,release)
+
+define SWIFT_HELLO_BUILD_CMDS
+ ( \
+ cd $(SWIFT_HELLO_SRCDIR) && \
+ rm -rf .build && \
+ PATH=$(BR_PATH):$(SWIFT_NATIVE_PATH) \
+ $(SWIFT_NATIVE_PATH)/swift build -c $(if $(BR2_ENABLE_RUNTIME_DEBUG),debug,release) --destination $(SWIFTPM_DESTINATION_FILE) \
+ )
+endef
+
+define SWIFT_HELLO_INSTALL_TARGET_CMDS
+ # Copy dynamic libraries
+ #cp $(SWIFT_HELLO_BUILDDIR)/*.so $(TARGET_DIR)/usr/lib/
+ cp $(SWIFT_HELLO_BUILDDIR)/swift-hello $(TARGET_DIR)/usr/bin/hello
+endef
+
+define SWIFT_HELLO_INSTALL_STAGING_CMDS
+ # Copy dynamic libraries
+ #cp $(SWIFT_HELLO_BUILDDIR)/*.so $(STAGING_DIR)/usr/lib/swift/linux/
+ cp $(SWIFT_HELLO_BUILDDIR)/swift-hello $(STAGING_DIR)/usr/bin/hello
+endef
+
+$(eval $(generic-package))
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/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-ppc32.patch b/package/swift/swift-5.6-ppc32.patch
new file mode 100644
index 0000000000..70251d3fe1
--- /dev/null
+++ b/package/swift/swift-5.6-ppc32.patch
@@ -0,0 +1,424 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index bc9b6790922..734d2dae23f 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -709,6 +709,8 @@ else()
+ endif()
+ elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64")
+ set(SWIFT_HOST_VARIANT_ARCH_default "powerpc64")
++ elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc")
++ set(SWIFT_HOST_VARIANT_ARCH_default "powerpc")
+ elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64le")
+ set(SWIFT_HOST_VARIANT_ARCH_default "powerpc64le")
+ elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "s390x")
+diff --git a/cmake/modules/SwiftConfigureSDK.cmake b/cmake/modules/SwiftConfigureSDK.cmake
+index 3c866f2e65c..da405660415 100644
+--- a/cmake/modules/SwiftConfigureSDK.cmake
++++ b/cmake/modules/SwiftConfigureSDK.cmake
+@@ -325,7 +325,7 @@ macro(configure_sdk_unix name architectures)
+ if("${prefix}" STREQUAL "LINUX")
+ if(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)")
++ elseif(arch MATCHES "(aarch64|i686|powerpc|powerpc64|powerpc64le|s390x|x86_64)")
+ set(SWIFT_SDK_LINUX_ARCH_${arch}_TRIPLE "${arch}-unknown-linux-gnu")
+ else()
+ message(FATAL_ERROR "unknown arch for ${prefix}: ${arch}")
+diff --git a/cmake/modules/SwiftSetIfArchBitness.cmake b/cmake/modules/SwiftSetIfArchBitness.cmake
+index fa29d77fe26..8880828bfd1 100644
+--- a/cmake/modules/SwiftSetIfArchBitness.cmake
++++ b/cmake/modules/SwiftSetIfArchBitness.cmake
+@@ -14,7 +14,8 @@ function(set_if_arch_bitness var_name)
+ "${SIA_ARCH}" STREQUAL "armv7k" OR
+ "${SIA_ARCH}" STREQUAL "arm64_32" OR
+ "${SIA_ARCH}" STREQUAL "armv7s" OR
+- "${SIA_ARCH}" STREQUAL "wasm32")
++ "${SIA_ARCH}" STREQUAL "wasm32" OR
++ "${SIA_ARCH}" STREQUAL "powerpc")
+ set("${var_name}" "${SIA_CASE_32_BIT}" PARENT_SCOPE)
+ elseif("${SIA_ARCH}" STREQUAL "x86_64" OR
+ "${SIA_ARCH}" STREQUAL "amd64" OR
+diff --git a/lib/Basic/LangOptions.cpp b/lib/Basic/LangOptions.cpp
+index b9e8b488d9c..5669fa746e1 100644
+--- a/lib/Basic/LangOptions.cpp
++++ b/lib/Basic/LangOptions.cpp
+@@ -62,6 +62,7 @@ static const SupportedConditionalValue SupportedConditionalCompilationArches[] =
+ "arm64_32",
+ "i386",
+ "x86_64",
++ "powerpc",
+ "powerpc64",
+ "powerpc64le",
+ "s390x",
+@@ -312,6 +313,9 @@ std::pair<bool, bool> LangOptions::setTarget(llvm::Triple triple) {
+ addPlatformConditionValue(PlatformConditionKind::Arch, "arm64");
+ }
+ break;
++ case llvm::Triple::ArchType::ppc:
++ addPlatformConditionValue(PlatformConditionKind::Arch, "powerpc");
++ break;
+ case llvm::Triple::ArchType::ppc64:
+ addPlatformConditionValue(PlatformConditionKind::Arch, "powerpc64");
+ break;
+@@ -350,6 +354,7 @@ std::pair<bool, bool> LangOptions::setTarget(llvm::Triple triple) {
+ case llvm::Triple::ArchType::x86_64:
+ addPlatformConditionValue(PlatformConditionKind::Endianness, "little");
+ break;
++ case llvm::Triple::ArchType::ppc:
+ case llvm::Triple::ArchType::ppc64:
+ case llvm::Triple::ArchType::systemz:
+ addPlatformConditionValue(PlatformConditionKind::Endianness, "big");
+diff --git a/lib/IRGen/SwiftTargetInfo.cpp b/lib/IRGen/SwiftTargetInfo.cpp
+index 81c0fce41bc..97b70d6d75c 100644
+--- a/lib/IRGen/SwiftTargetInfo.cpp
++++ b/lib/IRGen/SwiftTargetInfo.cpp
+@@ -144,6 +144,13 @@ static void configureARM(IRGenModule &IGM, const llvm::Triple &triple,
+ setToMask(target.IsObjCPointerBit, 32, SWIFT_ABI_ARM_IS_OBJC_BIT);
+ }
+
++/// Configures target-specific information for powerpc platforms.
++static void configurePowerPC(IRGenModule &IGM, const llvm::Triple &triple,
++ SwiftTargetInfo &target) {
++ setToMask(target.PointerSpareBits, 32,
++ SWIFT_ABI_POWERPC_SWIFT_SPARE_BITS_MASK);
++}
++
+ /// Configures target-specific information for powerpc64 platforms.
+ static void configurePowerPC64(IRGenModule &IGM, const llvm::Triple &triple,
+ SwiftTargetInfo &target) {
+@@ -220,6 +227,10 @@ SwiftTargetInfo SwiftTargetInfo::get(IRGenModule &IGM) {
+ else
+ configureARM64(IGM, triple, target);
+ break;
++
++ case llvm::Triple::ppc:
++ configurePowerPC(IGM, triple, target);
++ break;
+
+ case llvm::Triple::ppc64:
+ case llvm::Triple::ppc64le:
+diff --git a/stdlib/public/SwiftShims/HeapObject.h b/stdlib/public/SwiftShims/HeapObject.h
+index 5e165fd3d4e..cea7477a31e 100644
+--- a/stdlib/public/SwiftShims/HeapObject.h
++++ b/stdlib/public/SwiftShims/HeapObject.h
+@@ -202,6 +202,9 @@ static_assert(alignof(HeapObject) == alignof(void*),
+ (defined(__arm64__) && (__POINTER_WIDTH__ == 32))
+ #define _swift_abi_SwiftSpareBitsMask \
+ (__swift_uintptr_t) SWIFT_ABI_ARM_SWIFT_SPARE_BITS_MASK
++#elif defined(__powerpc__)
++#define _swift_abi_SwiftSpareBitsMask \
++ (__swift_uintptr_t) SWIFT_ABI_POWERPC_SWIFT_SPARE_BITS_MASK
+ #else
+ #define _swift_abi_SwiftSpareBitsMask \
+ (__swift_uintptr_t) SWIFT_ABI_DEFAULT_SWIFT_SPARE_BITS_MASK
+diff --git a/stdlib/public/SwiftShims/RefCount.h b/stdlib/public/SwiftShims/RefCount.h
+index fc067f70f55..27a6d22cf47 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__ || __powerpc__
++ refCounts(SideTableRefCounts::Initialized)
++#else
++ refCounts()
++#endif
+ { }
+
+ #pragma clang diagnostic push
+diff --git a/stdlib/public/SwiftShims/System.h b/stdlib/public/SwiftShims/System.h
+index 8fe54f6bda5..978ec41f1ea 100644
+--- a/stdlib/public/SwiftShims/System.h
++++ b/stdlib/public/SwiftShims/System.h
+@@ -173,6 +173,11 @@
+ #define SWIFT_ABI_ARM64_OBJC_WEAK_REFERENCE_MARKER_VALUE \
+ (1<<SWIFT_ABI_ARM64_OBJC_NUM_RESERVED_LOW_BITS)
+
++/*********************************** powerpc ********************************/
++
++// Heap objects are pointer-aligned, so the low two bits are unused.
++#define SWIFT_ABI_POWERPC_SWIFT_SPARE_BITS_MASK 0x00000003U
++
+ /*********************************** powerpc64 ********************************/
+
+ // Heap objects are pointer-aligned, so the low three bits are unused.
+diff --git a/stdlib/public/core/AtomicInt.swift.gyb b/stdlib/public/core/AtomicInt.swift.gyb
+index a66212f4b35..56fed2cb117 100644
+--- a/stdlib/public/core/AtomicInt.swift.gyb
++++ b/stdlib/public/core/AtomicInt.swift.gyb
+@@ -65,7 +65,7 @@ internal func _swift_stdlib_atomicCompareExchangeStrongInt(
+ object target: UnsafeMutablePointer<Int>,
+ expected: UnsafeMutablePointer<Int>,
+ desired: Int) -> Bool {
+-#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
++#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32) || arch(powerpc)
+ let (oldValue, won) = Builtin.cmpxchg_seqcst_seqcst_Int32(
+ target._rawValue, expected.pointee._value, desired._value)
+ #elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
+@@ -82,7 +82,7 @@ internal func _swift_stdlib_atomicCompareExchangeStrongInt(
+ public // Existing uses outside stdlib
+ func _swift_stdlib_atomicLoadInt(
+ object target: UnsafeMutablePointer<Int>) -> Int {
+-#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
++#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32) || arch(powerpc)
+ let value = Builtin.atomicload_seqcst_Int32(target._rawValue)
+ return Int(value)
+ #elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
+@@ -95,7 +95,7 @@ func _swift_stdlib_atomicLoadInt(
+ internal func _swift_stdlib_atomicStoreInt(
+ object target: UnsafeMutablePointer<Int>,
+ desired: Int) {
+-#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
++#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32) || arch(powerpc)
+ Builtin.atomicstore_seqcst_Int32(target._rawValue, desired._value)
+ #elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
+ Builtin.atomicstore_seqcst_Int64(target._rawValue, desired._value)
+@@ -111,7 +111,7 @@ func _swift_stdlib_atomicFetch${operation}Int(
+ object target: UnsafeMutablePointer<Int>,
+ operand: Int) -> Int {
+ let rawTarget = UnsafeMutableRawPointer(target)
+-#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
++#if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32) || arch(powerpc)
+ let value = _swift_stdlib_atomicFetch${operation}Int32(
+ object: rawTarget.assumingMemoryBound(to: Int32.self),
+ operand: Int32(operand))
+diff --git a/stdlib/public/core/Builtin.swift b/stdlib/public/core/Builtin.swift
+index 8a7bb33243a..b1675ee89fc 100644
+--- a/stdlib/public/core/Builtin.swift
++++ b/stdlib/public/core/Builtin.swift
+@@ -388,7 +388,7 @@ internal var _objectPointerLowSpareBitShift: UInt {
+ }
+ }
+
+-#if arch(i386) || arch(arm) || arch(wasm32) || arch(powerpc64) || arch(
++#if arch(i386) || arch(arm) || arch(wasm32) || arch(powerpc) || arch(powerpc64) || arch(
+ powerpc64le) || arch(s390x) || arch(arm64_32)
+ @inlinable
+ internal var _objectPointerIsObjCBit: UInt {
+diff --git a/stdlib/public/runtime/Float16Support.cpp b/stdlib/public/runtime/Float16Support.cpp
+index 817739d4cdf..c55ed8b58f2 100644
+--- a/stdlib/public/runtime/Float16Support.cpp
++++ b/stdlib/public/runtime/Float16Support.cpp
+@@ -15,6 +15,7 @@
+ // __gnu_h2f_ieee
+ // __gnu_f2h_ieee
+ // __truncdfhf2
++// __multi3
+ //
+ // On Darwin platforms, these are provided by the host compiler-rt, but we
+ // can't depend on that everywhere, so we have to provide them in the Swift
+@@ -27,12 +28,66 @@
+ //
+ //===----------------------------------------------------------------------===//
+
++#include "../SwiftShims/Visibility.h"
++#include <endian.h>
++#include <stdint.h>
++#include <climits>
++
++// PowerPC 32-bit Glibc does not provide __multi3
++#if defined(__powerpc__)
++
++typedef int int128_t __attribute__((mode(TI)));
++typedef unsigned int uint128_t __attribute__((mode(TI)));
++
++typedef union {
++ int128_t all;
++ struct {
++#if __BYTE_ORDER == __LITTLE_ENDIAN
++ uint64_t low;
++ int64_t high;
++#else
++ int64_t high;
++ uint64_t low;
++#endif
++ } s;
++} twords;
++
++SWIFT_RUNTIME_EXPORT int64_t __mulddi3(uint64_t a, uint64_t b) {
++ twords r;
++ const int bits_in_dword_2 = (int)(sizeof(int64_t) * CHAR_BIT) / 2;
++ const uint64_t lower_mask = (uint64_t)~0 >> bits_in_dword_2;
++ r.s.low = (a & lower_mask) * (b & lower_mask);
++ uint64_t t = r.s.low >> bits_in_dword_2;
++ r.s.low &= lower_mask;
++ t += (a >> bits_in_dword_2) * (b & lower_mask);
++ r.s.low += (t & lower_mask) << bits_in_dword_2;
++ r.s.high = t >> bits_in_dword_2;
++ t = r.s.low >> bits_in_dword_2;
++ r.s.low &= lower_mask;
++ t += (b >> bits_in_dword_2) * (a & lower_mask);
++ r.s.low += (t & lower_mask) << bits_in_dword_2;
++ r.s.high += t >> bits_in_dword_2;
++ r.s.high += (a >> bits_in_dword_2) * (b >> bits_in_dword_2);
++ return r.all;
++}
++
++SWIFT_RUNTIME_EXPORT int64_t __multi3(int128_t a, int128_t b) {
++ twords x;
++ x.all = a;
++ twords y;
++ y.all = b;
++ twords r;
++ r.all = __mulddi3(x.s.low, y.s.low);
++ r.s.high += x.s.high * y.s.low + x.s.low * y.s.high;
++ return r.all;
++}
++
++#endif
++
+ // 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__)) || \
+- ((defined(__i386__) || defined(__i686__) || defined(__x86_64__)) && !defined(__APPLE__))
+-
+-#include "../SwiftShims/Visibility.h"
++ ((defined(__i386__) || defined(__i686__) || defined(__x86_64__)|| defined(__powerpc__)) && !defined(__APPLE__))
+
+ static unsigned toEncoding(float f) {
+ unsigned e;
+diff --git a/stdlib/public/stubs/MathStubs.cpp b/stdlib/public/stubs/MathStubs.cpp
+index 8d0617089ca..1f0c8693c29 100644
+--- a/stdlib/public/stubs/MathStubs.cpp
++++ b/stdlib/public/stubs/MathStubs.cpp
+@@ -112,7 +112,7 @@ __muloti4(ti_int a, ti_int b, int* overflow)
+ // lowered to instructions as though MSVC had generated. There does not seem to
+ // be a MSVC provided multiply with overflow detection that I can see, but this
+ // avoids an unnecessary dependency on compiler-rt for a single function.
+-#if (defined(__linux__) && (defined(__arm__) || defined(__i386__))) || defined(_WIN32)
++#if (defined(__linux__) && (defined(__arm__) || defined(__i386__) || defined(__powerpc__))) || defined(_WIN32)
+
+ // Similar to above, but with mulodi4. Perhaps this is
+ // something that shouldn't be done, and is a bandaid over
+diff --git a/test/Inputs/clang-importer-sdk/swift-modules/CoreGraphics.swift b/test/Inputs/clang-importer-sdk/swift-modules/CoreGraphics.swift
+index dbb14cebc2a..dbb0ccc70c7 100644
+--- a/test/Inputs/clang-importer-sdk/swift-modules/CoreGraphics.swift
++++ b/test/Inputs/clang-importer-sdk/swift-modules/CoreGraphics.swift
+@@ -6,7 +6,7 @@ public func == (lhs: CGPoint, rhs: CGPoint) -> Bool {
+ }
+
+ public struct CGFloat {
+-#if arch(i386) || arch(arm) || arch(arm64_32)
++#if arch(i386) || arch(arm) || arch(arm64_32) || arch(powerpc)
+ public typealias UnderlyingType = Float
+ #elseif arch(x86_64) || arch(arm64) || arch(powerpc64le) || arch(s390x)
+ public typealias UnderlyingType = Double
+diff --git a/test/Interpreter/builtin_bridge_object.swift b/test/Interpreter/builtin_bridge_object.swift
+index c6ee1908252..a33c1fb1ed8 100644
+--- a/test/Interpreter/builtin_bridge_object.swift
++++ b/test/Interpreter/builtin_bridge_object.swift
+@@ -13,7 +13,7 @@ class C {
+ deinit { print("deallocated") }
+ }
+
+-#if arch(i386) || arch(arm) || arch(arm64_32)
++#if arch(i386) || arch(arm) || arch(arm64_32) || arch(powerpc)
+
+ // We have no ObjC tagged pointers, and two low spare bits due to alignment.
+ let NATIVE_SPARE_BITS: UInt = 0x0000_0003
+diff --git a/test/stdlib/Inputs/FloatingPointConversion.swift.gyb b/test/stdlib/Inputs/FloatingPointConversion.swift.gyb
+index e95d1ca5b5f..433c2327338 100644
+--- a/test/stdlib/Inputs/FloatingPointConversion.swift.gyb
++++ b/test/stdlib/Inputs/FloatingPointConversion.swift.gyb
+@@ -134,7 +134,7 @@ FloatingPointConversionFailures.test("${OtherFloat}To${Self}Conversion/AlwaysSuc
+
+ % end # for in all_floating_point_types (Other)
+
+-#if arch(i386) || arch(arm) || arch(arm64_32)
++#if arch(i386) || arch(arm) || arch(arm64_32) || arch(powerpc)
+ % int_types = all_integer_types(32)
+ #elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
+ % int_types = all_integer_types(64)
+diff --git a/test/stdlib/Runtime.swift.gyb b/test/stdlib/Runtime.swift.gyb
+index ee04dfc4082..0df1e6398e2 100644
+--- a/test/stdlib/Runtime.swift.gyb
++++ b/test/stdlib/Runtime.swift.gyb
+@@ -684,7 +684,7 @@ Reflection.test("multiprotocolTypes") {
+ var BitTwiddlingTestSuite = TestSuite("BitTwiddling")
+
+ BitTwiddlingTestSuite.test("_pointerSize") {
+-#if arch(i386) || arch(arm) || arch(arm64_32)
++#if arch(i386) || arch(arm) || arch(arm64_32) || arch(powerpc)
+ expectEqual(4, MemoryLayout<Optional<AnyObject>>.size)
+ #elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
+ expectEqual(8, MemoryLayout<Optional<AnyObject>>.size)
+@@ -708,7 +708,7 @@ BitTwiddlingTestSuite.test("_isPowerOf2/Int") {
+ expectTrue(_isPowerOf2(asInt(2)))
+ expectFalse(_isPowerOf2(asInt(3)))
+ expectTrue(_isPowerOf2(asInt(1024)))
+-#if arch(i386) || arch(arm) || arch(arm64_32)
++#if arch(i386) || arch(arm) || arch(arm64_32) || arch(powerpc)
+ // Not applicable to 32-bit architectures.
+ #elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
+ expectTrue(_isPowerOf2(asInt(0x8000_0000)))
+diff --git a/test/stdlib/UnsafePointer.swift.gyb b/test/stdlib/UnsafePointer.swift.gyb
+index 4820dd87f94..ecb953e6c0f 100644
+--- a/test/stdlib/UnsafePointer.swift.gyb
++++ b/test/stdlib/UnsafePointer.swift.gyb
+@@ -401,7 +401,7 @@ ${SelfName}TestSuite.test("customMirror") {
+ let ptr = ${SelfType}(bitPattern: reallyBigInt)!
+ let mirror = ptr.customMirror
+ expectEqual(1, mirror.children.count)
+-#if arch(i386) || arch(arm) || arch(arm64_32)
++#if arch(i386) || arch(arm) || arch(arm64_32) || arch(powerpc)
+ expectEqual("18446744071562067968", String(describing: mirror.children.first!.1))
+ #elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
+ expectEqual("9223372036854775808", String(describing: mirror.children.first!.1))
+@@ -416,7 +416,7 @@ ${SelfName}TestSuite.test("customPlaygroundQuickLook") {
+ let reallyBigInt: UInt = UInt(Int.max) + 1
+ let ptr = ${SelfType}(bitPattern: reallyBigInt)!
+ if case let .text(desc) = ptr.customPlaygroundQuickLook {
+-#if arch(i386) || arch(arm) || arch(arm64_32)
++#if arch(i386) || arch(arm) || arch(arm64_32) || arch(powerpc)
+ expectEqual("${SelfName}(0xFFFFFFFF80000000)", desc)
+ #elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
+ expectEqual("${SelfName}(0x8000000000000000)", desc)
+diff --git a/utils/build-script-impl b/utils/build-script-impl
+index 074e6f6cad2..0d0da49f3b2 100755
+--- a/utils/build-script-impl
++++ b/utils/build-script-impl
+@@ -455,6 +455,7 @@ function verify_host_is_supported() {
+ | linux-armv6 \
+ | linux-armv7 \
+ | linux-aarch64 \
++ | linux-powerpc \
+ | linux-powerpc64 \
+ | linux-powerpc64le \
+ | linux-s390x \
+diff --git a/utils/swift-bench.py b/utils/swift-bench.py
+index 0ec7343c7eb..a61b1de0c81 100644
+--- a/utils/swift-bench.py
++++ b/utils/swift-bench.py
+@@ -146,7 +146,7 @@ func _opaqueGetInt64(x: Int) -> Int
+
+ @inline(never)
+ public func getInt(x: Int) -> Int {
+-#if arch(i386) || arch(arm) || arch(arm64_32)
++#if arch(i386) || arch(arm) || arch(arm64_32)|| arch(powerpc)
+ return _opaqueGetInt32(x)
+ #elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || \
+ arch(powerpc64le) || arch(s390x)
+diff --git a/utils/swift_build_support/swift_build_support/targets.py b/utils/swift_build_support/swift_build_support/targets.py
+index 05966defe28..b85f1dd4ffe 100644
+--- a/utils/swift_build_support/swift_build_support/targets.py
++++ b/utils/swift_build_support/swift_build_support/targets.py
+@@ -227,6 +227,7 @@ class StdlibDeploymentTarget(object):
+ "armv6",
+ "armv7",
+ "aarch64",
++ "powerpc",
+ "powerpc64",
+ "powerpc64le",
+ "s390x"])
+@@ -306,6 +307,8 @@ class StdlibDeploymentTarget(object):
+ return StdlibDeploymentTarget.Linux.armv6
+ elif machine == 'aarch64':
+ return StdlibDeploymentTarget.Linux.aarch64
++ elif machine == 'ppc':
++ return StdlibDeploymentTarget.Linux.powerpc
+ elif machine == 'ppc64':
+ return StdlibDeploymentTarget.Linux.powerpc64
+ elif machine == 'ppc64le':
diff --git a/package/swift/swift.hash b/package/swift/swift.hash
new file mode 100644
index 0000000000..3c1d012f41
--- /dev/null
+++ b/package/swift/swift.hash
@@ -0,0 +1 @@
+sha256 15e3e092ad165c35eef59cf2449e3089a0bb1906272127ba58fa31fc53512af5 swift-5.6-RELEASE.tar.gz
diff --git a/package/swift/swift.mk b/package/swift/swift.mk
new file mode 100644
index 0000000000..2a1f896979
--- /dev/null
+++ b/package/swift/swift.mk
@@ -0,0 +1,218 @@
+### Apple's Swift Programming Language
+SWIFT_VERSION = 5.6
+SWIFT_SOURCE = swift-$(SWIFT_VERSION)-RELEASE.tar.gz
+SWIFT_SITE = https://github.com/apple/swift/archive/refs/tags
+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 = icu libxml2 libbsd libdispatch
+
+ifeq ($(BR2_TOOLCHAIN_HAS_LIBATOMIC),y)
+SWIFT_CONF_ENV += LIBS="-latomic"
+endif
+
+HOST_SWIFT_SUPPORT_DIR = $(HOST_DIR)/usr/share/swift
+SWIFTPM_DESTINATION_FILE = $(HOST_SWIFT_SUPPORT_DIR)/$(SWIFT_TARGET_NAME)-toolchain.json
+
+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),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
+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
+ # Clean
+ rm -rf $(SWIFT_BUILDDIR)
+ # 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="/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
+ mkdir -p $(HOST_SWIFT_SUPPORT_DIR)
+ # Copy runtime libraries and swift interfaces
+ cp -rf $(SWIFT_BUILDDIR)/lib/swift ${STAGING_DIR}/usr/lib/
+ # Generate SwiftPM cross compilation toolchain file
+ rm -f $(SWIFTPM_DESTINATION_FILE)
+ touch $(SWIFTPM_DESTINATION_FILE)
+ echo '{' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "version":1,' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "sdk":"$(STAGING_DIR)",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "toolchain-bin-dir":"$(SWIFT_NATIVE_PATH)",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "target":"$(SWIFT_TARGET_NAME)",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "dynamic-library-extension":"so",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "extra-cc-flags":[' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-fPIC"' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' ],' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "extra-swiftc-flags":[' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-target", "$(SWIFT_TARGET_NAME)",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-use-ld=lld",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-tools-directory", "/usr/bin",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-Xlinker", "-rpath", "-Xlinker", "/usr/lib/swift/linux",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-Xlinker", "-L$(STAGING_DIR)",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-Xlinker", "-L$(STAGING_DIR)/lib",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-Xlinker", "-L$(STAGING_DIR)/usr/lib",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-Xlinker", "-L$(STAGING_DIR)/usr/lib/swift/linux",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-Xlinker", "-L$(STAGING_DIR)/usr/lib/swift/linux/$(SWIFT_TARGET_ARCH)",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-Xlinker", "-L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION))",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-Xlinker", "--build-id=sha1",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-I$(STAGING_DIR)/usr/include",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-I$(STAGING_DIR)/usr/lib/swift",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-resource-dir", "$(STAGING_DIR)/usr/lib/swift",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-Xclang-linker", "-B$(STAGING_DIR)/usr/lib",' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-Xclang-linker", "-B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION))",' >> $(SWIFTPM_DESTINATION_FILE)
+
+ @if [ "$(SWIFT_TARGET_ARCH)" = "powerpc" ]; then\
+ echo ' "-Xclang-linker", "-latomic",' >> $(SWIFTPM_DESTINATION_FILE);\
+ fi
+
+ echo ' "-sdk", "$(STAGING_DIR)"' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' ],' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "extra-cpp-flags":[' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' "-lstdc++"' >> $(SWIFTPM_DESTINATION_FILE)
+ echo ' ]' >> $(SWIFTPM_DESTINATION_FILE)
+ echo '}' >> $(SWIFTPM_DESTINATION_FILE)
+
+endef
+
+$(eval $(generic-package))
+$(eval $(host-generic-package))
\ No newline at end of file
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment