【问题标题】:Can I use environment variables or tilde in module.modulemap?我可以在 module.modulemap 中使用环境变量或波浪号吗?
【发布时间】:2017-09-29 04:45:37
【问题描述】:

我的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"
           ^

【问题讨论】:

  • 不要使用波浪号,它是一个 shell 扩展字符,而是尝试使用环境变量 ${HOME}。虽然我不确定在编译时是否会应用环境变量扩展。
  • @ScottThompson 我试过了,但没用
  • Ben,你在你的 modulemap 文件中尝试过 header "CompanyInternalSDK.h" 吗?
  • @MaxPotapov 是的,结果相同。

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


【解决方案1】:

不,modulemap 语法不扩展波浪号或环境变量。它最终只希望stat 你给它的路径,如果那里没有文件,它会抱怨。

  • Here's 在模块映射文件的词法分析期间启动头文件查找。
  • 它最终将路径传递给 SourceManager 的 FileManager 以生成 File 对象,作为框架的 Headers/ 公共头文件夹中的头的 here
  • getFile 最终会调用 getStatValue,后者会进行缓存查找。
  • FileSystemStatCache::get 最终在 LLVM 的文件系统抽象中脱颖而出,它在其中调用 sys::fs::status,据记录其行为类似于 POSIX stat
  • POSIX stat 可按原样使用路径,没有波浪号或环境变量扩展——它们的普遍可用性是由于 shell 帮助您,而不是大多数时间在系统级别自动发生的事情。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多