Skip to content

Instantly share code, notes, and snippets.

@colemancda
Last active March 27, 2022 06:58
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/83e681b53807e7f82517ec3b32d40cd3 to your computer and use it in GitHub Desktop.
Save colemancda/83e681b53807e7f82517ec3b32d40cd3 to your computer and use it in GitHub Desktop.
Buildroot patches to add Swift 5.6 package with RISCV64 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..8fded1d2a5
--- /dev/null
+++ b/package/swift-crypto/Config.in
@@ -0,0 +1,10 @@
+if BR2_PACKAGE_SWIFT
+
+config BR2_PACKAGE_SWIFT_CRYPTO
+ bool "swift-crypto"
+ select BR2_PACKAGE_SWIFT
+ select 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..2f8e596d66
--- /dev/null
+++ b/package/swift-hello/Config.in
@@ -0,0 +1,10 @@
+if BR2_PACKAGE_SWIFT
+
+config BR2_PACKAGE_SWIFT_HELLO
+ bool "swift-hello"
+ select BR2_PACKAGE_SWIFT
+ select 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-riscv64.patch b/package/swift/swift-5.6-riscv64.patch
new file mode 100644
index 0000000000..41f9e1dad9
--- /dev/null
+++ b/package/swift/swift-5.6-riscv64.patch
@@ -0,0 +1,199 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index bc9b6790922..6cc8149e184 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -724,6 +724,8 @@ else()
+ set(SWIFT_HOST_VARIANT_ARCH_default "i686")
+ elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "wasm32")
+ set(SWIFT_HOST_VARIANT_ARCH_default "wasm32")
++ elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "riscv64")
++ set(SWIFT_HOST_VARIANT_ARCH_default "riscv64")
+ else()
+ message(FATAL_ERROR "Unrecognized architecture on host system: ${CMAKE_SYSTEM_PROCESSOR}")
+ endif()
+diff --git a/cmake/modules/SwiftConfigureSDK.cmake b/cmake/modules/SwiftConfigureSDK.cmake
+index 3c866f2e65c..21d325c07c7 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|powerpc64|powerpc64le|s390x|x86_64|riscv64)")
+ 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..d43050d2a6e 100644
+--- a/cmake/modules/SwiftSetIfArchBitness.cmake
++++ b/cmake/modules/SwiftSetIfArchBitness.cmake
+@@ -23,7 +23,8 @@ function(set_if_arch_bitness var_name)
+ "${SIA_ARCH}" STREQUAL "aarch64" OR
+ "${SIA_ARCH}" STREQUAL "powerpc64" OR
+ "${SIA_ARCH}" STREQUAL "powerpc64le" OR
+- "${SIA_ARCH}" STREQUAL "s390x")
++ "${SIA_ARCH}" STREQUAL "s390x" OR
++ "${SIA_ARCH}" STREQUAL "riscv64")
+ set("${var_name}" "${SIA_CASE_64_BIT}" PARENT_SCOPE)
+ else()
+ message(FATAL_ERROR "Unknown architecture: ${SIA_ARCH}")
+diff --git a/lib/Basic/LangOptions.cpp b/lib/Basic/LangOptions.cpp
+index b9e8b488d9c..04ce2b64444 100644
+--- a/lib/Basic/LangOptions.cpp
++++ b/lib/Basic/LangOptions.cpp
+@@ -66,6 +66,7 @@ static const SupportedConditionalValue SupportedConditionalCompilationArches[] =
+ "powerpc64le",
+ "s390x",
+ "wasm32",
++ "riscv64",
+ };
+
+ static const SupportedConditionalValue SupportedConditionalCompilationEndianness[] = {
+@@ -312,6 +313,9 @@ std::pair<bool, bool> LangOptions::setTarget(llvm::Triple triple) {
+ addPlatformConditionValue(PlatformConditionKind::Arch, "arm64");
+ }
+ break;
++ case llvm::Triple::ArchType::riscv64:
++ addPlatformConditionValue(PlatformConditionKind::Arch, "riscv64");
++ break;
+ case llvm::Triple::ArchType::ppc64:
+ addPlatformConditionValue(PlatformConditionKind::Arch, "powerpc64");
+ break;
+@@ -346,6 +350,7 @@ std::pair<bool, bool> LangOptions::setTarget(llvm::Triple triple) {
+ case llvm::Triple::ArchType::aarch64_32:
+ case llvm::Triple::ArchType::ppc64le:
+ case llvm::Triple::ArchType::wasm32:
++ case llvm::Triple::ArchType::riscv64:
+ case llvm::Triple::ArchType::x86:
+ case llvm::Triple::ArchType::x86_64:
+ addPlatformConditionValue(PlatformConditionKind::Endianness, "little");
+diff --git a/stdlib/cmake/modules/SwiftSource.cmake b/stdlib/cmake/modules/SwiftSource.cmake
+index 4bc312f7f89..322e7829578 100644
+--- a/stdlib/cmake/modules/SwiftSource.cmake
++++ b/stdlib/cmake/modules/SwiftSource.cmake
+@@ -520,6 +520,10 @@ function(_compile_swift_files
+
+ list(APPEND swift_flags ${SWIFT_STDLIB_EXTRA_SWIFT_COMPILE_FLAGS})
+
++ if(CFLAGS_ARCH STREQUAL "riscv64")
++ list(APPEND swift_flags "-Xcc" "-mno-relax")
++ endif()
++
+ list(APPEND swift_flags ${SWIFT_EXPERIMENTAL_EXTRA_FLAGS})
+
+ if(SWIFTFILE_OPT_FLAGS)
+diff --git a/stdlib/public/core/AtomicInt.swift.gyb b/stdlib/public/core/AtomicInt.swift.gyb
+index a66212f4b35..1910009c996 100644
+--- a/stdlib/public/core/AtomicInt.swift.gyb
++++ b/stdlib/public/core/AtomicInt.swift.gyb
+@@ -68,7 +68,7 @@ internal func _swift_stdlib_atomicCompareExchangeStrongInt(
+ #if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
+ 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)
++#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) || arch(riscv64)
+ let (oldValue, won) = Builtin.cmpxchg_seqcst_seqcst_Int64(
+ target._rawValue, expected.pointee._value, desired._value)
+ #endif
+@@ -85,7 +85,7 @@ func _swift_stdlib_atomicLoadInt(
+ #if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
+ let value = Builtin.atomicload_seqcst_Int32(target._rawValue)
+ return Int(value)
+-#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
++#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) || arch(riscv64)
+ let value = Builtin.atomicload_seqcst_Int64(target._rawValue)
+ return Int(value)
+ #endif
+@@ -97,7 +97,7 @@ internal func _swift_stdlib_atomicStoreInt(
+ desired: Int) {
+ #if arch(i386) || arch(arm) || arch(arm64_32) || arch(wasm32)
+ Builtin.atomicstore_seqcst_Int32(target._rawValue, desired._value)
+-#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
++#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) || arch(riscv64)
+ Builtin.atomicstore_seqcst_Int64(target._rawValue, desired._value)
+ #endif
+ }
+@@ -115,7 +115,7 @@ func _swift_stdlib_atomicFetch${operation}Int(
+ let value = _swift_stdlib_atomicFetch${operation}Int32(
+ object: rawTarget.assumingMemoryBound(to: Int32.self),
+ operand: Int32(operand))
+-#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
++#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) || arch(riscv64)
+ let value = _swift_stdlib_atomicFetch${operation}Int64(
+ object: rawTarget.assumingMemoryBound(to: Int64.self),
+ operand: Int64(operand))
+diff --git a/stdlib/public/core/Builtin.swift b/stdlib/public/core/Builtin.swift
+index 8a7bb33243a..f74f5c7b769 100644
+--- a/stdlib/public/core/Builtin.swift
++++ b/stdlib/public/core/Builtin.swift
+@@ -389,7 +389,7 @@ internal var _objectPointerLowSpareBitShift: UInt {
+ }
+
+ #if arch(i386) || arch(arm) || arch(wasm32) || arch(powerpc64) || arch(
+- powerpc64le) || arch(s390x) || arch(arm64_32)
++ powerpc64le) || arch(s390x) || arch(arm64_32) || arch(riscv64)
+ @inlinable
+ internal var _objectPointerIsObjCBit: UInt {
+ @inline(__always) get { return 0x0000_0002 }
+diff --git a/stdlib/public/runtime/Float16Support.cpp b/stdlib/public/runtime/Float16Support.cpp
+index 817739d4cdf..acc4cb93811 100644
+--- a/stdlib/public/runtime/Float16Support.cpp
++++ b/stdlib/public/runtime/Float16Support.cpp
+@@ -29,8 +29,8 @@
+
+ // 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__))
++#if ((defined(__ANDROID__) || defined(__linux__)) && defined(__arm__)) || \
++ ((defined(__i386__) || defined(__i686__) || defined(__x86_64__) || defined(__riscv)) && !defined(__APPLE__))
+
+ #include "../SwiftShims/Visibility.h"
+
+diff --git a/stdlib/public/runtime/HeapObject.cpp b/stdlib/public/runtime/HeapObject.cpp
+index 0a276206225..74589177170 100644
+--- a/stdlib/public/runtime/HeapObject.cpp
++++ b/stdlib/public/runtime/HeapObject.cpp
+@@ -66,7 +66,7 @@ static inline bool isValidPointerForNativeRetain(const void *p) {
+ // arm64_32 is special since it has 32-bit pointers but __arm64__ is true.
+ // Catch it early since __POINTER_WIDTH__ is generally non-portable.
+ return p != nullptr;
+-#elif defined(__x86_64__) || defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64) || defined(__s390x__) || (defined(__powerpc64__) && defined(__LITTLE_ENDIAN__))
++#elif defined(__x86_64__) || defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64) || defined(__s390x__) || (defined(__powerpc64__) && defined(__LITTLE_ENDIAN__)) || defined(__riscv)
+ // On these platforms, except s390x, the upper half of address space is reserved for the
+ // kernel, so we can assume that pointer values in this range are invalid.
+ // On s390x it is theoretically possible to have high bit set but in practice
+diff --git a/stdlib/public/stubs/MathStubs.cpp b/stdlib/public/stubs/MathStubs.cpp
+index 8d0617089ca..7ff97bc3687 100644
+--- a/stdlib/public/stubs/MathStubs.cpp
++++ b/stdlib/public/stubs/MathStubs.cpp
+@@ -64,6 +64,7 @@ extern "C" {
+ (defined(__linux__) && defined(__aarch64__)) || \
+ (defined(__linux__) && defined(__powerpc64__)) || \
+ (defined(__linux__) && defined(__s390x__)) || \
++ (defined(__linux__) && defined(__riscv)) || \
+ (defined(__ANDROID__) && defined(__aarch64__))
+
+ SWIFT_RUNTIME_STDLIB_API
+diff --git a/utils/build-presets.ini b/utils/build-presets.ini
+index 64ba12b1e04..c2827b1212b 100644
+--- a/utils/build-presets.ini
++++ b/utils/build-presets.ini
+@@ -864,6 +864,7 @@ relocate-xdg-cache-home-under-build-subdir
+ mixin-preset=
+ mixin_linux_installation
+ build-subdir=buildbot_linux
++llvm-targets-to-build=X86;ARM;AArch64;PowerPC;SystemZ;Mips;RISCV
+ lldb
+ release
+ test
+@@ -1481,7 +1482,7 @@ mixin-preset=
+ [preset: LLDB_Nested]
+ skip-build-benchmarks
+ install-destdir=%(swift_install_destdir)s
+-llvm-targets-to-build=X86;ARM;AArch64;PowerPC;SystemZ;Mips
++llvm-targets-to-build=X86;ARM;AArch64;PowerPC;SystemZ;Mips;RISCV
+
+ [preset: LLDB_Swift_DebugAssert]
+ mixin-preset=
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..2785fc1f1e
--- /dev/null
+++ b/package/swift/swift.mk
@@ -0,0 +1,170 @@
+### 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
+SWIFT_CMAKE_TOOLCHAIN_FILE = $(HOST_SWIFT_SUPPORT_DIR)/linux-$(SWIFT_TARGET_ARCH)-toolchain.cmake
+
+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
+
+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) \
+ -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 \
+ -DZLIB_LIBRARY=$(STAGING_DIR)/usr/lib/libz.so \
+ -DSWIFT_PATH_TO_LIBDISPATCH_SOURCE=${LIBDISPATCH_SRCDIR} \
+ -DSWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY=ON \
+ -DCMAKE_Swift_FLAGS="-Xcc -mno-relax" \
+ -DCMAKE_Swift_FLAGS_DEBUG="" \
+ -DCMAKE_Swift_FLAGS_RELEASE="" \
+ -DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+ )
+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
+ cp -rf $(SWIFT_BUILDDIR)/lib/swift ${STAGING_DIR}/usr/lib/
+ # Generate SwiftPM cross compilation toolchain file
+ mkdir -p $(HOST_SWIFT_SUPPORT_DIR)
+ 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)
+ 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