我知道这是一个简单的问题,但我无法找到原因/解决方案。我在Makefile中定义了一个简单的shell函数,如下所示,
define my_function
my_var="Hello";
echo $(my_var);
echo Recvd arg = $(1);
endef
请注意,这是在makefile中定义的,我在我的一个规则中使用
$(obj_dir)/%.o: $(src_base)/%.cpp
$(q)$(CXX) $(CXXFLAGS) -o $@
$(call my_function, $@)
但是局部变量my_var永远不会被分配。我已经尝试了许多使用eval,set和export的东西,但似乎没有任何东西在函数中为变量赋值。并且echo $(my_var)将不会打印任何内容。这在shell脚本中工作正常但在Makefile中使用时会导致此问题。
请帮我解决这个问题。帮助将受到高度赞赏。
答案 0 :(得分:2)
Make将在单独的shell中调用配方的每个逻辑行。对于类似的事情:
foo:
echo line1
echo line2
这会启动两个不同的shell,一个运行第一个echo,另一个运行第二个(实际上make有一些性能增强,因此如果命令是"足够简单"它可以避免启动shell;但这两种行为都是一样的。)
因此,如果你在一行中写一个变量然后在另一行中使用它,那么当shell退出时该值将会丢失:
foo:
foo=bar
echo $$foo
什么都不打印。为了使用多条物理线但只有一条逻辑线,你必须用反斜杠/换行组合结束每条物理线:make将收集它们并将它们发送到一个shell:
foo:
foo=bar; \
echo $$foo
将打印" bar"。
即使在多行变量赋值中也是如此。此外,当您要引用 shell 变量时,必须使用$$
(如上所述)。使用单个$
将通过该名称引用 make 变量。 shell变量引用并不支持括号(但如果需要,可以使用花括号)。所以你必须写:
define my_function
my_var="Hello"; \
echo $$my_var; \
echo Recvd arg = $(1);
endef
答案 1 :(得分:0)
我没有任何东西可以添加到MadScientist的答案中,但是:如果你不介意稍长的行,你也可以在一行上用分号分隔几个shell命令:
define my_function
my_var="Hello"; echo $$my_var; echo Recvd arg = $(1)
endef