Swift Package Manager抛出nonWhitelistedFlags错误

时间:2017-02-22 00:21:06

标签: swift package whitelist swift-package-manager cflags

系统模块出现问题,必须使用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 build,输出跟随

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),我没有看到如何在运行时增强列表。我不相信我是唯一一个与这种限制斗争的人,但我已经找不到几天的解决方法了。

2 个答案:

答案 0 :(得分:1)

我用以下参数解决了这个问题:

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>

答案 1 :(得分:0)

我联系了此代码的作者,回复如下:

  

这里的问题是我们不允许来自pkg配置的所有标志   文件,因为SwiftPM无法推理它们。我们有构建设置   即将提出的提案将解决这些问题。现在,你可以   使用swift build -Xcc -Xswiftc手动传递标志    -Xld

因此,暂时解决它的唯一正确方法是从.pc文件中替换标志,在构建导入这些包的项目时明确指定它们并祈祷这些标志永远不会干扰你有几个依赖。

我为.pc文件创建了副本(是的,文件,里面有依赖项),删除了标记并从 / usr / local / lib / pkgconfig 创建了新的链接,因为我不希望这样改变有任何副作用。与OS X上的ImageMagick完美配合,稍后将在Ubuntu上尝试。

谢谢你,Ankit!