自动化编译
在前面的标准编译安装中,第一步是./configure
[30],它会根据Makefile.in
生成Makefile
文件,然后make根据Makefile
自动编译软件
通常在一个源码包中,已经包含了configure
脚本和Makefile
文件,作为课外知识,我们大致了解一下怎么生成这两个文件
autoconf
autoconf用来生成configure
脚本,它可以检查系统特性、编译环境、环境变量、软件参数、依赖关系等
autoconf需要用到 m4
- 用autoscan描源代码目录生成
configure.scan
文件 - 将
configure.scan
改名为configure.in
- 用aclocal根据
configure.in
文件的内容,自动生成aclocal.m4
文件 - 使用autoconf,根据
configure.in
和aclocal.m4
来产生configure
文件
automake
automake可以从Makefile.am
文件自动生成Makefile.in
,它主要用来配置源代码
automake需用到perl
- 手工写
Makefile.am
- 使用
automake
,根据configure.in
和Makefile.am
来产生Makefile.in
Makefile
使用configure
脚本,配合Makefile.in
可以生成Makefile
文件,然后用make自动化的编译软件
这里有一张生成Makefile
的流程图:
Makefile
的用途不只是编译软件,还可以利用它完成一些琐碎的工作,只要最后输出一个文件,都可以用make来完成
这是一个最简单的Makefile
filelist:*
ls -lF > filelist
输出的目标文件,不能省略。如果有多个文件,可以使用all | |
分隔符,不能省略 | |
输入文件,可以省略 | |
这一行必须以TAB 字符起始,不能使用空格代替 | |
make的命令 |
可以使用变量代替命令,便于维护
TARGET = filelist
SOURCE = *
ARG = -lF
APPLICATION = ls
$(TARGET):$(SOURCE)
$(APPLICATION) $(ARG) $(SOURCE) > $(TARGET)
定义变量,传统上用大写 | |
使用变量写Makefile |
Makefile
可以有多个目标文件,我们前面提到,gcc编译时先生成目标文件,再把目标文件链接成可执行文件,Makefile应该是这样的:
- OBJECTS = main.o kbd.o command.o display.o \
- insert.o search.o files.o utils.o
exe
: $(OBJECTS)- cc -o
exe
$(OBJECTS)- 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
exe
$(OBJECTS)
如果写在多行,要用脱字符换行 | |
如何生成中间文件 | |
伪目标文件,make clean 并不生成clean 文件,而是清理编译结果 |
Makefile
还有很多强大的机制,这里就不详细介绍了
[30] 执行当前目录下的configure
脚本