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

Python 在WAF构建系统中设置Linux环境变量,python,linux,environment-variables,waf,Python,Linux,Environment Variables,Waf,我继承了一个现有的WAF构建系统。现有系统使用WAF 1.7.2。该系统支持使用WAF变体的多个交叉编译器。我需要添加一个支持新工具链的新变体。不幸的是,为了在构建系统上使用此工具链,我必须在执行任何工具之前设置Linux环境变量LD_LIBRARY_PATH 在运行waf之前设置环境变量的简单方法适用于配置步骤(为了便于讨论,我删除了一些变量): 但在构建步骤中失败: export LD_LIBRARY_PATH=/opt/toolchains/crosstools-mipsel-linux-

我继承了一个现有的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 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环境变量?

您可以查看

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

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

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

def配置(cnf):
setenv(“linux_mips_uclibc_debug”)
cnf.env.CC=/opt/toolschains/crosstools-mipsel-linux-uclibc-4.6.3/usr/bin/CC
cnf.env.LINKFLAGS=“-L/opt/toolschains/crosstools-mipsel-linux-uclibc-4.6.3/usr/lib”
cnf.env.foo=“随便什么”
cnf.setenv(“linux_xxx”)
cnf.env.CC=/opt/toolschains/crosstools xxx/usr/bin/CC
cnf.env.LINKFLAGS=“-L/opt/toolschains/crosstools xxx/usr/lib”
cnf.env.foo=“无论如何”
def生成(bld):
bld.program(target=“myexe”,source=“mymain.c”)
类虚拟名称无关紧要(BuildContext):
cmd='build\u linux\u mips\u uclibc\u debug'
variant='linux_mips_uclibc_debug'#必须与conf中的setenv名称匹配
类虚拟名称无关紧要(BuildContext):
cmd='build_xxx'
variant='linux\u 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命令。诸如此类:

从waflib.Tools.c导入c,cprogram
从waflib.Task导入类
llp=“LD_LIBRARY_PATH={}”。格式(“/your/PATH/here”)
MyC(c)类:
run\u str=lld+c.run\u str
类别MyCProgram(cprogram):
run\u str=lld+cprogram.run\u str
类别['c']=MyC
类别['cprogram']=MyCProgram
我制作了类似的东西,用
-isystem
替换
-I
。工作就像一个符咒:)


当然,为了便于使用,您可以在waf工具中执行此操作。

谢谢您的建议。不幸的是,我确实需要为工具链的执行定义libs路径。我需要在执行编译器之前导出LD_LIBRARY_PATH,否则编译器将无法启动。它是一个专有的工具链,需要标准Linux安装中没有的库,因此需要设置LD_LIBRARY_PATH.Hum。好啊然后您可以更改waf使用的命令。。。我将编辑我的答案
waf # build default variant, with system toolchain
waf build_linux_mips_uclibc_debug # use linux mips variant
waf build_xxx # use variant linux_xxx