Makefile递归编译

akefile
=和:=
x := foo
y := $(x) bar
x := later
其等价于:
y := foo bar
x := later


目标:$@ 表示规则中的目标文件集。如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
依赖:$^ 所有的依赖集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
依赖:$< 依赖第一个名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。

变量:在Makefile中的定义的变量,就像是C/C++语言中的宏一样
objects = program.o foo.o utils.o
program : $(objects)
cc -o program $(objects)

Makefile shell注意点
http://www.blogjava.net/jasmine214--love/archive/2012/01/10/368191.html
1:尽在Makefile文件的目标项冒号后的另起一行的代码才是shell代码。
2:Makefile中的shell,每一行是一个进程,不同行之间变量值不能传递。所以,Makefile中的shell不管多长也要写在一行。
3:Makefile中的变量以$开头, 所以,为了避免和shell的变量冲突,shell的变量以$$开头


SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
OBJS= $(patsubst %.cpp,./obj/%.o,$(notdir $(SOURCES)))
GCNOS= $(patsubst %.cpp,./obj/%.gcno,$(notdir $(SOURCES)))


Makefile文件范例
注意使用tab键作为命令的开始,行尾不需要空格,尤其是wins->linux会出现问题

#BASE_DIR :=$(shell pwd)

SUBDIRS= fnd_system fnd_pzasset

#@取消命令本身的输出
#$1 shell第一个参数
define make_subdir
 @for subdir in $(SUBDIRS); do \
 pwd && echo $$subdir && echo $1 && echo $@ || exit $$?;  \
 done;
endef

#.PHONY 说明 all等等为伪命令
.PHONY : all install clean
all :
    @echo $(BASE_DIR)
    $(call make_subdir, all)

install : 
    $(call make_subdir, install)

debug :
    $(call make_subdir, debug)

clean :
    $(call make_subdir, clean)

猜你喜欢

转载自blog.csdn.net/swj9099/article/details/77839357