All of lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH 1/1] package/swift: add Swift runtime libraries
@ 2022-03-28  6:00 Alsey Coleman Miller
  2022-03-28 20:35 ` Arnout Vandecappelle
  0 siblings, 1 reply; 4+ messages in thread
From: Alsey Coleman Miller @ 2022-03-28  6:00 UTC (permalink / raw)
  To: buildroot; +Cc: Alsey Coleman Miller, Thomas Petazzoni

Signed-off-by: Alsey Coleman Miller <alseycmiller@gmail.com>
---
 package/Config.in                             |  11 +
 package/foundation/Config.in                  |  14 ++
 package/foundation/foundation.hash            |   1 +
 package/foundation/foundation.mk              | 102 ++++++++
 package/libdispatch/Config.in                 |  11 +
 package/libdispatch/libdispatch.hash          |   2 +
 package/libdispatch/libdispatch.mk            |  78 ++++++
 package/libswiftdispatch/Config.in            |  12 +
 .../libswiftdispatch/libswiftdispatch.hash    |   2 +
 package/libswiftdispatch/libswiftdispatch.mk  |  86 +++++++
 package/swift-crypto/Config.in                |  10 +
 .../swift-crypto-shared-lib.patch             |  13 +
 package/swift-crypto/swift-crypto.mk          |  36 +++
 package/swift-hello/Config.in                 |  10 +
 package/swift-hello/src/Package.swift         |  22 ++
 .../src/Sources/swift-hello/Hello.swift       |  31 +++
 .../swift-helloTests/swift_helloTests.swift   |  47 ++++
 package/swift-hello/swift-hello.mk            |  33 +++
 package/swift/Config.in                       |  55 +++++
 package/swift/Float16.patch                   |  13 +
 package/swift/RefCount.h.diff                 |  18 ++
 package/swift/swift-5.6-armv5.patch           | 161 ++++++++++++
 package/swift/swift.hash                      |   1 +
 package/swift/swift.mk                        | 232 ++++++++++++++++++
 24 files changed, 1001 insertions(+)
 create mode 100644 package/foundation/Config.in
 create mode 100644 package/foundation/foundation.hash
 create mode 100644 package/foundation/foundation.mk
 create mode 100644 package/libdispatch/Config.in
 create mode 100644 package/libdispatch/libdispatch.hash
 create mode 100644 package/libdispatch/libdispatch.mk
 create mode 100644 package/libswiftdispatch/Config.in
 create mode 100644 package/libswiftdispatch/libswiftdispatch.hash
 create mode 100644 package/libswiftdispatch/libswiftdispatch.mk
 create mode 100644 package/swift-crypto/Config.in
 create mode 100644 package/swift-crypto/swift-crypto-shared-lib.patch
 create mode 100644 package/swift-crypto/swift-crypto.mk
 create mode 100644 package/swift-hello/Config.in
 create mode 100644 package/swift-hello/src/Package.swift
 create mode 100644 package/swift-hello/src/Sources/swift-hello/Hello.swift
 create mode 100644 package/swift-hello/src/Tests/swift-helloTests/swift_helloTests.swift
 create mode 100644 package/swift-hello/swift-hello.mk
 create mode 100644 package/swift/Config.in
 create mode 100644 package/swift/Float16.patch
 create mode 100644 package/swift/RefCount.h.diff
 create mode 100644 package/swift/swift-5.6-armv5.patch
 create mode 100644 package/swift/swift.hash
 create mode 100644 package/swift/swift.mk

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/Float16.patch b/package/swift/Float16.patch
new file mode 100644
index 0000000000..2768d0cd20
--- /dev/null
+++ b/package/swift/Float16.patch
@@ -0,0 +1,13 @@
+diff --git a/stdlib/public/runtime/Float16Support.cpp b/stdlib/public/runtime/Float16Support.cpp
+index 817739d4cdf..b1896a4e364 100644
+--- a/stdlib/public/runtime/Float16Support.cpp
++++ b/stdlib/public/runtime/Float16Support.cpp
+@@ -29,7 +29,7 @@
+ 
+ // Android NDK <r21 do not provide `__aeabi_d2h` in the compiler runtime,
+ // provide shims in that case.
+-#if (defined(__ANDROID__) && defined(__ARM_ARCH_7A__) && defined(__ARM_EABI__)) || \
++#if ((defined(__ANDROID__) || defined(__linux__)) && defined(__arm__)) || \
+   ((defined(__i386__) || defined(__i686__) || defined(__x86_64__)) && !defined(__APPLE__))
+ 
+ #include "../SwiftShims/Visibility.h"
diff --git a/package/swift/RefCount.h.diff b/package/swift/RefCount.h.diff
new file mode 100644
index 0000000000..332ff549dc
--- /dev/null
+++ b/package/swift/RefCount.h.diff
@@ -0,0 +1,18 @@
+diff --git a/stdlib/public/SwiftShims/RefCount.h b/stdlib/public/SwiftShims/RefCount.h
+index 5c8211f5e9f..fe54839aaae 100644
+--- a/stdlib/public/SwiftShims/RefCount.h
++++ b/stdlib/public/SwiftShims/RefCount.h
+@@ -1319,7 +1319,12 @@ class HeapObjectSideTableEntry {
+ 
+   public:
+   HeapObjectSideTableEntry(HeapObject *newObject)
+-    : object(newObject), refCounts()
++    : object(newObject), 
++#if __arm__ // https://bugs.swift.org/browse/SR-5846
++   refCounts(SideTableRefCounts::Initialized)
++#else
++   refCounts()
++#endif
+   { }
+ 
+ #pragma clang diagnostic push
diff --git a/package/swift/swift-5.6-armv5.patch b/package/swift/swift-5.6-armv5.patch
new file mode 100644
index 0000000000..61557a6e62
--- /dev/null
+++ b/package/swift/swift-5.6-armv5.patch
@@ -0,0 +1,161 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index bc9b6790922..5c15bc7048b 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -713,6 +713,8 @@ else()
+     set(SWIFT_HOST_VARIANT_ARCH_default "powerpc64le")
+   elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "s390x")
+     set(SWIFT_HOST_VARIANT_ARCH_default "s390x")
++  elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "armv5|armv5te")
++    set(SWIFT_HOST_VARIANT_ARCH_default "armv5")
+   # FIXME: Only matches v6l/v7l - by far the most common variants
+   elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv6l")
+     set(SWIFT_HOST_VARIANT_ARCH_default "armv6")
+diff --git a/cmake/modules/AddSwift.cmake b/cmake/modules/AddSwift.cmake
+index a448bcb23c4..4bafb119105 100644
+--- a/cmake/modules/AddSwift.cmake
++++ b/cmake/modules/AddSwift.cmake
+@@ -338,7 +338,7 @@ function(_add_host_variant_link_flags target)
+     target_link_libraries(${target} PRIVATE
+       pthread
+       dl)
+-    if("${SWIFT_HOST_VARIANT_ARCH}" MATCHES "armv6|armv7|i686")
++    if("${SWIFT_HOST_VARIANT_ARCH}" MATCHES "armv5|armv6|armv7|i686")
+       target_link_libraries(${target} PRIVATE atomic)
+     endif()
+   elseif(SWIFT_HOST_VARIANT_SDK STREQUAL FREEBSD)
+diff --git a/cmake/modules/AddSwiftUnittests.cmake b/cmake/modules/AddSwiftUnittests.cmake
+index 54a3138bec7..4b9dcf11197 100644
+--- a/cmake/modules/AddSwiftUnittests.cmake
++++ b/cmake/modules/AddSwiftUnittests.cmake
+@@ -37,7 +37,7 @@ function(add_swift_unittest test_dirname)
+     if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64")
+       target_compile_options(${test_dirname} PRIVATE
+         -march=core2)
+-    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "armv6|armv7|i686")
++    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "armv5|armv6|armv7|i686")
+       set_property(TARGET "${test_dirname}" APPEND PROPERTY LINK_LIBRARIES
+         "atomic")
+     endif()
+diff --git a/cmake/modules/SwiftConfigureSDK.cmake b/cmake/modules/SwiftConfigureSDK.cmake
+index 3c866f2e65c..103f1296fad 100644
+--- a/cmake/modules/SwiftConfigureSDK.cmake
++++ b/cmake/modules/SwiftConfigureSDK.cmake
+@@ -323,7 +323,9 @@ macro(configure_sdk_unix name architectures)
+       endif()
+ 
+       if("${prefix}" STREQUAL "LINUX")
+-        if(arch MATCHES "(armv6|armv7)")
++        if(arch MATCHES "(armv5)")
++          set(SWIFT_SDK_LINUX_ARCH_${arch}_TRIPLE "${arch}-unknown-linux-gnueabi")
++        elseif(arch MATCHES "(armv6|armv7)")
+           set(SWIFT_SDK_LINUX_ARCH_${arch}_TRIPLE "${arch}-unknown-linux-gnueabihf")
+         elseif(arch MATCHES "(aarch64|i686|powerpc64|powerpc64le|s390x|x86_64)")
+           set(SWIFT_SDK_LINUX_ARCH_${arch}_TRIPLE "${arch}-unknown-linux-gnu")
+diff --git a/cmake/modules/SwiftSetIfArchBitness.cmake b/cmake/modules/SwiftSetIfArchBitness.cmake
+index fa29d77fe26..74a43e33343 100644
+--- a/cmake/modules/SwiftSetIfArchBitness.cmake
++++ b/cmake/modules/SwiftSetIfArchBitness.cmake
+@@ -9,6 +9,7 @@ function(set_if_arch_bitness var_name)
+   if("${SIA_ARCH}" STREQUAL "i386" OR
+      "${SIA_ARCH}" STREQUAL "i686" OR
+      "${SIA_ARCH}" STREQUAL "x86" OR
++     "${SIA_ARCH}" STREQUAL "armv5" OR
+      "${SIA_ARCH}" STREQUAL "armv6" OR
+      "${SIA_ARCH}" STREQUAL "armv7" OR
+      "${SIA_ARCH}" STREQUAL "armv7k" OR
+diff --git a/lib/Basic/Platform.cpp b/lib/Basic/Platform.cpp
+index 141655332d8..47759ba6b8e 100644
+--- a/lib/Basic/Platform.cpp
++++ b/lib/Basic/Platform.cpp
+@@ -218,6 +218,8 @@ StringRef swift::getMajorArchitectureName(const llvm::Triple &Triple) {
+       return "armv7";
+     case llvm::Triple::SubArchType::ARMSubArch_v6:
+       return "armv6";
++    case llvm::Triple::SubArchType::ARMSubArch_v5:
++      return "armv5";
+     default:
+       break;
+     }
+diff --git a/lib/IDE/Utils.cpp b/lib/IDE/Utils.cpp
+index fe5d0111dee..a92f0d01790 100644
+--- a/lib/IDE/Utils.cpp
++++ b/lib/IDE/Utils.cpp
+@@ -401,6 +401,10 @@ static std::string adjustClangTriple(StringRef TripleStr) {
+     OS << "armv6k"; break;
+   case llvm::Triple::SubArchType::ARMSubArch_v6t2:
+     OS << "armv6t2"; break;
++  case llvm::Triple::SubArchType::ARMSubArch_v5:
++    OS << "armv5"; break;
++  case llvm::Triple::SubArchType::ARMSubArch_v5te:
++    OS << "armv5te"; break;
+   default:
+     // Adjust i386-macosx to x86_64 because there is no Swift stdlib for i386.
+     if ((Triple.getOS() == llvm::Triple::MacOSX ||
+diff --git a/stdlib/cmake/modules/AddSwiftStdlib.cmake b/stdlib/cmake/modules/AddSwiftStdlib.cmake
+index 104cea4df59..2cf19b3e5bb 100644
+--- a/stdlib/cmake/modules/AddSwiftStdlib.cmake
++++ b/stdlib/cmake/modules/AddSwiftStdlib.cmake
+@@ -404,7 +404,7 @@ function(_add_target_variant_link_flags)
+     MACCATALYST_BUILD_FLAVOR  "${LFLAGS_MACCATALYST_BUILD_FLAVOR}")
+   if("${LFLAGS_SDK}" STREQUAL "LINUX")
+     list(APPEND link_libraries "pthread" "dl")
+-    if("${LFLAGS_ARCH}" MATCHES "armv6|armv7|i686")
++    if("${LFLAGS_ARCH}" MATCHES "armv5|armv6|armv7|i686")
+       list(APPEND link_libraries "atomic")
+     endif()
+   elseif("${LFLAGS_SDK}" STREQUAL "FREEBSD")
+diff --git a/utils/build-script-impl b/utils/build-script-impl
+index 074e6f6cad2..fc05eee2894 100755
+--- a/utils/build-script-impl
++++ b/utils/build-script-impl
+@@ -452,6 +452,7 @@ function verify_host_is_supported() {
+       | haiku-x86_64            \
+       | linux-x86_64            \
+       | linux-i686              \
++      | linux-armv5             \
+       | linux-armv6             \
+       | linux-armv7             \
+       | linux-aarch64           \
+@@ -545,6 +546,10 @@ function set_build_options_for_host() {
+                     ;;
+             esac
+             ;;
++        linux-armv5)
++            SWIFT_HOST_TRIPLE="armv5-unknown-linux-gnueabi"
++            llvm_target_arch="ARM"
++            ;;
+         linux-armv6)
+             SWIFT_HOST_TRIPLE="armv6-unknown-linux-gnueabihf"
+             llvm_target_arch="ARM"
+@@ -1099,7 +1104,7 @@ function false_true() {
+ CROSS_COMPILE_HOSTS=($CROSS_COMPILE_HOSTS)
+ for t in "${CROSS_COMPILE_HOSTS[@]}"; do
+     case ${t} in
+-        macosx* | iphone* | appletv* | watch* | linux-armv6 | linux-armv7 | android-* )
++        macosx* | iphone* | appletv* | watch*| linux-armv5 | linux-armv6 | linux-armv7 | android-* )
+             ;;
+         *)
+             echo "Unknown host to cross-compile for: ${t}"
+diff --git a/utils/swift_build_support/swift_build_support/targets.py b/utils/swift_build_support/swift_build_support/targets.py
+index 05966defe28..e69c4272a02 100644
+--- a/utils/swift_build_support/swift_build_support/targets.py
++++ b/utils/swift_build_support/swift_build_support/targets.py
+@@ -224,6 +224,7 @@ class StdlibDeploymentTarget(object):
+     Linux = Platform("linux", archs=[
+         "x86_64",
+         "i686",
++        "armv5",
+         "armv6",
+         "armv7",
+         "aarch64",
+@@ -304,6 +305,9 @@ class StdlibDeploymentTarget(object):
+             elif machine.startswith('armv6'):
+                 # linux-armv6* is canonicalized to 'linux-armv6'
+                 return StdlibDeploymentTarget.Linux.armv6
++            elif machine.startswith('armv5'):
++                # linux-armv5* is canonicalized to 'linux-armv5'
++                return StdlibDeploymentTarget.Linux.armv5
+             elif machine == 'aarch64':
+                 return StdlibDeploymentTarget.Linux.aarch64
+             elif machine == 'ppc64':
diff --git a/package/swift/swift.hash b/package/swift/swift.hash
new file mode 100644
index 0000000000..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..da10aae8fd
--- /dev/null
+++ b/package/swift/swift.mk
@@ -0,0 +1,232 @@
+### 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),armv5)
+SWIFT_EXTRA_FLAGS		= -march=armv5te
+else ifeq ($(SWIFT_TARGET_ARCH),riscv64)
+SWIFT_EXTRA_FLAGS		= -mno-relax -mabi=lp64 -march=rv64imac -mfloat-abi=soft
+else ifeq ($(SWIFT_TARGET_ARCH),mipsel)
+SWIFT_EXTRA_FLAGS		= -msoft-float
+else ifeq ($(SWIFT_TARGET_ARCH),mips64el)
+SWIFT_EXTRA_FLAGS		= -msoft-float
+else ifeq ($(SWIFT_TARGET_ARCH),powerpc)
+SWIFT_EXTRA_FLAGS		= -mcpu=7400
+else
+SWIFT_EXTRA_FLAGS		= 
+endif
+
+SWIFTC_FLAGS="-target $(SWIFT_TARGET_NAME) -use-ld=lld \
+-resource-dir ${STAGING_DIR}/usr/lib/swift \
+-Xclang-linker -B${STAGING_DIR}/usr/lib \
+-Xclang-linker -B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) \
+-Xcc -I${STAGING_DIR}/usr/include \
+-Xcc -I$(HOST_DIR)/$(GNU_TARGET_NAME)/include/c++/$(call qstrip,$(BR2_GCC_VERSION)) \
+-Xcc -I$(HOST_DIR)/$(GNU_TARGET_NAME)/include/c++/$(call qstrip,$(BR2_GCC_VERSION))/$(GNU_TARGET_NAME) \
+-Xcc $(SWIFT_EXTRA_FLAGS) \
+-L${STAGING_DIR}/lib \
+-L${STAGING_DIR}/usr/lib \
+-L${STAGING_DIR}/usr/lib/swift \
+-L${STAGING_DIR}/usr/lib/swift/linux \
+-L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) \
+-sdk ${STAGING_DIR} \
+"
+
+ifeq (SWIFT_SUPPORTS_IN_SOURCE_BUILD),YES)
+SWIFT_BUILDDIR			= $(SWIFT_SRCDIR)
+else
+SWIFT_BUILDDIR			= $(SWIFT_SRCDIR)/build
+endif
+
+SWIFT_CONF_OPTS = \
+	-DCMAKE_C_COMPILER=$(SWIFT_NATIVE_PATH)/clang \
+    -DCMAKE_CXX_COMPILER=$(SWIFT_NATIVE_PATH)/clang++ \
+    -DCMAKE_C_FLAGS="-w -fuse-ld=lld -target $(SWIFT_TARGET_NAME) --sysroot $(STAGING_DIR) -latomic $(SWIFT_EXTRA_FLAGS) -I$(STAGING_DIR)/usr/include -B$(STAGING_DIR)/usr/lib -B$(STAGING_DIR)/lib -B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) -L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION))" \
+    -DCMAKE_CXX_FLAGS="-w -fuse-ld=lld -target $(SWIFT_TARGET_NAME) --sysroot $(STAGING_DIR) -latomic $(SWIFT_EXTRA_FLAGS) -I$(STAGING_DIR)/usr/include -B$(STAGING_DIR)/usr/lib -B$(STAGING_DIR)/lib -B$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) -L$(HOST_DIR)/lib/gcc/$(GNU_TARGET_NAME)/$(call qstrip,$(BR2_GCC_VERSION)) -I$(HOST_DIR)/$(GNU_TARGET_NAME)/include/c++/$(call qstrip,$(BR2_GCC_VERSION))/ -I$(HOST_DIR)/$(GNU_TARGET_NAME)/include/c++/$(call qstrip,$(BR2_GCC_VERSION))/$(GNU_TARGET_NAME)" \
+    -DCMAKE_C_LINK_FLAGS="--sysroot $(STAGING_DIR) -latomic $(SWIFT_EXTRA_FLAGS)" \
+    -DCMAKE_CXX_LINK_FLAGS="--sysroot $(STAGING_DIR) -latomic $(SWIFT_EXTRA_FLAGS)" \
+	-DSWIFT_USE_LINKER=lld \
+    -DLLVM_USE_LINKER=lld \
+    -DLLVM_DIR=${SWIFT_LLVM_DIR}/lib/cmake/llvm \
+    -DLLVM_BUILD_LIBRARY_DIR=${SWIFT_LLVM_DIR} \
+    -DSWIFT_BUILD_RUNTIME_WITH_HOST_COMPILER=ON \
+    -DSWIFT_NATIVE_CLANG_TOOLS_PATH=${SWIFT_NATIVE_PATH} \
+    -DSWIFT_NATIVE_SWIFT_TOOLS_PATH=${SWIFT_NATIVE_PATH} \
+    -DSWIFT_BUILD_DYNAMIC_SDK_OVERLAY=ON \
+    -DSWIFT_BUILD_DYNAMIC_STDLIB=ON \
+    -DSWIFT_BUILD_REMOTE_MIRROR=OFF \
+    -DSWIFT_BUILD_SOURCEKIT=OFF \
+    -DSWIFT_BUILD_STDLIB_EXTRA_TOOLCHAIN_CONTENT=OFF \
+    -DSWIFT_BUILD_SYNTAXPARSERLIB=OFF \
+    -DSWIFT_BUILD_REMOTE_MIRROR=OFF \
+    -DSWIFT_ENABLE_SOURCEKIT_TESTS=OFF \
+    -DSWIFT_INCLUDE_DOCS=OFF \
+    -DSWIFT_INCLUDE_TOOLS=OFF \
+    -DSWIFT_INCLUDE_TESTS=OFF \
+    -DSWIFT_HOST_VARIANT_ARCH=${SWIFT_TARGET_ARCH} \
+    -DSWIFT_SDKS=LINUX \
+    -DSWIFT_SDK_LINUX_ARCH_${SWIFT_TARGET_ARCH}_PATH=${STAGING_DIR}  \
+    -DSWIFT_SDK_LINUX_ARCH_${SWIFT_TARGET_ARCH}_LIBC_INCLUDE_DIRECTORY=${STAGING_DIR}/usr/include  \
+    -DSWIFT_PATH_TO_LIBDISPATCH_SOURCE=${LIBDISPATCH_SRCDIR} \
+    -DSWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY=ON \
+	-DZLIB_LIBRARY=$(STAGING_DIR)/usr/lib/libz.so \
+
+ifeq ($(SWIFT_TARGET_ARCH),armv7)
+SWIFT_CONF_OPTS	+= \
+	-DCMAKE_Swift_FLAGS_DEBUG="" \
+	-DCMAKE_Swift_FLAGS_RELEASE="" \
+	-DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else ifeq ($(SWIFT_TARGET_ARCH),armv6)
+SWIFT_CONF_OPTS	+= \
+	-DCMAKE_Swift_FLAGS_DEBUG="" \
+	-DCMAKE_Swift_FLAGS_RELEASE="" \
+	-DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else ifeq ($(SWIFT_TARGET_ARCH),armv5)
+SWIFT_CONF_OPTS	+= \
+	-DCMAKE_Swift_FLAGS_DEBUG="" \
+	-DCMAKE_Swift_FLAGS_RELEASE="" \
+	-DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else ifeq ($(SWIFT_TARGET_ARCH),riscv64)
+SWIFT_CONF_OPTS	+= \
+	-DCMAKE_Swift_FLAGS="-Xcc -mno-relax" \
+	-DCMAKE_Swift_FLAGS_DEBUG="" \
+	-DCMAKE_Swift_FLAGS_RELEASE="" \
+	-DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else ifeq ($(SWIFT_TARGET_ARCH),mipsel)
+SWIFT_CONF_OPTS	+= \
+	-DCMAKE_Swift_FLAGS_DEBUG="" \
+	-DCMAKE_Swift_FLAGS_RELEASE="" \
+	-DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else ifeq ($(SWIFT_TARGET_ARCH),mips64el)
+SWIFT_CONF_OPTS	+= \
+	-DCMAKE_Swift_FLAGS_DEBUG="" \
+	-DCMAKE_Swift_FLAGS_RELEASE="" \
+	-DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else ifeq ($(SWIFT_TARGET_ARCH),powerpc)
+SWIFT_CONF_OPTS	+= \
+	-DCMAKE_Swift_FLAGS_DEBUG="" \
+	-DCMAKE_Swift_FLAGS_RELEASE="" \
+	-DCMAKE_Swift_FLAGS_RELWITHDEBINFO="" \
+
+else
+endif
+
+define SWIFT_CONFIGURE_CMDS
+	# 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)
+
+	@if [ "$(SWIFT_TARGET_ARCH)" = "armv5" ]; then\
+		echo '      "-march=armv5te",' >> $(SWIFTPM_DESTINATION_FILE);\
+    fi
+
+	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", "$(SWIFT_NATIVE_PATH)",' >> $(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 '      "-Xclang-linker", "-latomic",' >> $(SWIFTPM_DESTINATION_FILE);\
+
+	@if [ "$(SWIFT_TARGET_ARCH)" = "powerpc" ]; then\
+		echo '      "-Xcc", "-mcpu=7400",' >> $(SWIFTPM_DESTINATION_FILE);\
+    fi
+
+	@if [ "$(SWIFT_TARGET_ARCH)" = "armv5" ]; then\
+		echo '      "-Xcc", "-march=armv5te",' >> $(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
-- 
2.30.2

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [Buildroot] [PATCH 1/1] package/swift: add Swift runtime libraries
  2022-03-28  6:00 [Buildroot] [PATCH 1/1] package/swift: add Swift runtime libraries Alsey Coleman Miller
@ 2022-03-28 20:35 ` Arnout Vandecappelle
  2022-03-29 18:54   ` Alsey Miller
  2022-03-29 23:18   ` Alsey Miller
  0 siblings, 2 replies; 4+ messages in thread
From: Arnout Vandecappelle @ 2022-03-28 20:35 UTC (permalink / raw)
  To: Alsey Coleman Miller, buildroot; +Cc: Thomas Petazzoni

  Hi Alsey,

  Thank you for your contribution! I have a number of review comments below. 
Please take them into account and send a new patch series. For the time being, 
I've marked the patch as Changes Requested in patchwork.

  Firt of all, the patch should be split up in separate patches: one patch per 
package you add. Make sure all of them are posted together and in the correct 
order. Each patch should have as subject "package/...: new package".

  I have a few more comments below, but it's hard to properly review such a big 
patch so I will probably have missed some things.

On 28/03/2022 08:00, Alsey Coleman Miller wrote:
> Signed-off-by: Alsey Coleman Miller <alseycmiller@gmail.com>
> ---
>   package/Config.in                             |  11 +


  Please add yourself to the DEVELOPERS file [1] for this package. This way, 
you'll get an e-mail if the package fails in the autobuilders, or when a new 
version is released if the package is registered on release-monitoring.org.

[snip]
> 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

  I get that you only want swift-related packages to appear in the menus if 
swift itself is selected. It would be even better, then, to sort all of them 
under the swift main entry. Perhaps even prefix all of them with swift-, like is 
done for python, perl and lua packages.

> +
> +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.

  Please make sure indentation is done correctly, as reported by the 
utils/check-package script. In this case, the line length is way too long.

> +
> +	  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

  Missin comment header, as reported by check-package (I'm not going to repeat 
all the other check-package errors).

> +FOUNDATION_VERSION = $(SWIFT_VERSION)
> +FOUNDATION_SOURCE = swift-$(SWIFT_VERSION)-RELEASE.tar.gz
> +FOUNDATION_SITE = https://github.com/apple/swift-corelibs-foundation/archive/refs/tags

  This doesn't look right - shouldn't you be using the github helper?

> +FOUNDATION_LICENSE = Apache-2.0
> +FOUNDATION_LICENSE_FILES = LICENSE
> +FOUNDATION_INSTALL_STAGING = YES
> +FOUNDATION_INSTALL_TARGET = YES

  _INSTALL_TARGET = YES is not needed, it's done automatically.

> +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="" \

  Please consistently indent with one tab.

> +	-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)

  Since Config.in selects libcurl, this is always true.

> +	FOUNDATION_DEPENDENCIES += libcurl

  No indentation within make conditions.

> +	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

  This stuff is done automatically by the infra.

> +
> +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) \
> +	)

  I haven't looked at the details, but not using the cmake infrastructure is not 
a good idea.


> +endef
> +
> +define FOUNDATION_BUILD_CMDS
> +	# Compile
> +	(cd $(FOUNDATION_BUILDDIR) && ninja)

  If the problem is that it only supports the ninja build system: please use [2] 
and explain in the cover letter of your series that it depends on that.

> +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

  When there are toolchain dependencies, there should also be a comment that 
tells the user why the package can't be selected. Look at other packages for 
examples.

  Since it's not clear here, you should probably explain in the commit message 
why these dependencies are needed.

> +	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

  Downloading a patch from your own gist isn't exactly great for allowing 
reviews :-). Please instead include the patch directly in Buildroot. Since 
upstream is managed in git, please make this a git-formatted patch (generated 
with git format-patch -N) [1]. Make sure it has a summary and description just 
like any other commit, and also include your Signed-off-by. The latter is needed 
to ascertain that the patch may be distributed under the upstream project's 
license (which may be different from Buildroot's).

[snip]
> 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.

  If I understand correctly, this package serves no purpose other than proving 
that it's possibleto biuld a swift application in Buildroot. Nobody is ever 
going to select it. Instead, it would be better to move it to the runtime test 
infrastructure (and of course actually runtime test it, which proves that the 
generated binaries actually work).

[snip]
> 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
> +	( \

  These parenthesis are actually not needed. They are still used in a lot of 
places in Buildroot, but that's legacy stuff.

> +	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/

  Please don't keep commented-out lines.

> +	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))

[snip]
> +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"

  I guess swift is built on top of LLVM. Is it possible to use package/llvm, or 
is it a patched version?

> +
> +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

[snip]
> diff --git a/package/swift/swift.mk b/package/swift/swift.mk
> new file mode 100644
> index 0000000000..da10aae8fd
> --- /dev/null
> +++ b/package/swift/swift.mk
> @@ -0,0 +1,232 @@
> +### 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

  This should have simply a SWIFT_ prefix, not SWIFTPM.

[snip]
> +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)

  We generally prefer to have a template file (called swift-toolchain.json.in) 
in the package directory, and use sed to replace @XXXX@ entries. See e.g. how 
it's done for cmake's toolchainfile.

> +	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)
> +
> +	@if [ "$(SWIFT_TARGET_ARCH)" = "armv5" ]; then\
> +		echo '      "-march=armv5te",' >> $(SWIFTPM_DESTINATION_FILE);\
> +    fi
> +
> +	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", "$(SWIFT_NATIVE_PATH)",' >> $(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 '      "-Xclang-linker", "-latomic",' >> $(SWIFTPM_DESTINATION_FILE);\
> +
> +	@if [ "$(SWIFT_TARGET_ARCH)" = "powerpc" ]; then\
> +		echo '      "-Xcc", "-mcpu=7400",' >> $(SWIFTPM_DESTINATION_FILE);\
> +    fi
> +
> +	@if [ "$(SWIFT_TARGET_ARCH)" = "armv5" ]; then\
> +		echo '      "-Xcc", "-march=armv5te",' >> $(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

  Please make sure there's a newline at the end of the file.

  Regards,
  Arnout

[1] https://buildroot.org/downloads/manual/manual.html#DEVELOPERS
[2] https://patchwork.ozlabs.org/project/buildroot/list/?series=282194
[3] https://buildroot.org/manual.html#_format_and_licensing_of_the_package_patches
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Buildroot] [PATCH 1/1] package/swift: add Swift runtime libraries
  2022-03-28 20:35 ` Arnout Vandecappelle
@ 2022-03-29 18:54   ` Alsey Miller
  2022-03-29 23:18   ` Alsey Miller
  1 sibling, 0 replies; 4+ messages in thread
From: Alsey Miller @ 2022-03-29 18:54 UTC (permalink / raw)
  To: Arnout Vandecappelle; +Cc: Thomas Petazzoni, buildroot

I have submitted new patches for only libdispatch and minimal changes to cmake to support building Apple’s (and Clang based) projects.

> On Mar 28, 2022, at 1:35 PM, Arnout Vandecappelle <arnout@mind.be> wrote:
> 
> Hi Alsey,
> 
> Thank you for your contribution! I have a number of review comments below. Please take them into account and send a new patch series. For the time being, I've marked the patch as Changes Requested in patchwork.
> 
> Firt of all, the patch should be split up in separate patches: one patch per package you add. Make sure all of them are posted together and in the correct order. Each patch should have as subject "package/...: new package".
> 
> I have a few more comments below, but it's hard to properly review such a big patch so I will probably have missed some things.
> 
> On 28/03/2022 08:00, Alsey Coleman Miller wrote:
>> Signed-off-by: Alsey Coleman Miller <alseycmiller@gmail.com>
>> ---
>>  package/Config.in                             |  11 +
> 
> 
> Please add yourself to the DEVELOPERS file [1] for this package. This way, you'll get an e-mail if the package fails in the autobuilders, or when a new version is released if the package is registered on release-monitoring.org.
> 
> [snip]
>> 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
> 
> I get that you only want swift-related packages to appear in the menus if swift itself is selected. It would be even better, then, to sort all of them under the swift main entry. Perhaps even prefix all of them with swift-, like is done for python, perl and lua packages.
> 
>> +
>> +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.
> 
> Please make sure indentation is done correctly, as reported by the utils/check-package script. In this case, the line length is way too long.
> 
>> +
>> +	  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
> 
> Missin comment header, as reported by check-package (I'm not going to repeat all the other check-package errors).
> 
>> +FOUNDATION_VERSION = $(SWIFT_VERSION)
>> +FOUNDATION_SOURCE = swift-$(SWIFT_VERSION)-RELEASE.tar.gz
>> +FOUNDATION_SITE = https://github.com/apple/swift-corelibs-foundation/archive/refs/tags
> 
> This doesn't look right - shouldn't you be using the github helper?
> 
>> +FOUNDATION_LICENSE = Apache-2.0
>> +FOUNDATION_LICENSE_FILES = LICENSE
>> +FOUNDATION_INSTALL_STAGING = YES
>> +FOUNDATION_INSTALL_TARGET = YES
> 
> _INSTALL_TARGET = YES is not needed, it's done automatically.
> 
>> +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="" \
> 
> Please consistently indent with one tab.
> 
>> +	-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)
> 
> Since Config.in selects libcurl, this is always true.
> 
>> +	FOUNDATION_DEPENDENCIES += libcurl
> 
> No indentation within make conditions.
> 
>> +	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
> 
> This stuff is done automatically by the infra.
> 
>> +
>> +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) \
>> +	)
> 
> I haven't looked at the details, but not using the cmake infrastructure is not a good idea.
> 
> 
>> +endef
>> +
>> +define FOUNDATION_BUILD_CMDS
>> +	# Compile
>> +	(cd $(FOUNDATION_BUILDDIR) && ninja)
> 
> If the problem is that it only supports the ninja build system: please use [2] and explain in the cover letter of your series that it depends on that.
> 
>> +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
> 
> When there are toolchain dependencies, there should also be a comment that tells the user why the package can't be selected. Look at other packages for examples.
> 
> Since it's not clear here, you should probably explain in the commit message why these dependencies are needed.
> 
>> +	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
> 
> Downloading a patch from your own gist isn't exactly great for allowing reviews :-). Please instead include the patch directly in Buildroot. Since upstream is managed in git, please make this a git-formatted patch (generated with git format-patch -N) [1]. Make sure it has a summary and description just like any other commit, and also include your Signed-off-by. The latter is needed to ascertain that the patch may be distributed under the upstream project's license (which may be different from Buildroot's).
> 
> [snip]
>> 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.
> 
> If I understand correctly, this package serves no purpose other than proving that it's possibleto biuld a swift application in Buildroot. Nobody is ever going to select it. Instead, it would be better to move it to the runtime test infrastructure (and of course actually runtime test it, which proves that the generated binaries actually work).
> 
> [snip]
>> 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
>> +	( \
> 
> These parenthesis are actually not needed. They are still used in a lot of places in Buildroot, but that's legacy stuff.
> 
>> +	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/
> 
> Please don't keep commented-out lines.
> 
>> +	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))
> 
> [snip]
>> +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"
> 
> I guess swift is built on top of LLVM. Is it possible to use package/llvm, or is it a patched version?
> 
>> +
>> +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
> 
> [snip]
>> diff --git a/package/swift/swift.mk b/package/swift/swift.mk
>> new file mode 100644
>> index 0000000000..da10aae8fd
>> --- /dev/null
>> +++ b/package/swift/swift.mk
>> @@ -0,0 +1,232 @@
>> +### 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
> 
> This should have simply a SWIFT_ prefix, not SWIFTPM.
> 
> [snip]
>> +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)
> 
> We generally prefer to have a template file (called swift-toolchain.json.in) in the package directory, and use sed to replace @XXXX@ entries. See e.g. how it's done for cmake's toolchainfile.
> 
>> +	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)
>> +
>> +	@if [ "$(SWIFT_TARGET_ARCH)" = "armv5" ]; then\
>> +		echo '      "-march=armv5te",' >> $(SWIFTPM_DESTINATION_FILE);\
>> +    fi
>> +
>> +	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", "$(SWIFT_NATIVE_PATH)",' >> $(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 '      "-Xclang-linker", "-latomic",' >> $(SWIFTPM_DESTINATION_FILE);\
>> +
>> +	@if [ "$(SWIFT_TARGET_ARCH)" = "powerpc" ]; then\
>> +		echo '      "-Xcc", "-mcpu=7400",' >> $(SWIFTPM_DESTINATION_FILE);\
>> +    fi
>> +
>> +	@if [ "$(SWIFT_TARGET_ARCH)" = "armv5" ]; then\
>> +		echo '      "-Xcc", "-march=armv5te",' >> $(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
> 
> Please make sure there's a newline at the end of the file.
> 
> Regards,
> Arnout
> 
> [1] https://buildroot.org/downloads/manual/manual.html#DEVELOPERS
> [2] https://patchwork.ozlabs.org/project/buildroot/list/?series=282194
> [3] https://buildroot.org/manual.html#_format_and_licensing_of_the_package_patches

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Buildroot] [PATCH 1/1] package/swift: add Swift runtime libraries
  2022-03-28 20:35 ` Arnout Vandecappelle
  2022-03-29 18:54   ` Alsey Miller
@ 2022-03-29 23:18   ` Alsey Miller
  1 sibling, 0 replies; 4+ messages in thread
From: Alsey Miller @ 2022-03-29 23:18 UTC (permalink / raw)
  To: Arnout Vandecappelle; +Cc: Thomas Petazzoni, buildroot

I’ve submitted a new patch that deals only with libdispatch. Once that is merged I will submit smaller patches for each individual package.

> On Mar 28, 2022, at 1:35 PM, Arnout Vandecappelle <arnout@mind.be> wrote:
> 
> Hi Alsey,
> 
> Thank you for your contribution! I have a number of review comments below. Please take them into account and send a new patch series. For the time being, I've marked the patch as Changes Requested in patchwork.
> 
> Firt of all, the patch should be split up in separate patches: one patch per package you add. Make sure all of them are posted together and in the correct order. Each patch should have as subject "package/...: new package".
> 
> I have a few more comments below, but it's hard to properly review such a big patch so I will probably have missed some things.
> 
> On 28/03/2022 08:00, Alsey Coleman Miller wrote:
>> Signed-off-by: Alsey Coleman Miller <alseycmiller@gmail.com>
>> ---
>>  package/Config.in                             |  11 +
> 
> 
> Please add yourself to the DEVELOPERS file [1] for this package. This way, you'll get an e-mail if the package fails in the autobuilders, or when a new version is released if the package is registered on release-monitoring.org.
> 
> [snip]
>> 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
> 
> I get that you only want swift-related packages to appear in the menus if swift itself is selected. It would be even better, then, to sort all of them under the swift main entry. Perhaps even prefix all of them with swift-, like is done for python, perl and lua packages.
> 
>> +
>> +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.
> 
> Please make sure indentation is done correctly, as reported by the utils/check-package script. In this case, the line length is way too long.
> 
>> +
>> +	  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
> 
> Missin comment header, as reported by check-package (I'm not going to repeat all the other check-package errors).
> 
>> +FOUNDATION_VERSION = $(SWIFT_VERSION)
>> +FOUNDATION_SOURCE = swift-$(SWIFT_VERSION)-RELEASE.tar.gz
>> +FOUNDATION_SITE = https://github.com/apple/swift-corelibs-foundation/archive/refs/tags
> 
> This doesn't look right - shouldn't you be using the github helper?
> 
>> +FOUNDATION_LICENSE = Apache-2.0
>> +FOUNDATION_LICENSE_FILES = LICENSE
>> +FOUNDATION_INSTALL_STAGING = YES
>> +FOUNDATION_INSTALL_TARGET = YES
> 
> _INSTALL_TARGET = YES is not needed, it's done automatically.
> 
>> +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="" \
> 
> Please consistently indent with one tab.
> 
>> +	-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)
> 
> Since Config.in selects libcurl, this is always true.
> 
>> +	FOUNDATION_DEPENDENCIES += libcurl
> 
> No indentation within make conditions.
> 
>> +	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
> 
> This stuff is done automatically by the infra.
> 
>> +
>> +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) \
>> +	)
> 
> I haven't looked at the details, but not using the cmake infrastructure is not a good idea.
> 
> 
>> +endef
>> +
>> +define FOUNDATION_BUILD_CMDS
>> +	# Compile
>> +	(cd $(FOUNDATION_BUILDDIR) && ninja)
> 
> If the problem is that it only supports the ninja build system: please use [2] and explain in the cover letter of your series that it depends on that.
> 
>> +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
> 
> When there are toolchain dependencies, there should also be a comment that tells the user why the package can't be selected. Look at other packages for examples.
> 
> Since it's not clear here, you should probably explain in the commit message why these dependencies are needed.
> 
>> +	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
> 
> Downloading a patch from your own gist isn't exactly great for allowing reviews :-). Please instead include the patch directly in Buildroot. Since upstream is managed in git, please make this a git-formatted patch (generated with git format-patch -N) [1]. Make sure it has a summary and description just like any other commit, and also include your Signed-off-by. The latter is needed to ascertain that the patch may be distributed under the upstream project's license (which may be different from Buildroot's).
> 
> [snip]
>> 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.
> 
> If I understand correctly, this package serves no purpose other than proving that it's possibleto biuld a swift application in Buildroot. Nobody is ever going to select it. Instead, it would be better to move it to the runtime test infrastructure (and of course actually runtime test it, which proves that the generated binaries actually work).
> 
> [snip]
>> 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
>> +	( \
> 
> These parenthesis are actually not needed. They are still used in a lot of places in Buildroot, but that's legacy stuff.
> 
>> +	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/
> 
> Please don't keep commented-out lines.
> 
>> +	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))
> 
> [snip]
>> +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"
> 
> I guess swift is built on top of LLVM. Is it possible to use package/llvm, or is it a patched version?
> 
>> +
>> +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
> 
> [snip]
>> diff --git a/package/swift/swift.mk b/package/swift/swift.mk
>> new file mode 100644
>> index 0000000000..da10aae8fd
>> --- /dev/null
>> +++ b/package/swift/swift.mk
>> @@ -0,0 +1,232 @@
>> +### 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
> 
> This should have simply a SWIFT_ prefix, not SWIFTPM.
> 
> [snip]
>> +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)
> 
> We generally prefer to have a template file (called swift-toolchain.json.in) in the package directory, and use sed to replace @XXXX@ entries. See e.g. how it's done for cmake's toolchainfile.
> 
>> +	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)
>> +
>> +	@if [ "$(SWIFT_TARGET_ARCH)" = "armv5" ]; then\
>> +		echo '      "-march=armv5te",' >> $(SWIFTPM_DESTINATION_FILE);\
>> +    fi
>> +
>> +	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", "$(SWIFT_NATIVE_PATH)",' >> $(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 '      "-Xclang-linker", "-latomic",' >> $(SWIFTPM_DESTINATION_FILE);\
>> +
>> +	@if [ "$(SWIFT_TARGET_ARCH)" = "powerpc" ]; then\
>> +		echo '      "-Xcc", "-mcpu=7400",' >> $(SWIFTPM_DESTINATION_FILE);\
>> +    fi
>> +
>> +	@if [ "$(SWIFT_TARGET_ARCH)" = "armv5" ]; then\
>> +		echo '      "-Xcc", "-march=armv5te",' >> $(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
> 
> Please make sure there's a newline at the end of the file.
> 
> Regards,
> Arnout
> 
> [1] https://buildroot.org/downloads/manual/manual.html#DEVELOPERS
> [2] https://patchwork.ozlabs.org/project/buildroot/list/?series=282194
> [3] https://buildroot.org/manual.html#_format_and_licensing_of_the_package_patches

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-03-29 23:18 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-28  6:00 [Buildroot] [PATCH 1/1] package/swift: add Swift runtime libraries Alsey Coleman Miller
2022-03-28 20:35 ` Arnout Vandecappelle
2022-03-29 18:54   ` Alsey Miller
2022-03-29 23:18   ` Alsey Miller

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.