如何处理makefile中的环境设置?

时间:2009-10-09 23:28:56

标签: makefile

因此,要编译我的可执行文件,我需要正确设置库位置。问题是,设置来自一堆执行env变量导出的脚本,需要设置的内容可能会发生变化(超出我的控制范围),所以我需要使用这些脚本而不是复制它们的功能。要在常规命令行中编译,我需要执行以下操作:

setup library1
setup library2
source some_other_setup_script.bash
g++ blah.c
# setup is a executable on my system that run some scripts

我如何编写完成该文件的makefile?据我所知,env变量导出不会结转(即“export VAR = remember; echo $ VAR”将无效)

6 个答案:

答案 0 :(得分:11)

您还可以使用GNU make的机制正确添加环境变量,如下所示:

export TEST:="Something Good!"
test:
    echo $$TEST

这(我认为)有不同的语义:

TEST2:="Something not quite so useful?"
test2:
    echo ${TEST2}

我认为(再次,我认为)在传递给shell之前在make中进行替换。请注意,export命令在目标块中不起作用,只是作为立即执行的命令而缩进。

答案 1 :(得分:5)

如果变量导出不像命令行那样工作,那表明Make选择的shell与您正在使用的shell不同,处理变量的语法不同(export VAR=remember; echo $VAR可以正常工作我)。默认情况下使用/bin/sh,但您可以使用SHELL变量覆盖它,从而使从环境导入。我建议将SHELL(在Makefile中)设置为您在环境中使用的任何内容并再次尝试export VAR=remember实验。

答案 2 :(得分:3)

最终,您需要定义变量并在shell列表甚至脚本中执行编译器,而不是在单独的make命令中。但是,您可以添加一些改进。您可以告诉make脚本:

maintarget: script.sh blah.c
    source script.sh; g++ blah.c

script.sh:
    setup include script here

另一件事就是在同一个shell中执行所有这些东西

maintarget: blah.c
    run this; run that; run the other thing; g++ blah.c 

我相信所有make版本都会在同一个shell中运行;列表,但您始终可以强制使用(list)子shell,或者通过调用shell脚本作为编译器命令包装。

不要忘记让适当的目标取决于你自己的脚本。顺便说一下,一些make版本(pmake又名bsd make)可以在定义make变量时执行命令,然后make的所有版本都会导出它们。但我不认为gmake可以做到这一点。

答案 3 :(得分:1)

您可以编写另一个执行所有命令的shell脚本,然后打印出可以使用的变量赋值。运行脚本,将其输出通过管道传输到文件,然后从Makefile中包含该文件。例如:

生成文件:

all:
    echo $(FOO)

test.mk: test.sh
    ./$< > $@

include test.mk

test.sh

echo "FOO=1"

在包含此Makefile的目录中运行“make”会产生:

make: Entering directory `/home/luser/build/mktest'
Makefile:7: test.mk: No such file or directory
./test.sh > test.mk
make: Leaving directory `/home/luser/build/mktest'
make: Entering directory `/home/luser/build/mktest'
echo 1
1
make: Leaving directory `/home/luser/build/mktest'

make通过运行shell脚本创建test.mk,然后包含它。 test.mk包含test.sh的输出,并被解析为Makefile。有关详细信息,请参阅http://www.gnu.org/software/make/manual/make.html#Include
我们在Mozilla的client.mk中使用了这个变体,让你在“mozconfig”文件中定义选项: http://mxr.mozilla.org/mozilla-central/source/client.mk#138

答案 4 :(得分:0)

重述:如何将shell变量放入make文件中?

类似的东西:

MYVAR := $(shell echo $(MYVAR)) <any_makefile_additions_here> 

因此,当设置了名为MYVAR的环境变量时,这会在MAKEFILE中定义MYVAR。

答案 5 :(得分:0)

为了覆盖已在makefile中定义的选项,make支持(我指的是GNU Make 3.82,但其他版本可能也是如此)选项{{ 1}}。 例如:

生成文件:

-e

运行make:

CC=gcc
...

将使用gcc-4.7而不是gcc。