Могу ли я использовать переменные окружения или тильду в 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, который задокументирован, чтобы действовать как POSIX stat,
  • POSIX stat работает с путями "как есть", без тильды или расширения переменных среды - их общая доступность обусловлена ​​тем, что вам помогает оболочка, а не тем, что происходит автоматически большую часть времени на системном уровне.

Однако стандартно использовать относительные пути в картах модулей. Лексер уважает это, и все документы карты модулей демонстрируют это. В общем случае, когда файл карты вашего модуля размещен вместе с вашей библиотекой и установлен рядом с ней, этого должно быть достаточно для правильного определения путей.

Другие вопросы по тегам