Swift 包中与平台相关的文件

Ric*_*hiy 8 c++ macos ios swift swift-package-manager

我正在开发一个支持 iOS 和 macOS 的跨平台 C++ 库。可以使用 Swift Package Manager 集成该库。在 C++ 中,很容易拥有一个头文件和多个不同的实现文件,这些文件将为每个平台进行编译。例如,标头有一个print()方法,每个目标以不同的方式实现它:

macOS: "print_macOS"
iOS: "print_iOS"
Windows: "print_Windows"
Run Code Online (Sandbox Code Playgroud)

是否有可能以某种方式使 Swift Package Manager 根据平台有条件地包含/排除目标中的特定文件?

我发现的最接近的功能是条件目标依赖项,但它涉及包含/排除特定库而不仅仅是文件。我需要有更细粒度的方法。

目前我正在使用编译时指令来解决此问题:

#include "Print.h"

std::string Print::PrintMethod()
{
#if TARGET_OS_IPHONE
    return "print_iOS";
#else
    return "print_macOS";
#endif
}
Run Code Online (Sandbox Code Playgroud)

那么,有没有什么方法可以用不同的文件实现相同的结果呢?请注意,除了这两个文件之外,两个平台(iOS 和 macOS)的目标完全相同。

参考Package.swift文件:

// swift-tools-version:5.4
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "ResultingTarget",
    platforms: [
        .iOS(.v13), .macOS(.v10_15)
    ],
    products: [
        .library(
            name: "ResultingTarget",
            targets: ["ResultingTarget"]),
    ],
    targets: [
        .target(
            name: "ResultingTarget",
            sources:
                [
                    // "File_for_iOS.mm", <----- Need to include only for iOS
                    "File_for_macOS.mm", <----- Need to include only for macOS
                    "Other_file.mm",
                ],
            publicHeadersPath: "Headers",
            cxxSettings: [
                .headerSearchPath("headers"),
            ]),
    ],
    cxxLanguageStandard: .cxx14
)
Run Code Online (Sandbox Code Playgroud)