Установка переменной окружения Linux в системе сборки WAF - PullRequest
1 голос
/ 09 июля 2020

Я унаследовал существующую систему сборки 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 переменная окружения, установленная при запуске компилятора во время сборки?

1 Ответ

1 голос
/ 28 июля 2020

Вы можете посмотреть 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" в соответствующем варианте конфигурации.

По way полезен для определения специальной c команды, связанной с вашим вариантом:

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

Я сделал что-то подобное, чтобы заменить -I на -isystem. Работает как шарм :)

Конечно, вы можете сделать это в программе waf для простоты использования.

...