Ошибка сборки с rules_foreign_ cc и configure_make - PullRequest
0 голосов
/ 08 марта 2020

Я не заметил, что в настоящее время Bazel имеет вспомогательные скрипты для работы с внешними зависимостями на основе автоинструментов. Я пытаюсь создать внешнюю зависимость с помощью новых помощников rules_foreign_cc, и кажется, что скрипт настройки, используемый configure_make, запускается в папке с песочницей, которая не содержит все остальные файлы в пакете.

Я создал следующее минималистское рабочее пространство bazel:

РАБОЧЕЕ МЕСТО:

workspace(name = "papi_test")
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository", "new_git_repository")

git_repository(
    name = "bazel_skylib",
    remote = "https://github.com/bazelbuild/bazel-skylib",
    commit = "e59b620b392a8ebbcf25879fc3fde52b4dc77535",
)

http_archive(
   name = "rules_foreign_cc",
   strip_prefix = "rules_foreign_cc-master",
   url = "https://github.com/bazelbuild/rules_foreign_cc/archive/master.zip",
   sha256 = "bcee8e145e75e14ff977935343cfa31d1259daab4414bea3348ac08f41303758",
)

load("@rules_foreign_cc//:workspace_definitions.bzl", "rules_foreign_cc_dependencies")
rules_foreign_cc_dependencies([])

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

new_git_repository(
    name = "edu_utk_papi",
    remote = "https://bitbucket.org/icl/papi",
    commit = "1a0bf73d8be1cc4f5cab316b8e40dbd57d507149",
    strip_prefix = "src",
    build_file_content = all_content,
)

BUILD:

cc_binary(
    name = "test",
    srcs = ["test.cc"],
    deps = [
        "//third_party/papi",
    ],
)

third_party / papi / BUILD:

load("@rules_foreign_cc//tools/build_defs:configure.bzl", "configure_make")

package(default_visibility = ["//visibility:public"])

configure_make(
    name = "papi",
    lib_source = "@edu_utk_papi//:all",
    out_include_dir = "third_party/papi",
    static_libraries = ["libpapi.a"]
)

test. cc:

#include "third_party/papi/papi.h"

Попытка сборки test.cc приводит к следующей ошибке:

gcc: error: genpapifdef.c: No such file or directory
gcc: fatal error: no input files
compilation terminated.
configure: Generating fpapi.h
/home/efagerho/.cache/bazel/_bazel_efagerho/55b15bddc4b02ecd481398de6061d763/sandbox/processwrapper-sandbox/2/execroot/papi_test/external/edu_utk_papi/configure: line 6894: ./genpapifdef: No such file or directory
configure: Generating f77papi.h
/home/efagerho/.cache/bazel/_bazel_efagerho/55b15bddc4b02ecd481398de6061d763/sandbox/processwrapper-sandbox/2/execroot/papi_test/external/edu_utk_papi/configure: line 6897: ./genpapifdef: No such file or directory
configure: Generating f90papi.h
/home/efagerho/.cache/bazel/_bazel_efagerho/55b15bddc4b02ecd481398de6061d763/sandbox/processwrapper-sandbox/2/execroot/papi_test/external/edu_utk_papi/configure: line 6900: ./genpapifdef: No such file or directory

Другими словами, это выглядит, когда сценарий configure выполняется, он был скопирован в папку, в которой нет других файлов, присутствующих в исходном каталоге внешней зависимости. Документация отсутствует в библиотеке rules_foreign_cc и, глядя на код Skylark (и теперь, зная какой-либо Skylark), я не смог найти ни одного параметра, который позволил бы мне перетаскивать файлы в исходной папке, которые должны присутствовать, когда скрипт configure выполняется.

Есть ли способ заставить эту сборку работать?

UPDATE: Мне кажется, я заметил, в чем проблема. Если я клонирую репозиторий PAPI, сценарий configure находится в подпапке src/. Если я сейчас запущу:

`src/configure`

, то скрипт завершится неудачно с той же ошибкой, что и выше. Однако, если я вместо этого сделаю

`cd src/ && ./configure

, сценарий configure работает просто отлично. Поскольку в моем файле WORKSPACE есть strip_prefix= "src", похоже, что rules_foreign_cc вызывает скрипт configure без предварительного изменения текущей рабочей директории на папку скрипта.

...