GNU Makefile中多行宏中的变量赋值问题

时间:2014-03-20 20:50:52

标签: makefile gnu-make

我知道这是一个简单的问题,但我无法找到原因/解决方案。我在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中使用时会导致此问题。

请帮我解决这个问题。帮助将受到高度赞赏。

2 个答案:

答案 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