我有两个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
答案 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变量,一个用:=
定义,另一个用=
定义。