В реализации аспекта bazel есть ли способ получить абсолютный путь файловой системы к корню рабочей области?

Я пытаюсь реализовать генерацию базы данных компиляции clang в аспекте bazel. Похоже, что поле каталога этого файла clang должно быть указано как абсолютный путь. Теперь, когда я пытаюсь сгенерировать этот файл с аспектом bazel, все соответствующие API-интерфейсы bazel возвращают относительный путь пути в рабочей области.

Под корнем рабочей области я подразумеваю ~/.cache/bazel/_bazel_<user>/<hash>/execroot/__main__.

Я подумал о двух хаках, чтобы сделать эту работу:

  1. Используйте ctx.actions.run_shell вместо ctx.actions.write для создания файла, в котором оболочка может оценить корневой путь рабочей области из песочницы PWD с помощью $(realpath ../../../../../execroot/__main__).

Я проверил, что это работает, но это, безусловно, нежелательный подход, поскольку bazel не гарантирует, как рабочий путь песочницы будет связан с корнем рабочей области, поэтому может легко выйти из версии bazel.

  1. Используйте скрипт для создания файла.

Это разбило бы генерацию файла на две части, так как вся информация о командах компиляции по-прежнему должна исходить из аспекта bazel, что затрудняет обслуживание.

Еще один способ, о котором я думал, но не вижу очевидного способа заставить его работать, - это каким-то образом передать переменную __workspace_dir__ из файла WORKSPACE.bazel в контекст аспекта, чего я так и не нашел.

Итак, есть ли какой-нибудь элегантный способ получить эту информацию из контекста реализации аспекта?


person xiay    schedule 19.08.2020    source источник
comment
Проблемы, которые вы подняли, не относятся к конкретному аспекту, они применимы к любому правилу, для которого требуется путь к рабочей области. См. stackoverflow.com /questions/48545575/, который отвечает на вопрос. Подводя итог, используйте run_shell с определенным execution_requirements или напишите правило репозитория.   -  person Rohan Singh    schedule 19.08.2020
comment
Отвечает ли это на ваш вопрос? Как получить каталог WORKSPACE в правиле bazel   -  person Rohan Singh    schedule 19.08.2020
comment
@RohanSingh, не совсем так. подход run_shell - это в основном мой подход 1, у которого нет средств для чтения значения обратно в контекст bazel. Правило репозитория может вместо этого использовать __workspace_dir__, переданное от WORKSPACE, но не решает мою проблему.   -  person xiay    schedule 19.08.2020