make & makefile:
是一个功能强大的项目管理工具.
目标 : 依赖
规则
两种情况的区别:
1.倒叙方式,最终目标在最前面;后面的目标是否执行都依赖于前面的最终目标是否用到;
2.顺序方式,在同一个目标下,规则中各行依次紧密排列,顺序执行;
make -f makefile_name
make -Iinclude
make -C subdir
make -C subdir -f makefile_name clean
make -s 禁止命令的显示
automake根据我写的Makefile.am来生成Makefile.in,然后执行./configure生成Makefile
shell里面每执行完一条命令,则退回原来的shell中,用分号';'进行分割将在同一个shell中执行
PWD := $(shell pwd)
...$(PWD) 可应用路径
定义命令包:
define myfun
...
undef
$(myfun) 可应用该命令包
foo = ok
ifdef foo 测试foo是否被定义
b = yes
else 如果foo = 为空走此路
b = no
endif
+=可追加变量值
.PHONY:clean 会被强制执行,与clean这个文件是否存在无关.
clean :
rm -rf *.o app
内建变量: $@ $< $^所有 $?比目标新的依赖
.c.o: 老写法
gcc -c $<
%.o:%.c 新写法
gcc -c $<
通配符: * ? [...]
显示控制: @echo compiling 有@符号将不显示命令本身
高级变量:
$(var:a=b) 以a字串结尾的a替换成b
如:
foo = a.o b.o c.o
$(foo:.o=.c)值为a.c b.c c.c
$(var: %.o = %.c) 被替换的字串有相同模式,%可在单词中间,还可改名称,不仅仅是后缀
如:
foo = aa1.o aa2.o aa3.o
$(foo: aa%.o = bb%.c)值为bb1.c bb2.c bb3.c
SOURCES = $(wildcard *.c) 产生该目录下所有以.c结尾的文件列表
gcc -MM $(SOURCES) > depends 把.o作目标,.c和包含的.h(((除了<>包含的)))作为依赖
include depends
$(patsubst %.c,%.o,$(SOURCES)) 把SOURCES中的.c变成.o
$(addprefix prefix,names...) 增加前缀,如:
$(addprefix src/, foo bar)值为src/foo src/bar
SUBDIRS = list hello
all : subdirs
subdirs:
for n in $(SUBDIRS); do $(MAKE) -C $$n || exit 1; done
clean:
for n in $(SUBDIRS); do $(MAKE) -C $$n clean; done
? := & = 定义的变量有什么区别
阅读(847) | 评论(0) | 转发(0) |