我目前面临着以下模糊问题:我正在使用foreign_cc
为我的项目在Bazel环境中依赖的库 Package 基于configure
/make
的构建过程,我需要将RPATH
的值设置为固定值。
我设法使用copts
参数注入"-Wl,--rpath,SOME_VALUE"
,这导致ASFLAGS
CFLAGS
和CXXFLAGS
被设置在生成的构建脚本中,这似乎是可行的,但是Bazel创建的二进制文件包含一个奇怪的路径组合 * 前缀 * 到我设置的路径:
$ objdump -x bazel-bin/external/path/to/binary | grep PATH
RPATH /opt/gcc-12.2.0/lib/../lib64:/long/path/inside/bazel/cache:SOME_VALUE
字符串
尝试在Bazel之外再现这种行为,即获取/提取源代码,使用完全相同的环境变量运行.configure
,并运行类似于Bazel使用的构建脚本的make install
,结果正好是我需要的RPATH
的值
$ objdump -x dest/usr/local/lib/binary |grep 'R.*PATH'
RUNPATH SOME_VALUE
型
怎么回事?Bazel-Buildscript在获取RPATH
的串联值时做了哪些不同的操作?
好吧,我想有一些区别我只是没有想到,但我不知道从哪里开始。是否有一个隐藏的环境变量,我可以设置它说:“前缀的预期值为RPATH
与一些值提取的工具链”?
下面是build_script.sh
实际构建二进制文件的部分,我也在外部运行了它,但结果不同:
ARFLAGS="rcsD" \
AR_FLAGS="rcsD" \
ASFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer -fno-canonical-system-headers -Wno-builtin-macro-redefined -D__DATE__="redacted" -D__TIMESTAMP__="redacted" -D__TIME__="redacted" -Wl,--rpath,SOME_VALUE" \
CFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer -fno-canonical-system-headers -Wno-builtin-macro-redefined -D__DATE__="redacted" -D__TIMESTAMP__="redacted" -D__TIME__="redacted" -Wl,--rpath,SOME_VALUE" \
CXXFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer -std=c++0x -fno-canonical-system-headers -Wno-builtin-macro-redefined -D__DATE__="redacted" -D__TIMESTAMP__="redacted" -D__TIME__="redacted" -Wl,--rpath,SOME_VALUE" \
LDFLAGS="-fuse-ld=gold -Wl,-no-as-needed -Wl,-z,relro,-z,now -B/usr/bin -pass-exit-codes -lstdc++ -lm -L$EXT_BUILD_DEPS/openssl/lib" \
AR="/usr/bin/ar" \
CC="/usr/bin/gcc" \
CXX="/usr/bin/gcc" \
RANLIB=":" \
CPPFLAGS="-I$EXT_BUILD_DEPS/openssl/include" \
./configure
$EXT_BUILD_ROOT/bazel-out/k8-opt-exec-2B5CBBC6/bin/external/rules_foreign_cc/toolchains/make/bin/make install
型
1条答案
按热度按时间qlzsbp2j1#
我将继续并假设您正在使用自动解析工具链(特别是在Linux上)。您正在查看的
RPATH
位将来自runtime_library_search_directories
特性,该特性插入-rpath
动态链接二进制文件…以便它们与bazel run
或bazel test
一起工作。一般来说,对于
cc_*
规则,工具配置是工具链配置的一个功能(您自己的或自动解析和配置的)。它处理不同的信息片段(用户传递的配置)以及构建派生(例如在结果树中期望solib的位置)以获得完整的调用。通过copts
属性添加的标志由user_compile_flags
特性处理(如下所示)。“其他”-rpath
参数是由runtime_library_search_directories
功能基于runtime_library_search_directories
变量添加的,该变量将由bazel填充,因为它添加了要链接的solibs。TL;DR有多个信息源(不仅仅是copts
),编译器/链接器调用的命令行将从这些信息源中进行组装。该描述将涉及定义这些特征/使它们与遗留特征修补逻辑一起修补的自动解析工具链或自定义工具链。一个完全(从头开始)自定义的工具链可以以不同的方式处理命令行的构造和工具调用。
除此之外,我对
cc_foreign
规则没有太多的了解,虽然我理解它们存在的原因,但我通常会尽量避免使用它们(但您的里程可能会因您对树的依赖性和控制而异)。什么让我有点奇怪的表面上,虽然你说它的工作,我不会期望copts
和通过CXXFLAGS
& Co。由于RPATH
在很大程度上是一个链接时间配置,我实际上希望linkopts
和“外来”通过LDFLAGS
传递它更有意义?