LZ没学过makefile的写法,只知道使用tab。于是乎发现了autotools系列工具
基本流程是:autoscan、aclocal、autoconf、autoheader、automake、configure
(1) 使用autoscan命令自动生成configure.scan文件(configure.in原型)
muye@bupt:~/FFTC/FFTC$ cd test/ muye@bupt:~/FFTC/FFTC/test$ ls Complex_Array.cpp Complex.cpp config.h FFT.h Complex_Array.h Complex.h FFT.cpp main.cpp muye@bupt:~/FFTC/FFTC/test$ autoscan muye@bupt:~/FFTC/FFTC/test$ ls autoscan.log Complex_Array.h Complex.h configure.scan FFT.h Complex_Array.cpp Complex.cpp config.h FFT.cpp main.cpp muye@bupt:~/FFTC/FFTC/test$
(2)将configure.scan重命名为configure.in, 并做适当修改
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.68]) #AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_INIT(FFT, 1.0) AC_INIT_AUTOMAKE(FFT, 1.0) AC_CONFIG_SRCDIR([main.cpp]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CXX AC_PROG_CC # Checks for libraries. # Checks for header files. AC_CHECK_HEADERS([stdlib.h]) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_SIZE_T # Checks for library functions. AC_FUNC_MALLOC AC_CHECK_FUNCS([clock_gettime pow]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT
说明:
- 以"#"号开始的行为注释
- AC_PREREQ宏声明本文要求的autoconf版本, 如本例中的版本 2.65
- AC_INIT宏用来定义软件的名称和版本等信息, 在本例中省略了BUG-REPROT-ADDRESS, 一般为作者的E-mail
- AM_INIT_AUTOMAKE是手动添加的, 它是automake所必备的宏, 也同前面一样, PACKAGE是所要产生软件套件的名称,VERSION是版本编号.
- AC_CONFIG_SCRDIR宏用来侦测所指定的源码文件是否存在, 来确定源码目录的有效性. 在此处指当前目录下hello.c
- AC_CONFIG_FILES宏用于生成相应的Makefile文件.
(3) 运行aclocal命令,生成"aclocal.m4"文件
(4) 运行autoconf命令生成configure可执行文件
(5) 运行autoheader命令, 生成config.h.in文件
(6) 新建Makefile.am,内容如下:
AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=fft hello_SOURCES=fft.cpp Complex_Array.h FFT.h Complex.cpp main.cpp Complex_Array.cpp Complex.h FFT.cpp
说明:
- 其中的AUTOMAKE_OPTIONS为设置automake的选项. 由于GNU对自己发布的软件有严格的规范, 比如必须附带许可证声明文件COPYING等, 否则automake执行时会报错. automake提供了3中软件等级:foreign, gnu和gnits, 供用户选择. 默认级别是gnu. 在本例中, 使用了foreign等级, 它只检测必须的文件.
- bin_PROGRAMS定义要产生的执行文件名. 如果要产生多个执行文件, 每个文件名用空格隔开
- hello_SOURCES 定义"hello"这个可执行程序所需的原始文件. 如果"hello"这个程序是由多个源文件所产生的, 则必须把它所用到的所有源文件都列出来, 并用空格隔开. 如果要定义多个可执行程序, 那么需要对每个可执行程序建立对应的file_SOURCES.
(7) 运行automake命令, 生成Makefile.in文件
automake --add-missing
(8)运行configure, 生成Makfefile文件