Makefile中的'$$ directoryName'和'$(directoryName)'有什么区别

时间:2019-09-09 10:25:27

标签: makefile autotools

我有两个Makefile

第一个:

dir = ../dir1
dis = ../dir2
test:
    $(MAKE) -C $(dir)

第二个:

DIRS = dir1 dir2 dir3

test:
    for dir in $(DIRS); do \
            if $(MAKE)  -C $$dir ; then \
                true; \
            else \
                exit 1; \
            fi; \
    done

为什么在for循环中我需要$$ dir,而在一个简单的配方中我必须写$(dir)

另一个问题: 我有另一个makefile,其中有另一个for循环:

all clean dep depend print:
for dir in $(DIRS); do \
    if $(MAKE) $(MAKE_FLAGS) -C $$dir $@; then \
        true; \
    else \
        exit 1; \
    fi; \
done

该行中$ @的含义是什么

if $(MAKE) $(MAKE_FLAGS) -C $$dir $@; then \

我知道这是一个自动变量,与规则目标的文件名匹配。 这里的目标似乎是一个诸如cancel的命令:

cancell:
    rm -rf *.o

1 个答案:

答案 0 :(得分:0)

一个是makefile变量,另一个是shell变量。 $(directoryName)将在阅读时由make解析。对于$$directoryName,make将$$转换为$,并将其传递给外壳程序(因此$$directoryName变成$directoryName)。外壳将其扩展到其环境中的任何内容。

更多细节:

如果在制造过程中定义(在任何配方之外)

var := 1

然后var是一个make变量。如果您再致电

all:
    echo $(var)

然后make将命令扩展到命令行之前,将配方扩展为echo ../dir1 。另一方面,如果您这样做:

all:
    var=1; echo $$var

然后将var=1; echo $var传递给外壳。外壳程序将var设置为1,然后进行打印。请注意是否尝试过:

all:
    var=1;
    echo $$var

然后,该配方将不会打印任何内容-这是因为第一行在shell中运行,该shell将var设置为1,但随后退出。下一行运行,在新的外壳中传递echo $var,但是此外壳不知道在上一个外壳中将var设置为什么。

此外,如果您运行var=1;make,则make在启动时会将makefile变量var设置为1。因此,在这种情况下,$(info $(var))将显示1。

对于语法,请在make中执行var := 1(带空格)。在bash中,您不能添加空格。在bash中,$var引用变量var。在make $var中引用$v,后跟文字ar。 (为了使您必须使用{}()来引用多字符变量)。在bash中,您可以使用{},也可以不使用大括号($(var)在bash中具有不同的含义)。

make还具有两个flavors变量,一个用:=定义,另一个用=定义。