Swift 包管理器:将编译标志添加到单个文件 -fno-objc-arc

问题描述

概述

我正在将 C++/ObjC++ 库移植到 Swift 包管理器。该库针对常见的 Apple 平台(iOS、macOS)。目前,可以使用 xcodebuild 和静态库目标构建库。

问题

由于该库包含 C++ ObjC 桥接代码,因此它具有一个文件,使用标志 -fno-objc-arc 编译。所有其他文件都是用 ARC 编译的。是否可以传递一个标志,告诉 SPM 在没有 ARC 的情况下也编译该文件

截图

screenshot

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: "library_name",platforms: [
        .iOS(.v13)
    ],products: [
        .library(
            name: "library_name",targets: ["library_name"]),],dependencies: [
    ],targets: [
        .target(
            name: "library_name",dependencies: [],path: "./sources/",exclude: [

            ],sources:
                [
                    "sourcefile_noARC.mm","sourcefile2.mm","sourcefile3.cpp",publicHeadersPath: "SwiftPackage/headers/",cxxSettings: [
                .headerSearchPath("./")
            ]
        ),cxxLanguageStandard: .cxx14
)

“不安全标志”

我尝试使用 unsafe flags 功能将编译标志传递给整个库:

.target(
            name: "fs_helpers",cxxSettings: [
                .headerSearchPath("./"),.unsafeFlags(["-fno-objc-arc"]) // ADDING THE FLAG
            ]
        ),

然而,这将标志添加到整个库,而不仅仅是我想要的单个文件

解决方法

我认为目前不可能。然而,我们希望 this proposal 会被接受,你(和我)的问题会得到解决。有几个替代方案可能会有所帮助:

  1. 使用可可豆荚
  2. 使用子模块
  3. 使用预编译的二进制文件

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...