在WAF构建系统中设置Linux环境变量

2024-06-26 13:41:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我继承了一个现有的WAF构建系统。现有系统使用WAF 1.7.2。该系统支持使用WAF变体的多个交叉编译器。我需要添加一个支持新工具链的新变体。不幸的是,为了在我们的构建系统上使用这个工具链,我必须在执行任何工具之前设置Linux环境变量LD_LIBRARY_PATH

在运行waf之前设置环境变量的简单方法适用于配置步骤(为了便于讨论,我删除了一些变量):

export LD_LIBRARY_PATH=/opt/toolchains/crosstools-mipsel-linux-uclibc-4.6.3/usr/lib
./waf configure
Configuring variant docs       - Available  
Configuring variant linux_arm_musl - Available for ['arm-32bit']
Configuring variant linux_mips_uclibc - Available for ['mips-32bit']
'configure' finished successfully (0.288s)

但在构建步骤中失败:

export LD_LIBRARY_PATH=/opt/toolchains/crosstools-mipsel-linux-uclibc-4.6.3/usr/lib
./waf build --variant=linux_mips_uclibc_debug
Waf: Entering directory `/home/builder/dev/project/slag'
Waf: Entering directory `/home/builder/dev/project/slag/linux_mips_uclibc_debug'
[  1/305] | linux_mips_uclibc_debug | platform | c | ['list.c'] | ['list.c.1.o']
[  2/305] | linux_mips_uclibc_debug | platform | c | ['map.c'] | ['map.c.1.o']
[  3/305] | linux_mips_uclibc_debug | platform | c | ['tree.c'] | ['tree.c.1.o']
/opt/toolchains/crosstools-mipsel-linux-uclibc-4.6.3/usr/bin/../libexec/gcc/mipsel-buildroot-linux-uclibc/4.6.3/cc1: error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory
/opt/toolchains/crosstools-mipsel-linux-uclibc-4.6.3/usr/bin/../libexec/gcc/mipsel-buildroot-linux-uclibc/4.6.3/cc1: error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory
/opt/toolchains/crosstools-mipsel-linux-uclibc-4.6.3/usr/bin/../libexec/gcc/mipsel-buildroot-linux-uclibc/4.6.3/cc1: error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory
Waf: Leaving directory `/home/builder/dev/project/slag/linux_mips_uclibc_debug'
Build failed

当我深入研究这个问题时,我发现WAF在配置步骤中执行编译器时会保留环境,但在构建步骤中执行编译器之前会清除环境。在构建步骤中,我尝试了许多不同的方法让WAF设置Linux环境变量,但在编译器执行之前,我所有的尝试都被清除了

如何设置WAF,以便在构建期间执行编译器时设置Linux环境变量


Tags: debug编译器linuxusr步骤directoryfileshared
1条回答
网友
1楼 · 发布于 2024-06-26 13:41:16

你可以看看waf book § 10.5.2

我认为您的问题在于LD_LIBRARY_PATH为执行定义了libs路径。对于链接,您必须使用具有正确路径的-L标志的链接器

为此,最简单的方法是在相关变量配置中使用conf.env.LINKFLAGS = "-L/opt/toolchains/crosstools-mipsel-linux-uclibc-4.6.3/usr/lib"

顺便说一句,定义与变量关联的特定命令非常有用:

def configure(cnf):

    cnf.setenv("linux_mips_uclibc_debug")
    cnf.env.CC = /opt/toolchains/crosstools-mipsel-linux-uclibc-4.6.3/usr/bin/cc
    cnf.env.LINKFLAGS = "-L/opt/toolchains/crosstools-mipsel-linux-uclibc-4.6.3/usr/lib"
    cnf.env.foo = "whatever"

    cnf.setenv("linux_xxx")
    cnf.env.CC = /opt/toolchains/crosstools-xxx/usr/bin/cc
    cnf.env.LINKFLAGS = "-L/opt/toolchains/crosstools-xxx/usr/lib"
    cnf.env.foo = "whatever_xxx"

def build(bld):

    bld.program(target = "myexe", source = "mymain.c")

class dummy_name_doesnt_matter(BuildContext):
    cmd = 'build_linux_mips_uclibc_debug'
    variant = 'linux_mips_uclibc_debug' # must match setenv name in conf

class dummy_name_doesnt_matter(BuildContext):
    cmd = 'build_xxx'
    variant = 'linux_xxx'

使用类似于:

waf # build default variant, with system toolchain
waf build_linux_mips_uclibc_debug # use linux mips variant
waf build_xxx # use variant linux_xxx

注:未经测试,我没有waf 1.7.2

如果确实需要为编译器设置LD_LIBRARY_PATH,可以使用monkeypatch waf compile/link命令。诸如此类:

from waflib.Tools.c import c, cprogram
from waflib.Task import classes

llp = "LD_LIBRARY_PATH={} ".format("/your/path/here")

class MyC(c):
    run_str = lld + c.run_str
class MyCProgram(cprogram):
    run_str = lld + cprogram.run_str

classes['c'] = MyC
classes['cprogram'] = MyCProgram

我制作了类似的东西,用-isystem替换-I。工作就像一个符咒:)

当然,为了便于使用,您可以在waf工具中实现这一点

相关问题 更多 >