因此,要编译我的可执行文件,我需要正确设置库位置。问题是,设置来自一堆执行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”将无效)
答案 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。