Swift 包管理器抛出 nonWhitelistedFlags 错误
Swift Package Manager throws nonWhitelistedFlags error
问题出现在需要使用 pkgConfig 且 pkgConfig 包含标志定义的系统模块中。
ImageMagick(自制)
我创建了两个包:CMagicWand,输入 system-module
module.modulemap
module CMagickWand [system] {
header "/usr/local/Cellar/imagemagick/7.0.5-0/include/ImageMagick-7/MagickWand/MagickWand.h"
link "MagickWand"
export *
}
Package.swift
import PackageDescription
let package = Package(
name: "CMagickWand",
pkgConfig: "MagickWand"
)
然后我尝试从包 MagicWand 类型库中使用它
Package.swift
import PackageDescription
let package = Package(
name: "MagickWand",
dependencies: [
.Package(url: "../CMagickWand", majorVersion: 1)
]
)
pkgConfig MagickWand.pc
prefix=/usr/local/Cellar/imagemagick/7.0.5-0
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/ImageMagick-7
includearchdir=/usr/local/Cellar/imagemagick/7.0.5-0/include/ImageMagick-7
libname=MagickWand-7.Q16HDRI
Name: MagickWand
Description: MagickWand - C API for ImageMagick (ABI Q16HDRI)
URL: https://www.imagemagick.org
Version: 7.0.5
Requires: MagickCore
*Cflags: -I${includearchdir} -I${includedir} -DMAGICKCORE_HDRI_ENABLE=1 -DMAGICKCORE_QUANTUM_DEPTH=16*
Libs: -L${libdir} -l${libname}
Libs.private: -L${libdir} -l${libname} -L/usr/local/opt/freetype/lib -lfreetype -L/usr/local/Cellar/xz/5.2.3/lib -llzma -lbz2 -lz -lltdl -lm -lm
使用此设置,我为第二个包执行 swift 构建,输出如下
Cloning /bla-bla-bla/Libraries/CMagickWand
HEAD is now at 30ed4b4 Initial commit
Resolved version: 1.0.0
error: nonWhitelistedFlags("Non whitelisted flags found: [\"-DMAGICKCORE_HDRI_ENABLE=1\", \"-DMAGICKCORE_QUANTUM_DEPTH=16\", \"-DMAGICKCORE_HDRI_ENABLE=1\", \"-DMAGICKCORE_QUANTUM_DEPTH=16\"] in pc file MagickWand")
我试图从相应的 .pc 文件中删除有问题的 CFlags,但这没有帮助,即使我想出了如何删除它们(我总是可以创建自己的 .pc 文件)我找不到它可持续的。这些标志在那里是有原因的。
我的目标系统 (Ubuntu) 上的 mysqlclient 也有同样的问题,这个问题在 OS X 上无法重现,但对我没有帮助:
error: nonWhitelistedFlags("Non whitelisted flags found: [\"-fabi-version=2\", \"-fno-omit-frame-pointer\"] in pc file mysqlclient")
错误来自 func 白名单 (https://github.com/apple/swift-package-manager/blob/master/Sources/PackageLoading/Module%2BPkgConfig.swift),我看不出有任何方法可以在运行时增强列表。我不相信我是唯一一个受此限制困扰的人,但我已经几天找不到解决方法了。
我联系了这段代码的作者,回复如下:
The problem here is that we don't allow all flags from a pkg config
file because SwiftPM can't reason about them. We have build settings
proposal coming up soon which will solve these issues. For now, you can
manually pass the flags using swift build -Xcc -Xswiftc
-Xld
因此,目前解决它的唯一正确方法是替换 .pc 文件中的标志,在构建导入这些包的项目时明确指定它们,并祈祷这些标志永远不会干扰如果您有多个依赖项。
我为 .pc 文件(是的,文件,里面有依赖项)创建了副本,删除了标志并从 /usr/local/lib/pkgconfig 创建了新链接,因为我没有希望此更改有任何副作用。在 OS X 上与 ImageMagick 完美配合,稍后将在 Ubuntu.
上尝试
谢谢你,Ankit!
我用以下参数解决了这个问题:
swift build -Xcc -I/usr/local/include/ImageMagick-7/MagickWand/ -Xcc -I/usr/local/include/ImageMagick-7/ -Xcc -DMAGICKCORE_HDRI_ENABLE=0 -Xcc -DMAGICKCORE_QUANTUM_DEPTH=16 -Xlinker -L/usr/local/lib
我认为你必须调整路径。
module.modulemap:
module CMagickWand [system] {
header "shim.h"
header "/usr/local/include/ImageMagick-7/MagickWand/MagickWand.h"
link "MagickWand-7.Q16HDRI"
export *
}
link 具有来自 pkgConfig MagickWand.pc libname
.
的值
Package.swift:
import PackageDescription
let package = Package(
name: "CMagickWand"
)
shim.h(不知道是否需要这个文件):
#include <stdio.h>
问题出现在需要使用 pkgConfig 且 pkgConfig 包含标志定义的系统模块中。
ImageMagick(自制)
我创建了两个包:CMagicWand,输入 system-module
module.modulemap
module CMagickWand [system] {
header "/usr/local/Cellar/imagemagick/7.0.5-0/include/ImageMagick-7/MagickWand/MagickWand.h"
link "MagickWand"
export *
}
Package.swift
import PackageDescription
let package = Package(
name: "CMagickWand",
pkgConfig: "MagickWand"
)
然后我尝试从包 MagicWand 类型库中使用它
Package.swift
import PackageDescription
let package = Package(
name: "MagickWand",
dependencies: [
.Package(url: "../CMagickWand", majorVersion: 1)
]
)
pkgConfig MagickWand.pc
prefix=/usr/local/Cellar/imagemagick/7.0.5-0
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/ImageMagick-7
includearchdir=/usr/local/Cellar/imagemagick/7.0.5-0/include/ImageMagick-7
libname=MagickWand-7.Q16HDRI
Name: MagickWand
Description: MagickWand - C API for ImageMagick (ABI Q16HDRI)
URL: https://www.imagemagick.org
Version: 7.0.5
Requires: MagickCore
*Cflags: -I${includearchdir} -I${includedir} -DMAGICKCORE_HDRI_ENABLE=1 -DMAGICKCORE_QUANTUM_DEPTH=16*
Libs: -L${libdir} -l${libname}
Libs.private: -L${libdir} -l${libname} -L/usr/local/opt/freetype/lib -lfreetype -L/usr/local/Cellar/xz/5.2.3/lib -llzma -lbz2 -lz -lltdl -lm -lm
使用此设置,我为第二个包执行 swift 构建,输出如下
Cloning /bla-bla-bla/Libraries/CMagickWand
HEAD is now at 30ed4b4 Initial commit
Resolved version: 1.0.0
error: nonWhitelistedFlags("Non whitelisted flags found: [\"-DMAGICKCORE_HDRI_ENABLE=1\", \"-DMAGICKCORE_QUANTUM_DEPTH=16\", \"-DMAGICKCORE_HDRI_ENABLE=1\", \"-DMAGICKCORE_QUANTUM_DEPTH=16\"] in pc file MagickWand")
我试图从相应的 .pc 文件中删除有问题的 CFlags,但这没有帮助,即使我想出了如何删除它们(我总是可以创建自己的 .pc 文件)我找不到它可持续的。这些标志在那里是有原因的。
我的目标系统 (Ubuntu) 上的 mysqlclient 也有同样的问题,这个问题在 OS X 上无法重现,但对我没有帮助:
error: nonWhitelistedFlags("Non whitelisted flags found: [\"-fabi-version=2\", \"-fno-omit-frame-pointer\"] in pc file mysqlclient")
错误来自 func 白名单 (https://github.com/apple/swift-package-manager/blob/master/Sources/PackageLoading/Module%2BPkgConfig.swift),我看不出有任何方法可以在运行时增强列表。我不相信我是唯一一个受此限制困扰的人,但我已经几天找不到解决方法了。
我联系了这段代码的作者,回复如下:
The problem here is that we don't allow all flags from a pkg config file because SwiftPM can't reason about them. We have build settings proposal coming up soon which will solve these issues. For now, you can manually pass the flags using swift build -Xcc -Xswiftc -Xld
因此,目前解决它的唯一正确方法是替换 .pc 文件中的标志,在构建导入这些包的项目时明确指定它们,并祈祷这些标志永远不会干扰如果您有多个依赖项。
我为 .pc 文件(是的,文件,里面有依赖项)创建了副本,删除了标志并从 /usr/local/lib/pkgconfig 创建了新链接,因为我没有希望此更改有任何副作用。在 OS X 上与 ImageMagick 完美配合,稍后将在 Ubuntu.
上尝试谢谢你,Ankit!
我用以下参数解决了这个问题:
swift build -Xcc -I/usr/local/include/ImageMagick-7/MagickWand/ -Xcc -I/usr/local/include/ImageMagick-7/ -Xcc -DMAGICKCORE_HDRI_ENABLE=0 -Xcc -DMAGICKCORE_QUANTUM_DEPTH=16 -Xlinker -L/usr/local/lib
我认为你必须调整路径。
module.modulemap:
module CMagickWand [system] {
header "shim.h"
header "/usr/local/include/ImageMagick-7/MagickWand/MagickWand.h"
link "MagickWand-7.Q16HDRI"
export *
}
link 具有来自 pkgConfig MagickWand.pc libname
.
Package.swift:
import PackageDescription
let package = Package(
name: "CMagickWand"
)
shim.h(不知道是否需要这个文件):
#include <stdio.h>