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

Sup*_*tar 6 module environment-variables tilde-expansion swift module-map

我的module.modulemap文件看起来像这样:

module CompanyInternalSDK {
    header "~/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
    export *
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

/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"
           ^
Run Code Online (Sandbox Code Playgroud)

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


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

module CompanyInternalSDK {
    header "${HOME}/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
    export *
}
Run Code Online (Sandbox Code Playgroud)
/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"
           ^
Run Code Online (Sandbox Code Playgroud)

Jer*_*man 5

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

  • 这是在模块映射文件的词法分析期间开始头文件查找的地方。
  • 它最终将路径传递给 SourceManager 的 FileManager 以生成一个File对象,如此框架Headers/公共标头文件夹中的标头。
  • getFile最终调用 来getStatValue进行缓存查找。
  • 最终FileSystemStatCache::get以 LLVM 的文件系统抽象为基础,它调用sys::fs::status,其行为类似于 POSIX stat
  • POSIXstat按原样使用路径,没有波形符或环境变量扩展 - 这些的常见可用性是由于 shell 帮助您解决的,而不是大多数时候在系统级别自动发生的事情。

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