话接上篇
116 SRCS :=
117 SRCS += Build/AniViewScreen.cc
这里又出现了一个设置符':='。与常见的编程语言不一样,'='后如果接别的变量,这个右值变量是不会立即展开的;它只在你要使用这个变量时才展开。例如
SRC = $(OBJ)
OBJ = TEST.O
$(error $SRC)
输出的会是TEST.O而不是空。这样做的好处可能是简单编写时不用考虑顺序?坏处是你不能使用 'SRC = $SRC TEST2' 这样的语句,因为这会导致递归展开。而新的设置符':='就相当于一般编程语言中的等号了,它是立即展开的。
461 DEPS = $(filter %.d, $(SRCS:.c=.d) $(SRCS:.cc=.d))
这句给变量DEPS赋值的语句,实际上调用了3个函数,$(filter pattern...,text)是一个。这个函数是过滤函数,它提出符合pattern的词。
'$(SRCS:.c=.d)'是函数$(patsubst pattern,replacement,text)的缩写形式。它将SRCS中所有.c换成.d。
整个这条语句是生成了一个c和c++文件的依赖文件名表。JA2的这个Makefile,并没有写出c文件和头文件的依赖关系,这种依赖关系是靠depend命令由GCC自动生成的。
464 .SUFFIXES:
465 .SUFFIXES: .c .cc .d .o
SUFFIXES是一个特殊的目标。它规定了Make可以在'潜规则'中使用的下标。464行用来清除默认的下标表,465行设置成需要的。
483 .c.o:
484 @echo '===> CC $<'
485 $(Q)$(CC) $(CCFLAGS) -c $< -o $@
这三行就是SUFFIXES潜规则的应用。它的目标是任意的.o文件,它的源是同名的C文件。
不过这种写法已经不推荐了。现在推荐使用通配符形式:
%.o : %.c foo.h
这样更直观,而且可以加入特定文件(foo.h)。
下面的语句中我发现了sed程序和正则表达式,还是留待明天再研究吧。
116 SRCS :=
117 SRCS += Build/AniViewScreen.cc
这里又出现了一个设置符':='。与常见的编程语言不一样,'='后如果接别的变量,这个右值变量是不会立即展开的;它只在你要使用这个变量时才展开。例如
SRC = $(OBJ)
OBJ = TEST.O
$(error $SRC)
输出的会是TEST.O而不是空。这样做的好处可能是简单编写时不用考虑顺序?坏处是你不能使用 'SRC = $SRC TEST2' 这样的语句,因为这会导致递归展开。而新的设置符':='就相当于一般编程语言中的等号了,它是立即展开的。
461 DEPS = $(filter %.d, $(SRCS:.c=.d) $(SRCS:.cc=.d))
这句给变量DEPS赋值的语句,实际上调用了3个函数,$(filter pattern...,text)是一个。这个函数是过滤函数,它提出符合pattern的词。
'$(SRCS:.c=.d)'是函数$(patsubst pattern,replacement,text)的缩写形式。它将SRCS中所有.c换成.d。
整个这条语句是生成了一个c和c++文件的依赖文件名表。JA2的这个Makefile,并没有写出c文件和头文件的依赖关系,这种依赖关系是靠depend命令由GCC自动生成的。
464 .SUFFIXES:
465 .SUFFIXES: .c .cc .d .o
SUFFIXES是一个特殊的目标。它规定了Make可以在'潜规则'中使用的下标。464行用来清除默认的下标表,465行设置成需要的。
483 .c.o:
484 @echo '===> CC $<'
485 $(Q)$(CC) $(CCFLAGS) -c $< -o $@
这三行就是SUFFIXES潜规则的应用。它的目标是任意的.o文件,它的源是同名的C文件。
不过这种写法已经不推荐了。现在推荐使用通配符形式:
%.o : %.c foo.h
这样更直观,而且可以加入特定文件(foo.h)。
下面的语句中我发现了sed程序和正则表达式,还是留待明天再研究吧。