Могу ли я использовать переменные окружения или тильду в 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"
^
1 ответ
Нет, синтаксис modulemap не раскрывает тильды или переменные среды. В конечном итоге он просто ожидает stat
путь, который вы указали, и если там нет файлов, он будет цепляться.
- Здесь начинается поиск файла заголовка во время лексизации файла карты модуля.
- В конечном итоге он передает путь к FileManager SourceManager для создания
File
объект, как здесь для заголовка в рамкахHeaders/
папка общего заголовка. getFile
в конечном итоге заканчивается призыв кgetStatValue
, который делает поиск в кэше.-
FileSystemStatCache::get
в конечном итоге обосновывается в абстракции файловой системы LLVM, где он вызываетsys::fs::status
, который задокументирован, чтобы действовать как POSIXstat
, - POSIX
stat
работает с путями "как есть", без тильды или расширения переменных среды - их общая доступность обусловлена тем, что вам помогает оболочка, а не тем, что происходит автоматически большую часть времени на системном уровне.
Однако стандартно использовать относительные пути в картах модулей. Лексер уважает это, и все документы карты модулей демонстрируют это. В общем случае, когда файл карты вашего модуля размещен вместе с вашей библиотекой и установлен рядом с ней, этого должно быть достаточно для правильного определения путей.