bazel rules_foreign_cc - //:<target> зависит от @local_config_cc//:cc-compiler-k8 в репозитории @local_config_cc, который не удалось получить

Я абсолютный новичок в bazel. Я пытаюсь создать приложение на основе CMake, используя bazel через

Общая информация:

  • ОС: Ubuntu 20.04 LTS
  • Версия Bazel: Пробовал как с 3.4.0, так и с 5.0.0.
  • Версия CMake: 3.19.5

Моя структура каталогов выглядит так

      ROOT
|-----BUILD
|-----WORKSPACE
|-----<my_cmake_based_app>-<commit_id>.tar.gz

<my_cmake_based_app> имеет в корне файл CMakeLists.txt.

Файл WORKSPACE выглядит следующим образом:

      workspace(name = "rules_foreign_cc_usage_example")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

# Rule repository, note that it's recommended to use a pinned commit to a released version of the rules
http_archive(
    name = "rules_foreign_cc",
    # TODO: Get the latest sha256 value from a bazel debug message or the latest 
    #       release on the releases page: https://github.com/bazelbuild/rules_foreign_cc/releases
    #
    # sha256 = "...",
    strip_prefix = "rules_foreign_cc-0.7.0",
    url = "https://github.com/bazelbuild/rules_foreign_cc/archive/0.7.0.tar.gz",
)

load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies")

# This sets up some common toolchains for building targets. For more details, please see
# https://github.com/bazelbuild/rules_foreign_cc/tree/main/docs#rules_foreign_cc_dependencies
rules_foreign_cc_dependencies()

_ALL_CONTENT = """
filegroup(
    name = "all_srcs",
    srcs = glob(["**"]),
    visibility = ["//visibility:public"],
)
"""

http_archive(
    name = "<target>",
    strip_prefix = "<my_cmake_based_app>-<commit_id>",
    build_file_content = _ALL_CONTENT,
    url = "file:///<absolute/path/to>/<my_cmake_based_app>-<commit_id>.tar.gz",
)

Мой файл BUILD выглядит так:

      load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake")

cmake(
    name = "<target>",
    cache_entries = {
        "CMAKE_C_FLAGS": "-fPIC",
    },
    lib_source = "@<target>//:all_srcs",
    out_shared_libs = ["lib<target>.so"],
)

Для начала сборки. Я использую следующую команду:

      bazel build //:<target>

Журнал ошибок выглядит так:

      DEBUG: Rule 'rules_foreign_cc' indicated that a canonical reproducible form can be obtained by modifying arguments sha256 = "1df78c7d7eed2dc21b8b325a2853c31933a81e7b780f9a59a5d078be9008b13a"
DEBUG: Repository rules_foreign_cc instantiated at:
  no stack (--record_rule_instantiation_callstack not enabled)
Repository rule http_archive defined at:
  /home/ubuntu/.cache/bazel/_bazel_ubuntu/312d04fd6758f8908769adc1bc8469ac/external/bazel_tools/tools/build_defs/repo/http.bzl:336:31: in <toplevel>
INFO: Repository local_config_cc instantiated at:
  no stack (--record_rule_instantiation_callstack not enabled)
Repository rule cc_autoconf defined at:
  /home/ubuntu/.cache/bazel/_bazel_ubuntu/312d04fd6758f8908769adc1bc8469ac/external/bazel_tools/tools/cpp/cc_configure.bzl:143:30: in <toplevel>
ERROR: An error occurred during the fetch of repository 'local_config_cc':
   Traceback (most recent call last):
        File "/home/ubuntu/.cache/bazel/_bazel_ubuntu/312d04fd6758f8908769adc1bc8469ac/external/bazel_tools/tools/cpp/cc_configure.bzl", line 125
                configure_unix_toolchain(<3 more arguments>)
        File "/home/ubuntu/.cache/bazel/_bazel_ubuntu/312d04fd6758f8908769adc1bc8469ac/external/bazel_tools/tools/cpp/unix_cc_configure.bzl", line 352, in configure_unix_toolchain
                _find_generic(repository_ctx, <3 more arguments>)
        File "/home/ubuntu/.cache/bazel/_bazel_ubuntu/312d04fd6758f8908769adc1bc8469ac/external/bazel_tools/tools/cpp/unix_cc_configure.bzl", line 314, in _find_generic
                repository_ctx.which(result)
Program argument of which() may not contains a / or a \ ('x86_64-<name_of_sdk>-linux-gcc  -march=x86-64 -mtune=generic -mfpmath=sse -msse4.2 -m64 -fstack-protector-strong  -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/home/ubuntu/sdks/sysroots/x86-64-generic-<name_of_sdk>-linux' given)
INFO: Repository cmake-3.22.0-linux-x86_64 instantiated at:
  no stack (--record_rule_instantiation_callstack not enabled)
Repository rule http_archive defined at:
  /home/ubuntu/.cache/bazel/_bazel_ubuntu/312d04fd6758f8908769adc1bc8469ac/external/bazel_tools/tools/build_defs/repo/http.bzl:336:31: in <toplevel>
INFO: Repository <target> instantiated at:
  no stack (--record_rule_instantiation_callstack not enabled)
Repository rule http_archive defined at:
  /home/ubuntu/.cache/bazel/_bazel_ubuntu/312d04fd6758f8908769adc1bc8469ac/external/bazel_tools/tools/build_defs/repo/http.bzl:336:31: in <toplevel>
ERROR: /home/ubuntu/<ROOT>/BUILD:3:6: //:<target> depends on @local_config_cc//:cc-compiler-k8 in repository @local_config_cc which failed to fetch. no such package '@local_config_cc//': Traceback (most recent call last):
        File "/home/ubuntu/.cache/bazel/_bazel_ubuntu/312d04fd6758f8908769adc1bc8469ac/external/bazel_tools/tools/cpp/cc_configure.bzl", line 125
                configure_unix_toolchain(<3 more arguments>)
        File "/home/ubuntu/.cache/bazel/_bazel_ubuntu/312d04fd6758f8908769adc1bc8469ac/external/bazel_tools/tools/cpp/unix_cc_configure.bzl", line 352, in configure_unix_toolchain
                _find_generic(repository_ctx, <3 more arguments>)
        File "/home/ubuntu/.cache/bazel/_bazel_ubuntu/312d04fd6758f8908769adc1bc8469ac/external/bazel_tools/tools/cpp/unix_cc_configure.bzl", line 314, in _find_generic
                repository_ctx.which(result)
Program argument of which() may not contains a / or a \ ('x86_64-<name_of_sdk>-linux-gcc  -march=x86-64 -mtune=generic -mfpmath=sse -msse4.2 -m64 -fstack-protector-strong  -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/home/ubuntu/sdks/sysroots/x86-64-generic-<name_of_sdk>-linux' given)
ERROR: Analysis of target '//:<target>' failed; build aborted: Analysis failed
INFO: Elapsed time: 0.127s
INFO: 0 processes.
FAILED: Build did NOT complete successfully (0 packages loaded, 0 targets configured)

Некоторые из моих очевидных вопросов:

  • Я понятия не имею, откуда взялся этот @local_config_cc.
  • Я упускаю что-то, что можно добавить в мои файлы WORKSPACE / BUILD? ИЛИ ЖЕ
  • Является ли моя структура каталогов полным беспорядком?

В качестве примечания, поскольку я впервые публикую что-то через stackoverflow, я был бы очень признателен за любые советы, чтобы в будущем я мог лучше задавать вопросы.

Спасибо!

РЕДАКТИРОВАТЬ : К вашему сведению, мне удалось создать пример, приведенный в rules_foreign_cc.rules_foreign_cc , в моей существующей системе.

РЕДАКТИРОВАТЬ : FYI, система, которую я использую, является экземпляром AWS EC2.

1 ответ

@local_config_ccявляется частью автоматической цепочки инструментов Bazel для C++. Похоже, что-то не так между Bazel и цепочкой инструментов C++ в вашей системе, потому что это ошибка:

      Program argument of which() may not contains a / or a \ ('x86_64-<name_of_sdk>-linux-gcc  -march=x86-64 -mtune=generic -mfpmath=sse -msse4.2 -m64 -fstack-protector-strong  -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/home/ubuntu/sdks/sysroots/x86-64-generic-<name_of_sdk>-linux' given)

Таким образом, аргумент для whichвыглядит как какая-то команда, тогда как это должно быть просто имя инструмента С++, такого как «gcc». Bazel просматривает переменные среды, чтобы найти эти инструменты. Есть ли что-то в CCпеременная окружения?

Если нет, может быть полезно сначала попытаться создать что-то простое, например:

main.c:

      #include <stdio.h>
int main() {
  printf("hello world\n");
  return 0;
}

BUILD:

      cc_binary(
  name = "main",
  srcs = ["main.c"],
)

тогда:

      $ bazel run main
Starting local Bazel server and connecting to it...
INFO: Analyzed target //:main (35 packages loaded, 146 targets configured).
INFO: Found 1 target...
Target //:main up-to-date:
  bazel-bin/main
INFO: Elapsed time: 3.657s, Critical Path: 0.03s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
INFO: Build completed successfully, 1 total action
hello world

Комментируя более общие ваши другие вопросы, несколько необычно иметь архив tar.gz в вашей рабочей области, а затем ссылаться на этот архив в правиле http_archive в вашем файле WORKSPACE[1]. Если у вас есть конкретные причины или другой контекст для этого, может быть полезно поговорить о них. В противном случае вы в основном просто используете Bazel для распаковки архива и запускаете make для содержимого, что вы могли бы сделать в двухстрочном сценарии оболочки :) Обычно ваши файлы сборки и файл рабочей области будут частью самого репозитория кода.

[1] Кроме того, размещение абсолютных путей в файле рабочей области (или где угодно) делает вашу настройку не переносимой.

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