我可以在 module.modulemap 中使用环境变量或代字号吗?

Can I use environment variables or tilde in module.modulemap?

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

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

  • Here's 在对模块映射文件进行词法分析期间,header 文件查找开始。
  • 它最终将路径传递给 SourceManager 的 FileManager 以生成 File object,作为框架 Headers/ header 中的 here public header 文件夹。
  • getFile ultimately ends up calling out to getStatValue,执行缓存查找。
  • FileSystemStatCache::get eventually grounds out in LLVM's filesystem abstraction, where it calls sys::fs::status,它被记录为像 POSIX stat
  • POSIX stat 与路径 as-is 一起工作,没有波浪号或环境变量扩展 - 这些的普遍可用性是由于 shell 帮助你,而不是大多数时候在系统级别自动发生的事情。

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