Я начинаю использовать Bazel в качестве системы сборки проектов на C ++.
Однако я столкнулся со следующей проблемой:
Я нахожусь в сценарии, когда я автоматически создаю файл file.hpp file.cpp (грамотное программирование).
Чтобы воспроизвести мою проблему, можно просто использовать этот минимальный генератор:
-- file.sh --
#!/bin/sh
echo "int foo();" >> file.hpp
echo "#include \"myLib/file.hpp\"\n\nint foo() { return 2017; }" >> file.cpp
Репо моего проекта: (WORKSPACE - пустой файл)
├── myLib
│ ├── BUILD
│ └── file.sh
└── WORKSPACE
Файл BUILD - это
genrule(
name = "tangle_file",
srcs = ["file.sh"],
outs = ["file.cpp","file.hpp"],
cmd = "./$(location file.sh);cp file.cpp $(@D);cp file.hpp $(@D);"
)
cc_library(
name = "file",
srcs = ["file.cpp"],
hdrs = ["file.hpp"],
# deps = [":tangle_file"],
visibility = ["//bin:__pkg__"],
)
У меня две проблемы:
Вопрос (A), касающийся части genrule ():
Тот факт, что я должен использовать
cmd = "./$(location file.sh);cp file.cpp $(@D);cp file.hpp $(@D);"
довольно загадочный.
Моя первая попытка была:
cmd = "./$(location file.sh)"
Однако в этом случае я получаю следующую ошибку:
объявленный вывод myLib / file.cpp не был создан genrule. Вероятно, это связано с тем, что genrule на самом деле не создавал этот вывод, или потому, что вывод был каталогом, а genrule был запущен удаленно (обратите внимание, что только содержимое объявленных выходных файлов копируется из genrules, запускаемых удаленно)
Вопрос (B), касающийся части cc_library ()
Я не знаю, как сообщить Bazel, что цель : file зависит от цели : tangle_file.
Если я раскомментирую:
deps = [":tangle_file"],
Я получаю следующую ошибку:
в атрибуте deps правила cc_library // myLib: file: genrule правило '// myLib: tangle_file' здесь неуместно (ожидаемые cc_inc_library, cc_library, objc_library, экспериментальные_objc_library или cc_proto_library).