-d Debug模式,输出有关文件和检测时间的详细信息 。
Linux下make标志位的常用选项与Unix系统中稍有不同,下面我们只列出了不同部分:
-c dir 在读取 makefile 之前改变到指定的目录dir 。
-I dir 当包含其他 makefile文件时,利用该选项指定搜索目录 。
-h help文挡,显示所有的make选项 。
-w 在处理 makefile 之前和之后,都显示工作目录 。
通过命令行参数中的target,可指定make要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译target选项中指定的目标文件 。如果命令行中没有指定目标,则系统默认target指向描述文件中第一个目标文件 。
通常,makefile 中还定义有 clean 目标,可用来清除编译过程中的中间文件,例如:
clean:
rm -f *.o
运行 make clean 时,将执行 rm -f *.o 命令,最终删除所有编译过程中产生的所有中间文件 。
隐含规则
在make 工具中包含有一些内置的或隐含的规则,这些规则定义了如何从不同的依赖文件建立特定类型的目标 。Unix系统通常支持一种基于文件扩展名即文件名后缀的隐含规则 。这种后缀规则定义了如何将一个具有特定文件名后缀的文件(例如.c文件),转换成为具有另一种文件名后缀的文件(例如.o文件):
.c:.o
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
系统中默认的常用文件扩展名及其含义为:
.o目标文件
.cC源文件
.fFORTRAN源文件
.s汇编源文件
.yYacc-C源语法
.lLex源语法
在早期的Unix系统系统中还支持Yacc-C源语法和Lex源语法 。在编译过程中,系统会首先在makefile文件中寻找与目标文件相关的.C文件,如果还有与之相依赖的.y和.l文件,则首先将其转换为.c文件后再编译生成相应的.o文件;如果没有与目标相关的.c文件而只有相关的.y文件,则系统将直接编译.y文件 。
而GNU make 除了支持后缀规则外还支持另一种类型的隐含规则--模式规则 。这种规则更加通用,因为可以利用模式规则定义更加复杂的依赖性规则 。模式规则看起来非常类似于正则规则,但在目标名称的前面多了一个 % 号,同时可用来定义目标和依赖文件之间的关系,例如下面的模式规则定义了如何将任意一个 file.c 文件转换为 file.o 文件:
%.c:%.o
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
#EXAMPLE#
下面将给出一个较为全面的示例来对makefile文件和make命令的执行进行进一步的说明,其中make命令不仅涉及到了C源文件还包括了Yacc语法 。本例选自"Unix Programmer"s Manual 7th Edition, Volume 2A" Page 283-284
下面是描述文件的具体内容:
#Description file for the Make command
#Send to print
P=und -3 | opr -r2
#The source files that are needed by object files
FILES= Makefile version.c defs main.c donamc.c misc.c file.c
dosys.c gram.y lex.c gcos.c
#The definitions of object files
OBJECTS= vesion.o main.o donamc.o misc.o file.o dosys.o gram.o
LIBES= -LS
LINT= lnit -p
CFLAGS= -O
make: $(OBJECTS)
cc $(CFLAGS) $(OBJECTS) $(LIBES) -o make
size make
$(OBJECTS): defs
gram.o: lex.c
cleanup:
-rm *.o gram.c
install:
@size make /usr/bin/make
cp make /usr/bin/make ; rm make
#print recently changed files
print: $(FILES)
pr $? | $P
touch print
test:
make -dp | grep -v TIME>1zap
/usr/bin/make -dp | grep -v TIME>2zap
diff 1zap 2zap
rm 1zap 2zap
lint: dosys.c donamc.c file.c main.c misc.c version.c gram.c
$(LINT) dosys.c donamc.c file.c main.c misc.c version.c
gram.c
rm gram.c
arch:
ar uv /sys/source/s2/make.a $(FILES)
通常在描述文件中应象上面一样定义要求输出将要执行的命令 。在执行了make命令之后,输出结果为:
推荐阅读
- Linux中轻松使用USB移动存储器
- 如何编写Linux设备驱动程序
- Linux内核模块和驱动的编写
- Linux上安装GCC编译器过程
- 在Linux操作系统上运行Windows应用程序
- 编写Linux实用程序的艺术
- 安装显卡好简单
- lilo/grub linux忘记了密码怎么办
- vmware 配置实例-linux host + windows guest + fire
- Linux 内核的类型