自动化编译

在前面的标准编译安装中,第一步是./configure[30],它会根据Makefile.in生成Makefile文件,然后make根据Makefile自动编译软件

通常在一个源码包中,已经包含了configure脚本和Makefile文件,作为课外知识,我们大致了解一下怎么生成这两个文件

autoconf

autoconf用来生成configure脚本,它可以检查系统特性、编译环境、环境变量、软件参数、依赖关系等

autoconf需要用到 m4

  1. autoscan描源代码目录生成configure.scan文件
  2. configure.scan改名为configure.in
  3. aclocal根据configure.in文件的内容,自动生成aclocal.m4文件
  4. 使用autoconf,根据configure.inaclocal.m4来产生configure文件

automake

automake可以从Makefile.am文件自动生成Makefile.in,它主要用来配置源代码

automake需用到perl

  • 手工写Makefile.am
  • 使用automake,根据configure.inMakefile.am来产生Makefile.in

Makefile

使用configure脚本,配合Makefile.in可以生成Makefile文件,然后用make自动化的编译软件

这里有一张生成Makefile的流程图:

Makefile的用途不只是编译软件,还可以利用它完成一些琐碎的工作,只要最后输出一个文件,都可以用make来完成

这是一个最简单的Makefile

filelist1:2*3
4    ls -lF > filelist5  

1

输出的目标文件,不能省略。如果有多个文件,可以使用all

2

分隔符,不能省略

3

输入文件,可以省略

4

这一行必须以TAB字符起始,不能使用空格代替

5

make的命令

可以使用变量代替命令,便于维护

TARGET = filelist1
SOURCE =  *
ARG = -lF
APPLICATION = ls

$(TARGET):$(SOURCE)2
    $(APPLICATION) $(ARG) $(SOURCE) > $(TARGET)    

1

定义变量,传统上用大写

2

使用变量写Makefile

Makefile可以有多个目标文件,我们前面提到,gcc编译时先生成目标文件,再把目标文件链接成可执行文件,Makefile应该是这样的:

OBJECTS = main.o kbd.o command.o display.o \1
              insert.o search.o files.o utils.o

exe : $(OBJECTS)
            cc -o exe $(OBJECTS)

main.o : main.c defs.h 2
        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 :3
        rm exe $(OBJECTS)
    

1

如果写在多行,要用脱字符换行

2

如何生成中间文件

3

伪目标文件,make clean并不生成clean文件,而是清理编译结果

Makefile还有很多强大的机制,这里就不详细介绍了



[30] 执行当前目录下的configure脚本