Я пытаюсь реализовать генерацию базы данных компиляции clang в аспекте bazel. Похоже, что поле каталога этого файла clang должно быть указано как абсолютный путь. Теперь, когда я пытаюсь сгенерировать этот файл с аспектом bazel, все соответствующие API-интерфейсы bazel возвращают относительный путь пути в рабочей области.
Под корнем рабочей области я подразумеваю ~/.cache/bazel/_bazel_<user>/<hash>/execroot/__main__
.
Я подумал о двух хаках, чтобы сделать эту работу:
- Используйте
ctx.actions.run_shell
вместоctx.actions.write
для создания файла, в котором оболочка может оценить корневой путь рабочей области из песочницыPWD
с помощью$(realpath ../../../../../execroot/__main__)
.
Я проверил, что это работает, но это, безусловно, нежелательный подход, поскольку bazel не гарантирует, как рабочий путь песочницы будет связан с корнем рабочей области, поэтому может легко выйти из версии bazel.
- Используйте скрипт для создания файла.
Это разбило бы генерацию файла на две части, так как вся информация о командах компиляции по-прежнему должна исходить из аспекта bazel, что затрудняет обслуживание.
Еще один способ, о котором я думал, но не вижу очевидного способа заставить его работать, - это каким-то образом передать переменную __workspace_dir__
из файла WORKSPACE.bazel
в контекст аспекта, чего я так и не нашел.
Итак, есть ли какой-нибудь элегантный способ получить эту информацию из контекста реализации аспекта?
run_shell
с определеннымexecution_requirements
или напишите правило репозитория. - person Rohan Singh   schedule 19.08.2020run_shell
- это в основном мой подход 1, у которого нет средств для чтения значения обратно в контекст bazel. Правило репозитория может вместо этого использовать__workspace_dir__
, переданное отWORKSPACE
, но не решает мою проблему. - person xiay   schedule 19.08.2020