Bazel: ссылка на файл внутри выходного каталога в genrule - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь сослаться на вывод правила, вложенного в выходной каталог другого правила в genrule.

Например, я использую rules_foreign_ cc для создания boost:

boost_build(
    name = "boost",
    lib_source = "@boost//:all",
    linkopts = [
        "-lpthread",
    ],
    shared_libraries = [
        "libboost_chrono.so.1.72.0",
        "libboost_program_options.so.1.72.0",
        "libboost_filesystem.so.1.72.0",
        "libboost_system.so.1.72.0",
        "libboost_thread.so.1.72.0",
        "libboost_timer.so.1.72.0",
    ],
    user_options = [
        "cxxstd=17",
        "--with-chrono",
        "--with-filesystem",
        "--with-program_options",
        "--with-system",
        "--with-thread",
        "--with-timer",
        "-j4",
    ],
)

И когда я его создаю, я вижу выходные данные:

bazel build //:boost
INFO: Invocation ID: 36440de3-15f2-4ca0-8802-0a95f75ed926
INFO: Analyzed target //:boost (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //:boost up-to-date:
  bazel-bin/boost/include
  bazel-bin/boost/lib/libboost_chrono.so.1.72.0
  bazel-bin/boost/lib/libboost_program_options.so.1.72.0
  bazel-bin/boost/lib/libboost_filesystem.so.1.72.0
  bazel-bin/boost/lib/libboost_system.so.1.72.0
  bazel-bin/boost/lib/libboost_thread.so.1.72.0
  bazel-bin/boost/lib/libboost_timer.so.1.72.0
  bazel-bin/copy_boost/boost
  bazel-bin/boost/logs/BuildBoost_script.sh
  bazel-bin/boost/logs/BuildBoost.log
  bazel-bin/boost/logs/wrapper_script.sh
INFO: Elapsed time: 0.758s, Critical Path: 0.00s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action

Boost работает правильно, я могу ссылаться на него в cc_library целях и двоичные файлы работают нормально.

Теперь я хотел бы сослаться на один из выходных данных в genrule. Файл, на который я хочу сослаться, вложен в каталог boost/lib/. Я ожидал бы что-то вроде: $(location :boost/lib/libboost_program_options.so.1.72.0), но это не работает.

Как правильно ссылаться на выходные данные в каталоге?

1 Ответ

0 голосов
/ 26 апреля 2020

Это то, что я сделал, надеюсь, это поможет. Внутри genrule создайте переменную, содержащую выходной массив вашего правила форсирования, используйте $(locations) вместо $(location). Затем l oop через массив и найдите путь, который вы хотите использовать позже.

BOOST_OUTPUTS=( $(locations boost) )
LIBBOOST_CHRONO_SO=

for i in "$${{BOOST_OUTPUTS[@]}}"
do
    if [[ "$$i" == *"libboost_chrono.so.1.72.0"* ]]; then
        LIBBOOST_CHRONO_SO="$$i"
    fi
done

# Do something with LIBBOOST_CHRONO_SO

Просто обратите внимание, что $$ и {{ и }} предназначены для экранирования специальных символов.

...