简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 1 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
Unix/Linux Programming
第第第十十十讲讲讲: 高高高级级级编编编程程程工工工具具具2
Donggang Cao
caodg@sei.pku.edu.cn
http://www.sei.pku.edu.cn/˜caodg/course/unix
May 15, 2007
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 2 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
1 简简简介介介
学学学习习习本本本节节节课课课之之之后后后, 你你你将将将
•深深深入入入了了了解解解GNU make
•知知知道道道有有有哪哪哪些些些工工工具具具可可可以以以辅辅辅助助助生生生成成成Makefile
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 3 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
2 深深深入入入make
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 4 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
makefile和和和源源源文文文件件件不不不在在在一一一个个个目目目录录录下下下
include
src
makefile
counter.h
lexer.h
counter.c
lexer.l
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 5 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
VPATH和和和vpath
1 VPATH = src include
2 CPPFLAGS = -I include
3
4 count_words: counter.o lexer.o -lfl
5 count_words.o: counter.h
6 counter.o: counter.h lexer.h
7 lexer.o: lexer.h
也也也可可可以以以使使使用用用命命命令令令:
vpath %.c src
vpath %.h include
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 6 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
内内内置置置的的的模模模式式式规规规则则则— 1
从从从.c生生生成成成.o文文文件件件
%.o:%.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
从从从.l生生生成成成.c文文文件件件
%.c:%.l
@$(RM) $@
$(LEX.l) $< > $@
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 7 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
内内内置置置的的的模模模式式式规规规则则则— 2
从从从.c生生生成成成可可可执执执行行行文文文件件件
%:%.c
$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 8 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
静静静态态态模模模式式式规规规则则则
静静静态态态模模模式式式规规规则则则, 是是是指指指仅仅仅应应应用用用于于于明明明确确确给给给出出出了了了目目目标标标列列列
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
表表
的的的那那那些些些规规规则则则
$(OBJECTS):%.o:%.c
$(CC) -c $(CFLAGS) $< -o $@
应应应当当当尽尽尽可可可能能能使使使用用用静静静态态态模模模式式式规规规则则则, 明明明确确确写写写出出出目目目标标标之之之间间间
的的的依依依赖赖赖关关关系系系
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 9 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
后后后缀缀缀规规规则则则
后后后缀缀缀规规规则则则是是是定定定义义义隐隐隐式式式规规规则则则的的的初初初始始始方方方式式式.
.c.o:
$(COMPILE.c) $(OUTPUT_OPTION) $<
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 9 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
后后后缀缀缀规规规则则则
后后后缀缀缀规规规则则则是是是定定定义义义隐隐隐式式式规规规则则则的的的初初初始始始方方方式式式.
.c.o:
$(COMPILE.c) $(OUTPUT_OPTION) $<
等等等价价价于于于:
%.o:%.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 10 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
单单单后后后缀缀缀规规规则则则
单单单后后后缀缀缀规规规则则则常常常用用用于于于生生生成成成可可可执执执行行行文文文件件件
.p:
$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 11 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
内内内置置置规规规则则则的的的结结结构构构
%.o: %.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
变变变量量量:
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) \
$(TARGET_ARCH) -c
CC = gcc
OUTPUT_OPTION = -o $@
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 12 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
自自自动动动生生生成成成依依依赖赖赖
问问问题题题: C语语语言言言源源源文文文件件件依依依赖赖赖头头头文文文件件件, 头头头文文文件件件之之之间间间也也也有有有依依依
赖赖赖, 能能能否否否自自自动动动生生生成成成并并并管管管理理理这这这种种种依依依赖赖赖?
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 12 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
自自自动动动生生生成成成依依依赖赖赖
问问问题题题: C语语语言言言源源源文文文件件件依依依赖赖赖头头头文文文件件件, 头头头文文文件件件之之之间间间也也也有有有依依依
赖赖赖, 能能能否否否自自自动动动生生生成成成并并并管管管理理理这这这种种种依依依赖赖赖?
方方方法法法: 利利利用用用gcc的的的编编编译译译选选选项项项gcc -M
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 13 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
gcc编编编译译译开开开关关关
~ $ echo "#include
" > stdio.c
~ $ gcc -M stdio.c
stdio.o: stdio.c /usr/include/stdio.h /usr/include/_ansi.h \
/usr/include/newlib.h /usr/include/sys/config.h \
/usr/include/machine/ieeefp.h /usr/include/cygwin/config.h \
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/stddef.h \
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/stdarg.h \
/usr/include/sys/reent.h /usr/include/_ansi.h /usr/include/sys/_types.h \
/usr/include/sys/lock.h /usr/include/sys/types.h \
/usr/include/machine/_types.h /usr/include/machine/types.h \
/usr/include/sys/features.h /usr/include/cygwin/types.h \
/usr/include/sys/sysmacros.h /usr/include/stdint.h \
/usr/include/endian.h /usr/include/sys/stdio.h /usr/include/sys/cdefs.h
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 14 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
方方方法法法
•为为为每每每个个个源源源文文文件件件(filename.c)生生生成成成一一一个个个依依依赖赖赖文文文件件件,
如如如filename.d
•该该该filename.d里里里面面面保保保存存存了了了filename.c和和和filename.d对对对头头头
文文文件件件的的的依依依赖赖赖, 如如如:
counter.o counter.d : src/counter.c \
include/counter.h include/lexer.h
•用用用 包包包 含含含 命命命 令令令(include)将将将 所所所 有有有filename.d包包包 含含含
在在在makefile中中中
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 15 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
生生生成成成filename.d
1 include $(subst .c,.d,$(SOURCES))
2
3 %.d: %.c
4 $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
5 sed ’s/\($*\)\.o[ :]*/\1.o $@ : /g’ < $@.$$$$ > $@; \
6 rm -f $@.$$$$
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 16 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
make变变变量量量
• make实实实际际际上上上包包包含含含两两两种种种语语语言言言: 描描描述述述依依依赖赖赖关关关系系系的的的语语语言言言,
以以以及及及进进进行行行文文文本本本替替替换换换的的的宏宏宏语语语言言言
•变变变量量量名名名字字字几几几乎乎乎可可可以以以是是是任任任何何何字字字符符符, 除除除了了了: # =
•变变变量量量大大大小小小写写写敏敏敏感感感
•变变变量量量可可可以以以通通通过过过${CC}或或或者者者$(CC)访访访问问问
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 17 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
make变变变量量量
•通通通常常常如如如果果果用用用户户户希希希望望望通通通过过过命命命令令令行行行或或或环环环境境境变变变量量量改改改变变变某某某
变变变量量量的的的值值值, 则则则这这这样样样的的的常常常量量量名名名字字字全全全部部部大大大写写写, 单单单词词词之之之间间间
通通通过过过下下下划划划线线线分分分割割割分分分隔隔隔
•全全全部部部小小小写写写的的的变变变量量量只只只用用用于于于makefile文文文件件件内内内部部部
•通通通常常常用用用变变变量量量引引引用用用外外外部部部程程程序序序名名名
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 18 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
变变变量量量类类类型型型
•简简简单单单扩扩扩展展展, 通通通过过过“:=”赋赋赋值值值. 赋赋赋值值值语语语句句句被被被make读读读到到到的的的
时时时候候候, 即即即对对对赋赋赋值值值符符符右右右侧侧侧进进进行行行扩扩扩展展展
MAKE_DEPEND := $(CC) -M
如如如果果果CC没没没有有有定定定义义义, 则则则赋赋赋值值值的的的结结结果果果为为为: -M
•递递递归归归扩扩扩展展展, 通通通过过过“=”赋赋赋值值值. 只只只有有有当当当变变变量量量被被被make用用用到到到
的的的时时时候候候, 才才才对对对赋赋赋值值值符符符右右右侧侧侧进进进行行行扩扩扩展展展
MAKE_DEPEND = $(CC) -M
CC 的的的定定定义义义可可可以以以在在在MAKE_DEPEND的的的后后后面面面
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 19 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
宏宏宏
1 define create-jar
2 @echo Creating $@...
3 $(RM) $(TMP_JAR_DIR)
4 $(MKDIR) $(TMP_JAR_DIR)
5 $(CP) -r $^ $(TMP_JAR_DIR)
6 cd $(TMP_JAR_DIR) && $(JAR) $(JARFLAGS) $@ .
7 $(JAR) -ufm $@ $(MANIFEST)
8 $(RM) $(TMP_JAR_DIR)
9 endef
10
11 $(UI_JAR): $(UI_CLASSES)
12 $(create-jar)
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 20 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
函函函数数数
GNU make 支支支持持持函函函数数数
•函函函数数数的的的定定定义义义和和和宏宏宏的的的定定定义义义类类类似似似
•函函函数数数的的的调调调用用用和和和变变变量量量的的的引引引用用用类类类似似似, 只只只是是是要要要加加加上上上逗逗逗号号号
分分分隔隔隔的的的参参参数数数列列列表表表
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 21 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
用用用户户户自自自定定定义义义函函函数数数
1 AWK := awk
2 KILL := kill
3
4 # $(kill-acroread)
5 define kill-acroread
6 @ ps -W | \
7 $(AWK) ’BEGIN { FIELDWIDTHS = "9 47 100" } \
8 /AcroRd32/ { \
9 print "Killing " $$3; \
10 system( "$(KILL) -f " $$1 ) \
11 }’
12 endef
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 22 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
用用用户户户自自自定定定义义义函函函数数数
1 AWK := awk
2 KILL := kill
3 PS_FIELDS := "9 47 100"
4
5 # $(call kill-program, awk-pattern)
6 define kill-program
7 @ ps -W | \
8 $(AWK) ’BEGIN { FIELDWIDTHS = $(PS_FIELDS) } \
9 /$1/ { \
10 print "Killing " $$3; \
11 system( "$(KILL) -f " $$1 ) \
12 }’
13 endef
调调调用用用: $(call kill-program, "AcroRd32")
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 23 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
内内内置置置函函函数数数
GNU make有有有若若若干干干内内内置置置函函函数数数, 用用用于于于对对对变变变量量量进进进行行行操操操作作作. 函函函
数数数使使使用用用语语语法法法: $(function-name arg1[, argn])
•字字字符符符串串串操操操作作作函函函数数数
•文文文件件件名名名操操操作作作函函函数数数
•流流流程程程控控控制制制函函函数数数
•用用用户户户自自自定定定义义义函函函数数数
•其其其它它它函函函数数数
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 24 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
字字字符符符串串串函函函数数数
$(filter pattern...,text) , text: 空空空格格格分分分隔隔隔的的的单单单
词词词串串串, 返返返回回回完完完整整整匹匹匹配配配的的的单单单词词词. 例例例:
words := he the hen other the%
get-the:
@echo %he matches : $(filter %he,$(words))
$(subst search-string,replace-string,text) ,
将将将text中中中的的的search-string替替替换换换为为为replace-string. 例例例:
sources := count_words.c counter.c lexer.c
objects := $(subst .c,.o,$(sources))
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 25 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
命命命令令令
•目目目标标标之之之后后后以以以制制制表表表键键键TAB开开开头头头的的的行行行为为为命命命令令令
•命命命令令令本本本质质质上上上是是是一一一个个个一一一行行行的的的shell脚脚脚本本本
• makefile中中中的的的命命命令令令在在在子子子shell中中中执执执行行行
•命命命 令令令 执执执 行行行 的的的shell缺缺缺 省省省 是是是/bin/sh, 由由由make 的的的 变变变
量量量SHELL控控控制制制
• make命命命令令令执执执行行行时时时继继继承承承父父父shell的的的除除除SHELL外外外的的的所所所有有有
变变变量量量
•需需需要要要由由由shell扩扩扩展展展的的的参参参数数数应应应该该该用用用$$n的的的形形形式式式
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 26 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
命命命令令令解解解析析析
make看看看到到到一一一个个个合合合法法法命命命令令令之之之后后后, 即即即转转转入入入命命命令令令解解解析析析模模模式式式,
建建建立立立一一一个个个一一一行行行脚脚脚本本本
•以以以制制制表表表键键键缩缩缩进进进的的的行行行被被被认认认为为为是是是命命命令令令行行行
•空空空行行行被被被忽忽忽略略略
•以以以#开开开始始始的的的行行行(之之之前前前可可可能能能有有有空空空格格格, 但但但没没没有有有制制制表表表键键键)被被被
认认认为为为是是是makefile注注注释释释, 被被被忽忽忽略略略
•条条条件件件处处处理理理指指指令令令, 如如如ifdef 和和和ifeq在在在命命命令令令脚脚脚本本本中中中处处处理理理
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 27 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
注注注释释释
• makefile注注注释释释: 不不不在在在命命命令令令中中中的的的以以以#开开开头头头(前前前面面面可可可有有有空空空
格格格)的的的行行行, 被被被make忽忽忽略略略处处处理理理
• shell注注注释释释: 在在在命命命令令令中中中, 以以以制制制表表表符符符加加加#开开开头头头的的的行行行,
make要要要对对对其其其进进进行行行扩扩扩展展展, 然然然后后后交交交给给给shell处处处理理理; 每每每个个个
注注注释释释都都都会会会启启启动动动一一一个个个子子子shell
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 28 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
注注注释释释示示示例例例
1 #this is make comment $(PWD)
2 print-pwd:
3 #
4 # this is shell comment
5 # PWD = $(PWD)
6 # $(findstring /e/home/Make,$(PWD))
7 #
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 29 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
长长长命命命令令令
由由由于于于每每每个个个命命命令令令在在在单单单独独独的的的一一一个个个子子子shell中中中执执执行行行, 如如如果果果若若若干干干
命命命令令令要要要在在在一一一起起起执执执行行行, 则则则需需需要要要特特特别别别对对对待待待—用用用反反反斜斜斜杠杠杠\将将将
连连连接接接各各各行行行.
例例例: 错错错误误误的的的写写写法法法
filie_list:
for f in logic ui
do
echo $f/*.java
done > $@
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 29 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
长长长命命命令令令
由由由于于于每每每个个个命命命令令令在在在单单单独独独的的的一一一个个个子子子shell中中中执执执行行行, 如如如果果果若若若干干干
命命命令令令要要要在在在一一一起起起执执执行行行, 则则则需需需要要要特特特别别别对对对待待待—用用用反反反斜斜斜杠杠杠\将将将
连连连接接接各各各行行行.
例例例: 错错错误误误的的的写写写法法法
filie_list:
for f in logic ui
do
echo $f/*.java
done > $@
正正正确确确的的的写写写法法法
filie_list:
for f in logic ui; \
do \
echo $$f/*.java; \
done > $@
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 30 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
3 Makefile自自自动动动生生生成成成
为为为什什什么么么要要要自自自动动动生生生成成成Makefile
•可可可移移移植植植性性性: 适适适应应应不不不同同同硬硬硬件件件平平平台台台和和和Unix系系系统统统
–机机机器器器字字字大大大小小小、、、工工工具具具、、、语语语言言言、、、服服服务务务器器器、、、设设设置置置等等等
∗例例例如如如, bcopy与与与memcpy
•派派派生生生依依依赖赖赖性性性: C语语语言言言源源源文文文件件件之之之间间间的的的依依依赖赖赖关关关系系系
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 31 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
几几几种种种主主主要要要生生生成成成工工工具具具
• makedepend
• Imake
• autoconf
• automake
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 32 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
makedepend
•随随随X Window系系系统统统发发发布布布
•在在在解解解决决决源源源码码码依依依赖赖赖方方方面面面最最最快快快, 最最最有有有效效效
•只只只对对对C项项项目目目, 分分分析析析C源源源文文文件件件的的的#include等等等宏宏宏指指指令令令
•将将将依依依赖赖赖关关关系系系生生生成成成到到到Makefile中中中
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 33 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
makedepend示示示例例例
通通通 常常常 将将将makedepend作作作 为为为Makefile的的的 一一一 个个个 目目目 标标标 通通通
过过过make调调调用用用
1 SRCS = Main.c Print.c
2
3 all: print
4 print: Main.o Print.o
5 gcc -o $@ $^
6
7 depend:
8 makedepend ${SRCS}
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 34 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
makedepend更更更新新新后后后的的的Makefile
1 SRCS = Main.c Print.c
2
3 all: print
4 print: Main.o Print.o
5 gcc -o $@ $^
6
7 depend:
8 makedepend $(SRCS)
9 # DO NOT DELETE
10
11 Main.o: Print.h
12 Print.o: /usr/include/stdio.h /usr/include/features.h
13 Print.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
14 Print.o: /usr/lib/gcc-lib/i486-linux/3.3.5/include/stddef.h
15 Print.o: /usr/include/bits/types.h /usr/include/bits/wordsize.h
16 Print.o: /usr/include/bits/typesizes.h /usr/include/libio.h
17 Print.o: /usr/include/_G_config.h /usr/include/wchar.h
18 Print.o: /usr/include/bits/wchar.h /usr/include/gconv.h
19 Print.o: /usr/lib/gcc-lib/i486-linux/3.3.5/include/stdarg.h
20 Print.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
21 Print.o: Print.h
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 35 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
autoconf
GNU项项项目目目发发发布布布约约约定定定
•编编编译译译过过过程程程分分分两两两个个个步步步骤骤骤: 产产产生生生编编编译译译配配配置置置、、、编编编译译译
•项项项目目目根根根目目目录录录下下下有有有一一一个个个configure脚脚脚本本本, 用用用于于于生生生
成成成Makefile
• configure读读读取取取Makefile.in文文文件件件, 生生生成成成Makefile及及及其其其他他他可可可
能能能辅辅辅助助助的的的文文文件件件
•调调调用用用标标
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
准准的的的make进进进行行行编编编译译译
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 36 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
autoconf支支支持持持的的的项项项目目目目目目录录录结结结构构构
• flat: 所所所有有有文文文件件件都都都位位位于于于同同同一一一个个个目目目录录录中中中, 且且且没没没有有有子子子目目目
录录录
–最最最简简简单单单
• shallow: 源源源代代代码码码都都都储储储存存存在在在顶顶顶层层层目目目录录录,,,其其其他他他各各各个个个部部部
分分分则则则储储储存存存在在在子子子目目目录录录中中中
• deep: 所所所有有有源源源代代代码码码都都都被被被储储储存存存在在在子子子目目目录录录中中中;;;顶顶顶层层层目目目
录录录主主主要要要包包包含含含配配配置置置信信信息息息
–最最最复复复杂杂杂
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 37 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
autoconf工工工作作作流流流程程程— 1
autoconf最最最 核核核 心心心 的的的 文文文 件件件 是是是configure.in文文文 件件件
和和和Makefile.in文文文件件件. 程程程序序序员员员可可可以以以直直直接接接手手手工工工创创创建建建, 也也也
可可可以以以通通通过过过工工工具具具自自自动动动生生生成成成这这这两两两个个个文文文件件件的的的原原原型型型
•建建建立立立configure.in文文文件件件
1.运运运行行行autoscan, 生生生成成成configure.scan文文文件件件
2.将将将configure.scan 文文文件件件重重重命命命名名名为为为configure.in,,,并并并修修修
改改改configure.in文文文件件件
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 38 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
autoconf工工工作作作流流流程程程— 2
•建建建立立立Makefile.in文文文件件件
1.建建建立立立Makefile.am文文文件件件
2.运运运行行行automake, 生生生成成成Makefile.in
•生生生成成成configure文文文件件件
1.运运运行行行aclocal生生生成成成aclocal.m4
2.运运运行行行autoconf生生生成成成configure
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 39 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
autoconf工工工作作作流流流程程程图图图
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 40 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
示示示例例例
一一一个个个简简简单单单示示示例例例, 项项项目目目只只只包包包含含含helloworld.c文文文件件件
1 int main(int argc, char ** argv)
2 {
3 printf("Hello, Hello world!\n") ;
4 return 0 ;
5 }
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 41 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
示示示例例例: configure.in
1 # -*- Autoconf -*-
2 # Process this file with autoconf to produce a configure script.
3
4 AC_PREREQ(2.59)
5 AC_INIT(helloworld, 0.1, caodg@sei.pku.edu.cn)
6 AC_CONFIG_SRCDIR([helloworld.c])
7
8 # Checks for programs.
9 AC_PROG_CC
10
11 # Checks for libraries.
12 # Checks for header files.
13 # Checks for typedefs, structures, and compiler characteristics.
14 # Checks for library functions.
15
16 AC_OUTPUT(Makefile)
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 42 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
示示示例例例: Makefile.am
1 AUTOMAKE_OPTIONS=foreign
2 bin_PROGRAMS=helloworld
3 helloworld_SOURCES=helloworld.c
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 43 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
4 课课课程程程小小小结结结
• make的的的深深深入入入使使使用用用
• autoconf基基基本本本原原原理理理
简简简介介介
深深深入入入make
Makefile自自自动动动生生生成成成
课课课程程程小小小结结结
课课课程程程主主主页页页
标标标 题题题 页页页
J I
第第第 44 页页页共共共 44 页页页
全全全屏屏屏显显显示示示
退退退 出出出
下下下次次次课课课再再再见见见!
¼ò½é
ÉîÈëmake
Makefile×Ô¶¯Éú³É
¿Î³ÌС½á