1.Makefile的基本构成
目标文件列表 分隔符 依赖文件列表 [:命令]
[命令]
[命令]
提示:书上说[命令]之前的空格是制表符,而且是必须的
main:main.o module1.o module2.o
gcc main.o module1.o module2.o -o main
main.o:main.c head1.h head2.h
gcc -c main.c
module1.o:module1.c head1.c
gcc -c module1.c
module2.o:module2.c head2.c
gcc -c module2.c
可以不把依赖文件取名为makefile,假如取名othername
make -f othername
make –file=othername
makefile文件的简写
main:mian.o module1.o module2.o
gcc main.o module1.o module2.o -o main
main.o:head1.h head2.h common_head.h
module1.o:head1.h
module2.o:head2.h
依赖类型
foo:foo.c |somelib
gcc -o foo.c somelib
‘|’之前的文件过时,foo文件将重构,’|’文件之后的文件过时将不重构
命令行属性
- 遇到错误,继续执行,不退出make
+ 本命令始终执行(前提是本命令所在规则的目标文件已经过时)
@ 不打印执行命令的内容
file.o:file.c head1.c head2.c
-mv file.o /tmp
gcc -c file.c
特殊目标
伪命令
.PHONY :clean
clean:
-rm -f *.o
.IGNORE
类似于 -
忽略错误继续执行
.SUFFIXES
该目标的依赖被认为是一个后缀列表
.SILENT
相当于 @
如果.SILENT后面没有依赖文件.则Makefile中的所有命令都不会打印
.PRECIOUS
遇到特殊情况,与他有关的文件不会被删除
.INTERMEDIATE
其依赖文件被当成被当成中间文件对待
搜索目录
VPATH = /usr/src:/lib/include/….
(1)
VPATH pattern directories
为符合pattern的文件指定搜索目录directories
(2)
VPATH pattern
清除符合pattern的文件的搜索目录
(3)
VPATH
清除所有的以被设置的文件搜索目录
例子:
“%” :意思是%匹配零或若干的字符
vpath %.h ../headers
vpath %.c src1
vpath src2
vpath %.c src3
以.c结尾的文件现在src1目录中找,然后是src2,最后是src3
vpath %.h headers:src
vpath % usr
以.h结尾的文件先是在headers,然后是src,最后是usr
使用变量
引用变量
$(foo)
定义变量
(1)递归展开变量
foo = $(bar)
bar = $(ugh)
ugh = Huh
all:
echo $(foo)
(2)立即展开变量,,,在使用之前必须已经存在
x := foo
y := $(x) bar
x := later
(3)条件赋值符…这个变量之前没有赋值过,才能赋值
FOO ?= bar
(4)追加赋值
objects = main.o foo.o bar.o utils.o
objects += another.o
预定义变量
|宏名|初始值|说明|
|…………….|:………….:|………………………………………:|
| CC | cc | 默认使用的编译器|
| CFLAGS | -o | 编译器使用的选项|
| MAKE | make | make命令 |
|MAKEFLAGS |空|make命令的选项|
|SHELL| | 默认使用的Shell类型选项|
|PWD| | 运行make命令时的当前目录|
|AR| ar | 库管理命令|
|ARFLADS| -ruv |库管理命令选项|
|LIBSUFFIXE| .a |库的后缀|
|A| a |库的扩展后缀|
默认变量…..(跟perl有点像)
$@:表示一个规则中的目标文件名…多目标规则
$%:当规则的文件是一个静态库文件时$%代表静态库的一个成员变量
$<:规则中第一个依赖文件名
$>:表示库名
$?:所有比目标文件新的依赖文件列表
$^:规则的所有文件列表,取出重复的
$+:类似$^,但是保留重复的
$*:目标文件去除后缀后的名称
隐含规则
与C语言有关的扩展名
.c
.h
.o
使用条件语句
libs_for_gcc = -gnu
normal_libs =
ifeq($(CC),gcc)
libs=$(libs_for_gcc)
else
libs=$(normal_libs)
endif
foo:foo.c
$(CC) -o foo foo.c $()
还有关键字
ifdef- - - - - - - - - - - - - - - - - - - - ifndef
使用库
库名(成员名)
mylib.a(file.o)
.a是静态库
.so是动态文件库
将file.o文件放入mylib中
mylib:mylib(file.o)
gcc -c file.c
ar -ruv mylib file.c
rm -f file.o
make的命令行参数
用的时候man make自己查