From 1821ac9950da92f074191b25a205a2c46dbd4567 Mon Sep 17 00:00:00 2001 From: Davide Date: Mon, 26 Jan 2026 16:57:03 +0100 Subject: [PATCH 01/13] Integrate SWON into SwiftPM/CMake - Specify project languages - Convert Partout into non-external project - Depend on SWON as subdirectory - Update FIXME refs --- .gitmodules | 3 ++ CMakeLists.txt | 31 +++++++++---------- Package.swift | 8 ++++- Sources/CMakeLists.txt | 4 +-- .../CompatString+Extensions.swift | 8 ++--- Sources/MiniFoundationCompat/Data.swift | 6 ++-- .../Error+Extensions.swift | 2 +- .../MiniFoundationCompat/FileManager.swift | 2 +- Sources/MiniFoundationCompat/JSONCoder.swift | 4 +-- Sources/MiniFoundationCompat/URL.swift | 4 +-- Sources/MiniFoundationNative/NativeURL.swift | 2 +- Sources/PartoutCore/IP/Address.swift | 3 +- Sources/PartoutCore/IP/Endpoint.swift | 1 - Sources/PartoutCore/IP/EndpointProtocol.swift | 1 - Sources/PartoutCore/IP/ExtendedEndpoint.swift | 1 - Sources/PartoutCore/IP/IPSettings.swift | 1 - Sources/PartoutCore/IP/Route.swift | 1 - Sources/PartoutCore/IP/SocketType.swift | 2 -- Sources/PartoutCore/IP/Subnet.swift | 1 - .../PartoutOpenVPN/CompressionAlgorithm.swift | 1 - vendors/swon | 1 + 21 files changed, 41 insertions(+), 46 deletions(-) create mode 160000 vendors/swon diff --git a/.gitmodules b/.gitmodules index dd7964987..1c696396c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "vendors/openssl"] path = vendors/openssl url = https://github.com/openssl/openssl +[submodule "vendors/swon"] + path = vendors/swon + url = https://github.com/keeshux/swon diff --git a/CMakeLists.txt b/CMakeLists.txt index e33564dbc..a1ad8a050 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.27) -project(Partout) +project(Partout LANGUAGES Swift C CXX) include(ExternalProject) include(FetchContent) @@ -27,11 +27,13 @@ message(STATUS "Option PP_BUILD_USE_MBEDTLS = ${PP_BUILD_USE_MBEDTLS}") message(STATUS "Option PP_BUILD_USE_WGGO = ${PP_BUILD_USE_WGGO}") message(STATUS "Option PP_BUILD_OUTPUT = ${PP_BUILD_OUTPUT}") -# Forward args to Partout sub-project -set(PARTOUT_CMAKE_ARGS - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DOUTPUT_DIR=${PP_BUILD_OUTPUT}/partout -) +# Include SWON macros +add_subdirectory("vendors/swon") + +# FIXME: Forward args to Partout subdirectory +# CMAKE_BUILD_TYPE (inherited from cmd line) +# CMAKE_Swift_COMPILER=${CMAKE_CURRENT_SOURCE_DIR}/scripts/swiftc-wrapper.sh +# CMAKE_TOOLCHAIN_FILE:FILEPATH=${CMAKE_TOOLCHAIN_FILE} if(DEFINED CMAKE_TOOLCHAIN_FILE) list(APPEND PARTOUT_CMAKE_ARGS -DCMAKE_Swift_COMPILER=${CMAKE_CURRENT_SOURCE_DIR}/scripts/swiftc-wrapper.sh @@ -45,18 +47,18 @@ if(PP_BUILD_USE_OPENSSL) include("vendors/openssl.cmake") ExternalProject_Get_Property(OpenSSLProject BINARY_DIR) list(APPEND VENDOR_DEPENDS OpenSSLProject) - list(APPEND PARTOUT_CMAKE_ARGS -DOPENSSL_DIR=${OPENSSL_DIR}) + # Exports OPENSSL_DIR elseif(PP_BUILD_USE_MBEDTLS) include("vendors/mbedtls.cmake") ExternalProject_Get_Property(MbedTLSProject BINARY_DIR) list(APPEND VENDOR_DEPENDS MbedTLSProject) - list(APPEND PARTOUT_CMAKE_ARGS -DMBEDTLS_DIR=${MBEDTLS_DIR}) + # Exports MBEDTLS_DIR endif() if(PP_BUILD_USE_WGGO) include("vendors/wg-go.cmake") ExternalProject_Get_Property(WireGuardGoProject BINARY_DIR) list(APPEND VENDOR_DEPENDS WireGuardGoProject) - list(APPEND PARTOUT_CMAKE_ARGS -DWGGO_DIR=${WGGO_DIR}) + # Exports WGGO_DIR endif() # Fetch wintun.dll on Windows @@ -67,12 +69,7 @@ endif() # Build Partout library (opt-in), after vendored dependencies if(PP_BUILD_LIBRARY) - ExternalProject_Add( - PartoutProject - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Sources - CMAKE_ARGS ${PARTOUT_CMAKE_ARGS} - INSTALL_COMMAND "" - BUILD_ALWAYS 1 - DEPENDS ${VENDOR_DEPENDS} - ) + add_subdirectory(Sources) + add_dependencies(partout_c ${VENDOR_DEPENDS}) + target_link_libraries(partout PRIVATE SWONInterface) endif() diff --git a/Package.swift b/Package.swift index 313fa16f7..2a6868e35 100644 --- a/Package.swift +++ b/Package.swift @@ -112,6 +112,11 @@ let package = Package( ] ) +// SWON macros (submodule) +package.dependencies.append( + .package(path: "vendors/swon") +) + // Swift-DocC for documentation, do not include by default if envDocs { package.dependencies.append( @@ -136,7 +141,8 @@ package.targets.append(contentsOf: [ dependencies: [ "MiniFoundation", "PartoutABI_C", - "PartoutCore_C" + "PartoutCore_C", + "swon" ], swiftSettings: useFoundationCompatibility.swiftSettings ), diff --git a/Sources/CMakeLists.txt b/Sources/CMakeLists.txt index 80e3fed5e..e84a2ca27 100644 --- a/Sources/CMakeLists.txt +++ b/Sources/CMakeLists.txt @@ -1,8 +1,6 @@ -cmake_minimum_required(VERSION 3.27) -project(PartoutProject LANGUAGES Swift C CXX) - # Package root is up one level, output dir from option set(ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/..) +set(OUTPUT_DIR ${PP_BUILD_OUTPUT}/partout) # Partout_C ############################################ diff --git a/Sources/MiniFoundationCompat/CompatString+Extensions.swift b/Sources/MiniFoundationCompat/CompatString+Extensions.swift index 02edbfc85..4b1d8f7d5 100644 --- a/Sources/MiniFoundationCompat/CompatString+Extensions.swift +++ b/Sources/MiniFoundationCompat/CompatString+Extensions.swift @@ -7,12 +7,12 @@ internal import _MiniFoundationCore_C extension String { // MARK: Initializers - // FIXME: #228, Only on file URLs + // FIXME: #303, Only on file URLs public init(contentsOf url: Compat.URL, encoding: Compat.StringEncoding) throws { try self.init(contentsOfFile: url.filePath(), encoding: encoding) } - // FIXME: #228, Only on file URLs + // FIXME: #303, Only on file URLs public init(contentsOf url: Compat.URL, usedEncoding: inout Compat.StringEncoding) throws { try self.init(contentsOfFile: url.filePath(), usedEncoding: &usedEncoding) } @@ -179,7 +179,7 @@ extension Substring { // MARK: - Formatting extension String { - // FIXME: #228, Test, look for memory leaks + // FIXME: #303, Test, look for memory leaks public init(format: String, _ args: Any...) { // Convert Swift Any -> CVarArg (only the types we support) let cArgs: [CVarArg] = args.map { arg in @@ -278,7 +278,7 @@ extension FileBuffer { } private extension Compat.StringEncoding { - // FIXME: #228, Test, probably inefficient + // FIXME: #303, Test, probably inefficient // Return `String?` — nil if decoding failed (invalid for that encoding) func decode(_ bytes: [UInt8]) -> String? { switch self { diff --git a/Sources/MiniFoundationCompat/Data.swift b/Sources/MiniFoundationCompat/Data.swift index 3049ca3e9..4028da2e0 100644 --- a/Sources/MiniFoundationCompat/Data.swift +++ b/Sources/MiniFoundationCompat/Data.swift @@ -4,7 +4,7 @@ internal import _MiniFoundationCore_C -// FIXME: #228, Implement with pp_zd maybe, use @inline, beware of performance +// FIXME: #303, Implement with pp_zd maybe, use @inline, beware of performance extension Compat { public struct Data: Hashable, Codable, Sendable { @@ -161,12 +161,12 @@ extension Compat.Data { extension Compat.Data { public init(bytesNoCopy: UnsafeMutablePointer, count: Int) { - // FIXME: #228, DO NOT COPY BYTES + // FIXME: #303, DO NOT COPY BYTES self.init(bytes: bytesNoCopy, count: count) } public init(bytesNoCopy: UnsafeMutablePointer, count: Int, customDeallocator: @escaping () -> Void) { - // FIXME: #228, DO NOT COPY BYTES + // FIXME: #303, DO NOT COPY BYTES self.init(bytes: bytesNoCopy, count: count) } } diff --git a/Sources/MiniFoundationCompat/Error+Extensions.swift b/Sources/MiniFoundationCompat/Error+Extensions.swift index d38e371e6..3f9ae82af 100644 --- a/Sources/MiniFoundationCompat/Error+Extensions.swift +++ b/Sources/MiniFoundationCompat/Error+Extensions.swift @@ -4,7 +4,7 @@ extension Error { public var localizedDescription: String { - // FIXME: #228, No clue, but error description _should_ fall back to a string representation + // FIXME: #303, No clue, but error description _should_ fall back to a string representation String(describing: self) } } diff --git a/Sources/MiniFoundationCompat/FileManager.swift b/Sources/MiniFoundationCompat/FileManager.swift index 4d11c677d..c7469072e 100644 --- a/Sources/MiniFoundationCompat/FileManager.swift +++ b/Sources/MiniFoundationCompat/FileManager.swift @@ -4,7 +4,7 @@ internal import _MiniFoundationCore_C -// FIXME: #228, Test file I/O, esp. on Windows +// FIXME: #303, Test file I/O, esp. on Windows extension Compat { public final class FileManager { diff --git a/Sources/MiniFoundationCompat/JSONCoder.swift b/Sources/MiniFoundationCompat/JSONCoder.swift index 606ce25f8..03b965829 100644 --- a/Sources/MiniFoundationCompat/JSONCoder.swift +++ b/Sources/MiniFoundationCompat/JSONCoder.swift @@ -11,7 +11,7 @@ extension Compat { public init() {} public func encode(_ value: T) throws -> Compat.Data where T: Encodable { - // FIXME: #228, JSONEncoder + // FIXME: #293, JSONEncoder throw MiniFoundationError.encoding } } @@ -24,7 +24,7 @@ extension Compat { } public func decode(_ type: T.Type, from data: Compat.Data) throws -> T where T: Decodable { - // FIXME: #228, JSONDecoder + // FIXME: #293, JSONDecoder throw MiniFoundationError.decoding } } diff --git a/Sources/MiniFoundationCompat/URL.swift b/Sources/MiniFoundationCompat/URL.swift index 7f0609f9c..bc19cecac 100644 --- a/Sources/MiniFoundationCompat/URL.swift +++ b/Sources/MiniFoundationCompat/URL.swift @@ -110,10 +110,10 @@ extension Compat.URL { // MARK: File URLs -// FIXME: #228, Optimistic, implement and test everything here, esp. on Windows +// FIXME: #303, Optimistic, implement and test everything here, esp. on Windows extension Compat.URL { - // FIXME: #228, Paths can be relative + // FIXME: #303, Paths can be relative public convenience init(fileURLWithPath path: String) { self.init(string: "file://\(path)")! } diff --git a/Sources/MiniFoundationNative/NativeURL.swift b/Sources/MiniFoundationNative/NativeURL.swift index f1961741a..cefb342cf 100644 --- a/Sources/MiniFoundationNative/NativeURL.swift +++ b/Sources/MiniFoundationNative/NativeURL.swift @@ -4,7 +4,7 @@ extension URL: MiniURLProtocol { public func filePath() -> String { - // FIXME: #228, Is .path(percentEncoded: false|true) the same? + // FIXME: #303, Is .path(percentEncoded: false|true) the same? assert(isFileURL) return path } diff --git a/Sources/PartoutCore/IP/Address.swift b/Sources/PartoutCore/IP/Address.swift index 4c2d2852b..d3971e59c 100644 --- a/Sources/PartoutCore/IP/Address.swift +++ b/Sources/PartoutCore/IP/Address.swift @@ -13,9 +13,8 @@ public enum Address: Hashable, Codable, Sendable { } extension Address: RawRepresentable { - @frozen - public enum Family: Sendable { + public enum Family: String, Sendable { case v4 case v6 diff --git a/Sources/PartoutCore/IP/Endpoint.swift b/Sources/PartoutCore/IP/Endpoint.swift index 6414c6f65..bc96f2a48 100644 --- a/Sources/PartoutCore/IP/Endpoint.swift +++ b/Sources/PartoutCore/IP/Endpoint.swift @@ -4,7 +4,6 @@ /// Represents an endpoint. public struct Endpoint: Hashable, Codable, Sendable { - /// The address. public let address: Address diff --git a/Sources/PartoutCore/IP/EndpointProtocol.swift b/Sources/PartoutCore/IP/EndpointProtocol.swift index 581c3977c..9e80f5e6a 100644 --- a/Sources/PartoutCore/IP/EndpointProtocol.swift +++ b/Sources/PartoutCore/IP/EndpointProtocol.swift @@ -4,7 +4,6 @@ /// Defines the communication protocol of an endpoint. public struct EndpointProtocol: Hashable, Sendable { - /// The socket type. public let socketType: IPSocketType diff --git a/Sources/PartoutCore/IP/ExtendedEndpoint.swift b/Sources/PartoutCore/IP/ExtendedEndpoint.swift index 9b7e55912..e30d49f78 100644 --- a/Sources/PartoutCore/IP/ExtendedEndpoint.swift +++ b/Sources/PartoutCore/IP/ExtendedEndpoint.swift @@ -6,7 +6,6 @@ internal import _PartoutCore_C /// Aggregates an address and an ``EndpointProtocol``. public struct ExtendedEndpoint: Hashable, Codable, Sendable { - // XXX: Simplistic match nonisolated(unsafe) private static let rx: Regex = { diff --git a/Sources/PartoutCore/IP/IPSettings.swift b/Sources/PartoutCore/IP/IPSettings.swift index 7629cecdd..b3eca1359 100644 --- a/Sources/PartoutCore/IP/IPSettings.swift +++ b/Sources/PartoutCore/IP/IPSettings.swift @@ -4,7 +4,6 @@ /// IP settings and routes. public struct IPSettings: Hashable, Codable, Sendable { - /// The subnets. public private(set) var subnets: [Subnet] diff --git a/Sources/PartoutCore/IP/Route.swift b/Sources/PartoutCore/IP/Route.swift index fb7f0ab7d..ff6901a95 100644 --- a/Sources/PartoutCore/IP/Route.swift +++ b/Sources/PartoutCore/IP/Route.swift @@ -4,7 +4,6 @@ /// Represents a route in the routing table. public struct Route: Hashable, Codable, Sendable { - /// The destination subnet or `nil` if default. public let destination: Subnet? diff --git a/Sources/PartoutCore/IP/SocketType.swift b/Sources/PartoutCore/IP/SocketType.swift index 7ab650f29..bf601bc83 100644 --- a/Sources/PartoutCore/IP/SocketType.swift +++ b/Sources/PartoutCore/IP/SocketType.swift @@ -5,7 +5,6 @@ /// A socket type between UDP and TCP. @frozen public enum SocketType: String, Sendable { - /// UDP socket type. case udp = "UDP" @@ -16,7 +15,6 @@ public enum SocketType: String, Sendable { /// A socket type with optional info about the IP endpoint. @frozen public enum IPSocketType: String, Sendable { - /// UDP socket type. case udp = "UDP" diff --git a/Sources/PartoutCore/IP/Subnet.swift b/Sources/PartoutCore/IP/Subnet.swift index 3ef7e2988..474269b2b 100644 --- a/Sources/PartoutCore/IP/Subnet.swift +++ b/Sources/PartoutCore/IP/Subnet.swift @@ -6,7 +6,6 @@ internal import _PartoutCore_C /// An IPv4/v6 subnet. public struct Subnet: Hashable, Codable, Sendable { - /// The subnet address. public let address: Address diff --git a/Sources/PartoutOpenVPN/CompressionAlgorithm.swift b/Sources/PartoutOpenVPN/CompressionAlgorithm.swift index 79138acb1..5965d0d9f 100644 --- a/Sources/PartoutOpenVPN/CompressionAlgorithm.swift +++ b/Sources/PartoutOpenVPN/CompressionAlgorithm.swift @@ -3,7 +3,6 @@ // SPDX-License-Identifier: GPL-3.0 extension OpenVPN { - /// Defines the type of compression algorithm. public enum CompressionAlgorithm: Int, Sendable { case disabled diff --git a/vendors/swon b/vendors/swon new file mode 160000 index 000000000..cd92bde4e --- /dev/null +++ b/vendors/swon @@ -0,0 +1 @@ +Subproject commit cd92bde4e6b686454ea6ab2ed072f2270b4202b5 From 29db1e849aa40258281ddb3396226b79ba8bbee7 Mon Sep 17 00:00:00 2001 From: Davide Date: Sat, 14 Feb 2026 11:25:28 +0100 Subject: [PATCH 02/13] Manually fetch SWON submodule for workflow --- .github/workflows/test.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 90f4fa945..02e686cf6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,6 +17,10 @@ jobs: - uses: partout-io/action-prepare-xcode-build@master with: access-token: ${{ secrets.GITHUB_TOKEN }} + - name: Fetch SWON submodule + run: | + git submodule init vendors/swon + git submodule update --depth 1 vendors/swon - name: Ensure previews are off run: | expected="let forPreviews = false" From 72c624c3a33252dc4f2a3b5aaf88c8e0b8b5ca06 Mon Sep 17 00:00:00 2001 From: Davide Date: Sat, 14 Feb 2026 11:27:57 +0100 Subject: [PATCH 03/13] Bump version --- Sources/PartoutABI_C/partout.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/PartoutABI_C/partout.c b/Sources/PartoutABI_C/partout.c index 90d48482c..6882788ad 100644 --- a/Sources/PartoutABI_C/partout.c +++ b/Sources/PartoutABI_C/partout.c @@ -5,4 +5,4 @@ */ const char *const PARTOUT_IDENTIFIER = "io.partout"; -const char *const PARTOUT_VERSION = "0.104.0"; +const char *const PARTOUT_VERSION = "0.104.1"; From 199ad1fc2c498441513d1deaf15f0a4f5f7ffe3e Mon Sep 17 00:00:00 2001 From: Davide Date: Sat, 14 Feb 2026 11:28:13 +0100 Subject: [PATCH 04/13] Revert "Bump version" This reverts commit 72c624c3a33252dc4f2a3b5aaf88c8e0b8b5ca06. --- Sources/PartoutABI_C/partout.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/PartoutABI_C/partout.c b/Sources/PartoutABI_C/partout.c index 6882788ad..90d48482c 100644 --- a/Sources/PartoutABI_C/partout.c +++ b/Sources/PartoutABI_C/partout.c @@ -5,4 +5,4 @@ */ const char *const PARTOUT_IDENTIFIER = "io.partout"; -const char *const PARTOUT_VERSION = "0.104.1"; +const char *const PARTOUT_VERSION = "0.104.0"; From ed083cc37ce7245a78e83405bce1fff7afe497ca Mon Sep 17 00:00:00 2001 From: Davide Date: Sat, 14 Feb 2026 11:34:42 +0100 Subject: [PATCH 05/13] Set Android Swift compiler in toolchain --- CMakeLists.txt | 11 ----------- toolchains/android.toolchain.cmake | 1 + 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a1ad8a050..e41c942ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,17 +30,6 @@ message(STATUS "Option PP_BUILD_OUTPUT = ${PP_BUILD_OUTPUT}") # Include SWON macros add_subdirectory("vendors/swon") -# FIXME: Forward args to Partout subdirectory -# CMAKE_BUILD_TYPE (inherited from cmd line) -# CMAKE_Swift_COMPILER=${CMAKE_CURRENT_SOURCE_DIR}/scripts/swiftc-wrapper.sh -# CMAKE_TOOLCHAIN_FILE:FILEPATH=${CMAKE_TOOLCHAIN_FILE} -if(DEFINED CMAKE_TOOLCHAIN_FILE) - list(APPEND PARTOUT_CMAKE_ARGS - -DCMAKE_Swift_COMPILER=${CMAKE_CURRENT_SOURCE_DIR}/scripts/swiftc-wrapper.sh - -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${CMAKE_TOOLCHAIN_FILE} - ) -endif() - # All vendor-inherited args set(VENDOR_DEPENDS) if(PP_BUILD_USE_OPENSSL) diff --git a/toolchains/android.toolchain.cmake b/toolchains/android.toolchain.cmake index b6e7bdb0d..a729c30b2 100644 --- a/toolchains/android.toolchain.cmake +++ b/toolchains/android.toolchain.cmake @@ -5,6 +5,7 @@ set(CMAKE_SYSTEM_PROCESSOR $ENV{ANDROID_NDK_ARCH}) set(CMAKE_SYSTEM_VERSION $ENV{ANDROID_NDK_API}) set(CMAKE_C_COMPILER_TARGET $ENV{ANDROID_NDK_ARCH}-unknown-linux-android$ENV{ANDROID_NDK_API}) set(CMAKE_CXX_COMPILER_TARGET $ENV{ANDROID_NDK_ARCH}-unknown-linux-android$ENV{ANDROID_NDK_API}) +set(CMAKE_Swift_COMPILER ${CMAKE_CURRENT_SOURCE_DIR}/scripts/swiftc-wrapper.sh) set(CMAKE_Swift_COMPILER_TARGET $ENV{ANDROID_NDK_ARCH}-unknown-linux-android$ENV{ANDROID_NDK_API}) set(CMAKE_C_FLAGS "-fPIC") set(CMAKE_Swift_FLAGS "-target $ENV{ANDROID_NDK_ARCH}-unknown-linux-android$ENV{ANDROID_NDK_API} -tools-directory $ENV{ANDROID_NDK_TOOLCHAIN} -sdk $ENV{ANDROID_NDK_SYSROOT} -resource-dir $ENV{SWIFT_RESOURCE_DIR} -enable-library-evolution -disallow-use-new-driver -lc++_shared -llog -lm") From ceb2eab979165f55373d4b32949149617f88fb32 Mon Sep 17 00:00:00 2001 From: Davide Date: Sat, 14 Feb 2026 18:20:57 +0100 Subject: [PATCH 06/13] Import SWON as ExternalProject to build on host machine --- CMakeLists.txt | 7 ++++--- vendors/swon.cmake | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 vendors/swon.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index e41c942ba..4f0449f11 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,9 +27,6 @@ message(STATUS "Option PP_BUILD_USE_MBEDTLS = ${PP_BUILD_USE_MBEDTLS}") message(STATUS "Option PP_BUILD_USE_WGGO = ${PP_BUILD_USE_WGGO}") message(STATUS "Option PP_BUILD_OUTPUT = ${PP_BUILD_OUTPUT}") -# Include SWON macros -add_subdirectory("vendors/swon") - # All vendor-inherited args set(VENDOR_DEPENDS) if(PP_BUILD_USE_OPENSSL) @@ -50,6 +47,10 @@ if(PP_BUILD_USE_WGGO) # Exports WGGO_DIR endif() +# Include SWON macros +include("vendors/swon.cmake") +list(APPEND VENDOR_DEPENDS SWONProject) + # Fetch wintun.dll on Windows if(WIN32) set(WINTUN_VERSION "0.14.1") diff --git a/vendors/swon.cmake b/vendors/swon.cmake new file mode 100644 index 000000000..4d91ee92f --- /dev/null +++ b/vendors/swon.cmake @@ -0,0 +1,16 @@ +ExternalProject_Add( + SWONProject + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vendors/swon + INSTALL_COMMAND "" +) + +add_library(SWONInterface INTERFACE) +add_dependencies(SWONInterface SWONProject) +target_include_directories(SWONInterface INTERFACE + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/vendors/swon/Sources/SWON_C/include +) +target_compile_options(SWONInterface INTERFACE + -load-plugin-executable "${CMAKE_CURRENT_BINARY_DIR}/SWONMacros#SWONMacros" +) +target_link_libraries(SWONInterface INTERFACE SWON) From e399034ebd464fbe35a94aaf09e6de508eed64a6 Mon Sep 17 00:00:00 2001 From: Davide Date: Sun, 15 Feb 2026 11:05:30 +0100 Subject: [PATCH 07/13] Make SWON binary output predictable --- vendors/swon.cmake | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vendors/swon.cmake b/vendors/swon.cmake index 4d91ee92f..f73e8bfdd 100644 --- a/vendors/swon.cmake +++ b/vendors/swon.cmake @@ -1,16 +1,17 @@ ExternalProject_Add( SWONProject SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vendors/swon + BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/vendors/swon INSTALL_COMMAND "" ) add_library(SWONInterface INTERFACE) add_dependencies(SWONInterface SWONProject) target_include_directories(SWONInterface INTERFACE - ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_BINARY_DIR}/vendors/swon ${CMAKE_CURRENT_SOURCE_DIR}/vendors/swon/Sources/SWON_C/include ) target_compile_options(SWONInterface INTERFACE - -load-plugin-executable "${CMAKE_CURRENT_BINARY_DIR}/SWONMacros#SWONMacros" + -load-plugin-executable "${CMAKE_CURRENT_BINARY_DIR}/vendors/swon/SWONMacros#SWONMacros" ) target_link_libraries(SWONInterface INTERFACE SWON) From 8658501d7d0008a0f4eaf72bd42467339455ecca Mon Sep 17 00:00:00 2001 From: Davide Date: Sun, 15 Feb 2026 10:24:23 +0100 Subject: [PATCH 08/13] Fix swiftc wrapper path for recursive builds --- toolchains/android.toolchain.cmake | 2 +- {scripts => toolchains}/swiftc-wrapper.sh | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename {scripts => toolchains}/swiftc-wrapper.sh (100%) diff --git a/toolchains/android.toolchain.cmake b/toolchains/android.toolchain.cmake index a729c30b2..6c49db61a 100644 --- a/toolchains/android.toolchain.cmake +++ b/toolchains/android.toolchain.cmake @@ -5,7 +5,7 @@ set(CMAKE_SYSTEM_PROCESSOR $ENV{ANDROID_NDK_ARCH}) set(CMAKE_SYSTEM_VERSION $ENV{ANDROID_NDK_API}) set(CMAKE_C_COMPILER_TARGET $ENV{ANDROID_NDK_ARCH}-unknown-linux-android$ENV{ANDROID_NDK_API}) set(CMAKE_CXX_COMPILER_TARGET $ENV{ANDROID_NDK_ARCH}-unknown-linux-android$ENV{ANDROID_NDK_API}) -set(CMAKE_Swift_COMPILER ${CMAKE_CURRENT_SOURCE_DIR}/scripts/swiftc-wrapper.sh) +set(CMAKE_Swift_COMPILER ${CMAKE_CURRENT_LIST_DIR}/swiftc-wrapper.sh) set(CMAKE_Swift_COMPILER_TARGET $ENV{ANDROID_NDK_ARCH}-unknown-linux-android$ENV{ANDROID_NDK_API}) set(CMAKE_C_FLAGS "-fPIC") set(CMAKE_Swift_FLAGS "-target $ENV{ANDROID_NDK_ARCH}-unknown-linux-android$ENV{ANDROID_NDK_API} -tools-directory $ENV{ANDROID_NDK_TOOLCHAIN} -sdk $ENV{ANDROID_NDK_SYSROOT} -resource-dir $ENV{SWIFT_RESOURCE_DIR} -enable-library-evolution -disallow-use-new-driver -lc++_shared -llog -lm") diff --git a/scripts/swiftc-wrapper.sh b/toolchains/swiftc-wrapper.sh similarity index 100% rename from scripts/swiftc-wrapper.sh rename to toolchains/swiftc-wrapper.sh From 07ddabcbefa1e380541ffa058347c84cebcfa472 Mon Sep 17 00:00:00 2001 From: Davide Date: Mon, 16 Feb 2026 19:22:28 +0100 Subject: [PATCH 09/13] Drop newlines in CMake --- vendors/mbedtls.cmake | 3 +-- vendors/openssl.cmake | 3 +-- vendors/swon.cmake | 3 +-- vendors/wg-go.cmake | 3 +-- vendors/wintun.cmake | 3 +-- 5 files changed, 5 insertions(+), 10 deletions(-) diff --git a/vendors/mbedtls.cmake b/vendors/mbedtls.cmake index ee5f2aad6..31af3090a 100644 --- a/vendors/mbedtls.cmake +++ b/vendors/mbedtls.cmake @@ -1,7 +1,6 @@ set(MBEDTLS_DIR ${PP_BUILD_OUTPUT}/mbedtls) -ExternalProject_Add( - MbedTLSProject +ExternalProject_Add(MbedTLSProject SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vendors/mbedtls CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${MBEDTLS_DIR} ) diff --git a/vendors/openssl.cmake b/vendors/openssl.cmake index 036ab4988..a81ae0be0 100644 --- a/vendors/openssl.cmake +++ b/vendors/openssl.cmake @@ -26,8 +26,7 @@ set(CFG_ARGS ${OPENSSL_SYMBOLS} ${OPENSSL_CFG_FLAGS} ) -ExternalProject_Add( - OpenSSLProject +ExternalProject_Add(OpenSSLProject SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vendors/openssl CONFIGURE_COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/vendors/openssl/Configure ${CFG_ARGS} BUILD_COMMAND ${OPENSSL_BUILD_CMD} diff --git a/vendors/swon.cmake b/vendors/swon.cmake index f73e8bfdd..9256971a7 100644 --- a/vendors/swon.cmake +++ b/vendors/swon.cmake @@ -1,5 +1,4 @@ -ExternalProject_Add( - SWONProject +ExternalProject_Add(SWONProject SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vendors/swon BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/vendors/swon INSTALL_COMMAND "" diff --git a/vendors/wg-go.cmake b/vendors/wg-go.cmake index 414376e79..23477e2f9 100644 --- a/vendors/wg-go.cmake +++ b/vendors/wg-go.cmake @@ -18,8 +18,7 @@ else() ANDROID=${WGGO_ANDROID}) endif() -ExternalProject_Add( - WireGuardGoProject +ExternalProject_Add(WireGuardGoProject SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vendors/wg-go CONFIGURE_COMMAND "" BUILD_COMMAND ${WGGO_CMD} diff --git a/vendors/wintun.cmake b/vendors/wintun.cmake index da9dd742c..bf0d5b808 100644 --- a/vendors/wintun.cmake +++ b/vendors/wintun.cmake @@ -1,7 +1,6 @@ set(WINTUN_DIR ${PP_BUILD_OUTPUT}/wintun) set(WINTUN_URL "https://www.wintun.net/builds/wintun-${WINTUN_VERSION}.zip") -FetchContent_Declare( - wintun +FetchContent_Declare(wintun URL ${WINTUN_URL} SOURCE_DIR ${CMAKE_BINARY_DIR}/wintun-src ) From 14f9eb4ad5c0ed7465af453d793ccbdeac66088d Mon Sep 17 00:00:00 2001 From: Davide Date: Mon, 16 Feb 2026 20:41:56 +0100 Subject: [PATCH 10/13] Fix SWON project to build macros plugin on host --- CMakeLists.txt | 3 +-- vendors/swon | 2 +- vendors/swon.cmake | 16 ---------------- 3 files changed, 2 insertions(+), 19 deletions(-) delete mode 100644 vendors/swon.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f0449f11..9c3f2e389 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,8 +48,7 @@ if(PP_BUILD_USE_WGGO) endif() # Include SWON macros -include("vendors/swon.cmake") -list(APPEND VENDOR_DEPENDS SWONProject) +add_subdirectory("vendors/swon") # Fetch wintun.dll on Windows if(WIN32) diff --git a/vendors/swon b/vendors/swon index cd92bde4e..afd197f25 160000 --- a/vendors/swon +++ b/vendors/swon @@ -1 +1 @@ -Subproject commit cd92bde4e6b686454ea6ab2ed072f2270b4202b5 +Subproject commit afd197f25e4799f120dcf4919b359bb4b6ee54b7 diff --git a/vendors/swon.cmake b/vendors/swon.cmake deleted file mode 100644 index 9256971a7..000000000 --- a/vendors/swon.cmake +++ /dev/null @@ -1,16 +0,0 @@ -ExternalProject_Add(SWONProject - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vendors/swon - BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/vendors/swon - INSTALL_COMMAND "" -) - -add_library(SWONInterface INTERFACE) -add_dependencies(SWONInterface SWONProject) -target_include_directories(SWONInterface INTERFACE - ${CMAKE_CURRENT_BINARY_DIR}/vendors/swon - ${CMAKE_CURRENT_SOURCE_DIR}/vendors/swon/Sources/SWON_C/include -) -target_compile_options(SWONInterface INTERFACE - -load-plugin-executable "${CMAKE_CURRENT_BINARY_DIR}/vendors/swon/SWONMacros#SWONMacros" -) -target_link_libraries(SWONInterface INTERFACE SWON) From ab0589f6d1aadb1d4df57ca76cf15db687b5c18d Mon Sep 17 00:00:00 2001 From: Davide Date: Tue, 17 Feb 2026 18:26:35 +0100 Subject: [PATCH 11/13] Depend on SWON with PUBLIC for transitivity --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c3f2e389..705c78e98 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,5 +60,5 @@ endif() if(PP_BUILD_LIBRARY) add_subdirectory(Sources) add_dependencies(partout_c ${VENDOR_DEPENDS}) - target_link_libraries(partout PRIVATE SWONInterface) + target_link_libraries(partout PUBLIC SWONInterface) endif() From 8376e5e78a2f8d435db9cd5a7fcd7c7a90c58640 Mon Sep 17 00:00:00 2001 From: Davide Date: Tue, 17 Feb 2026 14:31:45 +0100 Subject: [PATCH 12/13] Convert vendors to interfaces --- CMakeLists.txt | 19 ++++++++----------- Sources/CMakeLists.txt | 14 +------------- vendors/mbedtls.cmake | 6 ++++++ vendors/openssl.cmake | 6 ++++++ vendors/wg-go.cmake | 6 ++++++ 5 files changed, 27 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 705c78e98..ab0d45c90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,23 +28,13 @@ message(STATUS "Option PP_BUILD_USE_WGGO = ${PP_BUILD_USE_WGGO}") message(STATUS "Option PP_BUILD_OUTPUT = ${PP_BUILD_OUTPUT}") # All vendor-inherited args -set(VENDOR_DEPENDS) if(PP_BUILD_USE_OPENSSL) include("vendors/openssl.cmake") - ExternalProject_Get_Property(OpenSSLProject BINARY_DIR) - list(APPEND VENDOR_DEPENDS OpenSSLProject) - # Exports OPENSSL_DIR elseif(PP_BUILD_USE_MBEDTLS) include("vendors/mbedtls.cmake") - ExternalProject_Get_Property(MbedTLSProject BINARY_DIR) - list(APPEND VENDOR_DEPENDS MbedTLSProject) - # Exports MBEDTLS_DIR endif() if(PP_BUILD_USE_WGGO) include("vendors/wg-go.cmake") - ExternalProject_Get_Property(WireGuardGoProject BINARY_DIR) - list(APPEND VENDOR_DEPENDS WireGuardGoProject) - # Exports WGGO_DIR endif() # Include SWON macros @@ -59,6 +49,13 @@ endif() # Build Partout library (opt-in), after vendored dependencies if(PP_BUILD_LIBRARY) add_subdirectory(Sources) - add_dependencies(partout_c ${VENDOR_DEPENDS}) + if(PP_BUILD_USE_OPENSSL) + target_link_libraries(partout_c PUBLIC OpenSSLInterface) + elseif(PP_BUILD_USE_MBEDTLS) + target_link_libraries(partout_c PUBLIC MbedTLSInterface) + endif() + if(PP_BUILD_USE_WGGO) + target_link_libraries(partout_c PUBLIC WireGuardGoInterface) + endif() target_link_libraries(partout PUBLIC SWONInterface) endif() diff --git a/Sources/CMakeLists.txt b/Sources/CMakeLists.txt index e84a2ca27..205604b76 100644 --- a/Sources/CMakeLists.txt +++ b/Sources/CMakeLists.txt @@ -136,23 +136,11 @@ set_target_properties(partout_c PROPERTIES ) # Link to vendor-specific dependencies -if(DEFINED OPENSSL_DIR) - target_include_directories(partout_c PRIVATE ${OPENSSL_DIR}/include) - target_link_directories(partout_c PRIVATE ${OPENSSL_DIR}/lib) - target_link_libraries(partout_c PRIVATE ssl crypto) -elseif(DEFINED MBEDTLS_DIR) - target_include_directories(partout_c PRIVATE ${MBEDTLS_DIR}/include) - target_link_directories(partout_c PRIVATE ${MBEDTLS_DIR}/lib) - target_link_libraries(partout_c PRIVATE mbedcrypto mbedtls mbedx509) -endif() -if(DEFINED WGGO_DIR) +if(PP_BUILD_USE_WGGO) target_include_directories(partout_c PRIVATE - ${WGGO_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/PartoutWireGuard/Shared_C/include ) # wg-go is loaded with dl_open() - # target_link_directories(partout_c PRIVATE ${WGGO_DIR}/lib) - # target_link_libraries(partout_c PRIVATE wg-go) endif() # Copy ABI header diff --git a/vendors/mbedtls.cmake b/vendors/mbedtls.cmake index 31af3090a..5d8a38630 100644 --- a/vendors/mbedtls.cmake +++ b/vendors/mbedtls.cmake @@ -4,3 +4,9 @@ ExternalProject_Add(MbedTLSProject SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vendors/mbedtls CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${MBEDTLS_DIR} ) + +add_library(MbedTLSInterface INTERFACE) +add_dependencies(MbedTLSInterface OpenSSLProject) +target_include_directories(MbedTLSInterface INTERFACE ${MBEDTLS_DIR}/include) +target_link_directories(MbedTLSInterface INTERFACE ${MBEDTLS_DIR}/lib) +target_link_libraries(MbedTLSInterface INTERFACE mbedtls mbedx509 mbedcrypto) diff --git a/vendors/openssl.cmake b/vendors/openssl.cmake index a81ae0be0..e66ef3992 100644 --- a/vendors/openssl.cmake +++ b/vendors/openssl.cmake @@ -45,3 +45,9 @@ if(APPLE) "${OPENSSL_DIR}/lib/libssl.3.dylib" ) endif() + +add_library(OpenSSLInterface INTERFACE) +add_dependencies(OpenSSLInterface OpenSSLProject) +target_include_directories(OpenSSLInterface INTERFACE ${OPENSSL_DIR}/include) +target_link_directories(OpenSSLInterface INTERFACE ${OPENSSL_DIR}/lib) +target_link_libraries(OpenSSLInterface INTERFACE ssl crypto) diff --git a/vendors/wg-go.cmake b/vendors/wg-go.cmake index 23477e2f9..c87426f4f 100644 --- a/vendors/wg-go.cmake +++ b/vendors/wg-go.cmake @@ -40,3 +40,9 @@ elseif(WIN32) COMMAND dlltool -d wg-go.def -l "${WGGO_DIR}/lib/libwg-go.lib" ) endif() + +add_library(WireGuardGoInterface INTERFACE) +add_dependencies(WireGuardGoInterface OpenSSLProject) +target_include_directories(WireGuardGoInterface INTERFACE ${WGGO_DIR}/include) +target_link_directories(WireGuardGoInterface INTERFACE ${WGGO_DIR}/lib) +target_link_libraries(WireGuardGoInterface INTERFACE wg-go) From 5e6d78de9ac1deb6baaddbf1a79bdca7469334dd Mon Sep 17 00:00:00 2001 From: Davide Date: Tue, 17 Feb 2026 18:31:41 +0100 Subject: [PATCH 13/13] Drop stale WireGuard include --- Sources/CMakeLists.txt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Sources/CMakeLists.txt b/Sources/CMakeLists.txt index 205604b76..6508d7f4e 100644 --- a/Sources/CMakeLists.txt +++ b/Sources/CMakeLists.txt @@ -135,14 +135,6 @@ set_target_properties(partout_c PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIR} ) -# Link to vendor-specific dependencies -if(PP_BUILD_USE_WGGO) - target_include_directories(partout_c PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/PartoutWireGuard/Shared_C/include - ) - # wg-go is loaded with dl_open() -endif() - # Copy ABI header set(ABI_INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/PartoutABI_C/include) add_custom_command(