edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
=======================================================================
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
.PHONY : clean
clean :
rm edit $(objects)
======================================================================
另类风格:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
$(objects) : defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o : buffer.h
.PHONY : clean
clean :
rm edit $(objects)
====================================================================
第四章:
Makefile 里主要包含了五个东西:显示规则、隐晦规则、变量定义、文件指示和注释。
1.文件指示。其包括了三个部分,一个是在一个Makefile 中引用另一个Makefile ,
2.如果你要在你的 Makefile 中使用“#”字符,可以用反
斜框进行转义,如:“\#”。
3.在include前面可以有一些空字符,但是绝不能是[Tab] 键开始。include和<filename>
可以用一个或多个空格隔开。举个例子,你有这样几个Makefile :a.mk、b.mk、c.mk,
还有一个文件叫foo.make ,以及一个变量$(bar),其包含了 e.mk 和f.mk,那么,下面
的语句:
include foo.make *.mk $(bar)
等价于:
include foo.make a.mk b.mk c.mk e.mk f.mk
============================================
通配符的使用:
print:*.c # print 依赖所有的.c文件
lpr -p $? # $?列出比目标文件(print)更新的所有依赖文件,并由lpr命令提交给打印机
touch print # 更新print的时间戳,如果没有则建立print文件。
这样基本明白这几句的意思了,执行的结果就是打印当前目录下所有的在上一次打印之后被修改过的.c文件。
感谢各位的帮助。
vpath %.h ../headers
该语句表示,要求make 在“../headers ”目录下搜索所有以“.h”结尾的文件。(如果
某文件在当前目录没有找到的话)
==========================================
六、多目标19
不过好在我们的可以使用一个自动化变量“$@
七、静态模式
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
-----------------------------------------------
$<”表示所有的依赖目标集(也就是“foo.c bar.c”),“$@”表示目标集(也就是“foo.o bar.o”)。
也就是
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o
===================================================
$(filter %.o,$(files)) 表示调用Makefile 的filter 函数,过滤“$filter”集,
files = foo.elc bar.o lose.o
$(filter %.o,$(files)): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
$(filter %.elc,$(files)): %.elc: %.el
emacs -f batch-byte-compile $<
===================================================
八、自动生成依赖性
例如,如果我们执行下面的命令:
cc -M main.c
其输出是:
main.o : main.c defs.h
gcc -MM main.c 的输出则是:
-------------------------------------
=====================================23
%.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
===========================
你希望第二条命令得在 cd之后的基础
上运行,那么你就不能把这两条命令写在两行上,而应该把这两条命令写在一行上,用分号分隔
示例二:
exec:
cd /home/hchen; pwd
==========================
嵌套使用
如果你要传递变量到下级Makefile 中,那么你可以使用这样的声明:
export <variable ...>
如果你不想让某些变量传递到下级Makefile 中,那么你可以这样声明:
unexport <variable ...>
如果你要使用真实的“$ ”字符,那么你
需要用“$$”来表示。