我可以在module.modulemap中使用环境变量或波形符吗?

时间:2017-05-01 18:51:35

标签: swift module environment-variables tilde-expansion module-map

我的module.modulemap文件如下所示:

module CompanyInternalSDK {
    header "~/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
    export *
}

然而,我收到此错误:

/Users/username/Path/To/Project/CompanyInternalSDK/module.modulemap:2:12: error: header '~/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h' not found
    header "~/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
           ^

当我使用没有波浪号的绝对路径时,它编译得很好,但由于这将像这样分发给所有开发人员,我想使用波浪号。 有没有办法让这项工作正常?

我还尝试在header字符串中使用环境变量,但这也不起作用:

module CompanyInternalSDK {
    header "${HOME}/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
    export *
}
/Users/username/Path/To/Project/CompanyInternalSDK/module.modulemap:2:12: error: header '${HOME}/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h' not found
    header "${HOME}/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
           ^

1 个答案:

答案 0 :(得分:3)

不,模块映射语法不会扩展波形符或环境变量。它最终只是期望stat你给它的路径,如果那里没有文件,它就会抱怨。

  • Here's在模块映射文件的lexing期间启动头文件查找。
  • 它最终将路径传递给SourceManager的FileManager以生成File对象,作为here,用于框架的Headers/公共头文件夹中的标头。
  • getFile最终会调用getStatValue来执行缓存查找。
  • FileSystemStatCache::get最终会在LLVM的文件系统抽象中出现问题,它调用sys::fs::status,其记录为POSIX stat
  • POSIX stat按原样使用路径,没有波形变量或环境变量扩展 - 这些的常见可用性是由于shell帮助你,而不是在系统级别大部分时间自动发生的事情

但是,在模块映射中使用相对路径是标准的。词法分析器尊重这一点,所有模块地图文档都证明了这一点。在您的模块映射文件与库共存并与其一起安装的常见情况下,这应该足以正确解析路径。