当我从 bazel 规则运行它时,openssl 中的
Configure中的
use OpenSSL::fallback "$FindBin::Bin/external/perl/MODULES.txt";
失败。
我正在使用 https://github.com/bazelbuild/rules_perl/tree/main 为我运行
Configure
脚本。然后是一个运行 make
命令的 shell 脚本。到目前为止,虽然我陷入了上述错误。只有当我从Configure
中完全删除该行时它才会消失,而如果我修改它则不会消失。
对我来说奇怪的是,当我这样做时
./Configure
它就像预期的那样工作。 bazel 的沙箱有什么特别之处导致它不起作用吗?
load("@rules_perl//perl:perl.bzl", "perl_binary")
perl_binary(
name = "configure_openssl",
srcs = ["Configure"],
data = glob(["**/*.pm"]),
)
sh_binary(
name = "make",
srcs = ["run_build.sh"],
data = [
"Makefile",
"config",
":configure",
"@modules",
] + glob([
"include/**/*.h",
"crypto/**/*.h",
"ssl/**/*.h",
"util/**/*",
"**/build.info",
"Configurations/*",
"**/*.in",
"**/*.pm",
]),
)
我也知道
rules_foreign_cc
存在,但这对我的目的不起作用,因为他们的 openssl
示例在运行时甚至无法在我的系统上找到 rm
,所以这看起来更像是一场艰苦的战斗。
哦,当我使用这个 shell 脚本时,我遇到了同样的错误(仅使用 bazel)
#!/bin/bash
perl Configure && make
好吧,我明白了。 Openssl 有一个名为“fallback”的模块,它正在寻找条件而不仅仅是目录。
unless (-e $path
&& ($path =~ m/(?:^|\/)MODULES.txt/ || -d $path)) {
croak "Parameter to use fallback must be a directory, not a file";
next;
}
因此,由于它组织运行文件的方式,
MODULES.txt
的默认路径不再存在于 bazel
中。所以解决方案是修改Configure
以查看正确的路径(类似于external/<some_submodule>~/perl/MODULES.txt
)。我认为错误消息应该更改为“文件不存在,文件与正则表达式不匹配,或者这不是目录”。