自动化编译
优质
小牛编辑
144浏览
2023-12-01
在前面的标准编译安装中,第一步是./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.oexe
: $(OBJECTS) cc -oexe
$(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 : rmexe
$(OBJECTS)
如果写在多行,要用脱字符换行 | |
如何生成中间文件 | |
伪目标文件,make clean 并不生成clean 文件,而是清理编译结果 |
Makefile
还有很多强大的机制,这里就不详细介绍了
[30] 执行当前目录下的configure
脚本