本文教你如何使用autoconf、automake等来制作一个以源代码形式(.tar.gz)发布的软件、并可在执行configure时使用自定义参数。
流程如下,每步的作用也做了简要说明:
1. 源码根目录调用autoscan脚本,生成configure.scan文件,然后将此文件重命名为configure.ac,或者configure.in。其中,configure.ac是新的写法,configure.in是比较旧的写法。并修改configure.ac文件。
2. 修改【configure.ac】,利用autoconf提供的各种M4宏,配置项目需要的各种自动化探测项目,下面附上一个自己修改用的.ac文件:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([lgj],[0.1],[XXX@gmail.com])----此处修改为自己想要生成的文档和错误log发送邮件地址。请自己修改
AC_LANG([C])----增加
AM_INIT_AUTOMAKE([-Wall -Werror foreign])-----增加,后面有解释
AC_CONFIG_SRCDIR([src/main.cpp])----代码目录和主程序
AC_CONFIG_HEADERS([config.h])
# Libtool initialisation
AC_CONFIG_MACRO_DIR([m4])----增加,当输入aclocal命令时,输出.m4文件
LT_INIT
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
#AC_PROG_CXX
#AC_PROG_AWK
AC_CHECK_PROG([DOXYGEN], [doxygen], [true], [false])----增加
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_CONST
AC_C_INLINE
# Checks for library functions.
# Generate Makefiles----下面是设置在哪些目录自动生成Makefile文件,可在下面增加
AC_CONFIG_FILES([Makefile----在自己工程的根目录下面生成
src/Makefile----在代码文件夹src/目录下面生成
])
AC_OUTPUT
echo "Configured!"
3. 编写【自定义宏】,建议每个宏一个单独的*.m4文件;
4. 调用aclocal收集configure.ac中用到的各种非Autoconf的宏,包括自定义宏;
5. 调用autoheader,扫描configure.ac(configure.in)、acconfig.h(如果存在),生成config.h.in宏定义文件,里面主要是根据configure.ac中某些特定宏(如AC_DEFINE)生成的#define和#undefine宏,configure在将根据实际的探测结果决定这些宏是否定义(具体见后面例子)。
6. 按照automake规定的规则和项目的目录结构,编写一个或多个【Makefile.am】(Makefile.am数目和存放位置和源码目录结构相关),Makefile.am主要写的就是编译的目标及其源码组成。下面附上自己用的工程根目录的Makefile.am和子目录Makefile.am文件:
工程根目录Makefile.am文件内容:
EXTRA_DIST = COPYING NEWS INSTALL README
SUBDIRS = src
ACLOCAL_AMFLAGS = -I m4
AM_CXXFLAGS =
CLEANFILES = *~子目录Makefile.am文件内容:
AM_CPPFLAGS = \
-Wall \ ----打印警告
-O0 \ ----不优化
-fprofile-arcs -ftest-coverage
AM_LDFLAGS = -lgcov ----编译库进去
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = lgj----编译完成后生成的文件,直接在。 ./src目录下运行 ./lgj即可运行编译后的程序,前提编译通过,否则不产 ----生lgj文件,此处要与“configure.ac”文件中的定义一样。lgj_SOURCES = main.cpp name.cpp name.h\ ------此部分为当有多个子程序时,一一列举在此,编译时会自动调用要使用的子程序
ttimes.cpp ttimes.h\ ------注意使用tab键,否则会报错。yardstolb.cpp yardstolb.h ------最后一个子程序不用加“\”,可以一直加子程序。由于本人已经写了一些代码在 ------里面,所有这里是我自己的一部分代码。新手可以自己写一个测试程序hello.cpp
lgj_LDADD =
EXTRA_DIST =
CLEANFILES = *~ \#* Makefile Makefile.in *.gc* ----运行makeclean命令时,会自动删除与此处定义匹配的文件7. 调用automake,将每个Makefile.am转化成Makefile.in,同时生成满足GNU编码规范的一系列文件(带-a选项自动添加缺少的文件,但有几个仍需要自己添加,在执行automake前需执行touch NEWS README AUTHORS ChangeLog)。如果configure.ac配置了使用libtool(定义了AC_PROG_LIBTOOL宏(老版本)或LT_INIT宏),需要在此步骤前先在项目根目录执行libtoolize --automake --copy --force,以生成ltmain.sh,供automake和config.status调用。
8. 调用autoconf,利用M4解析configure.ac,生成shell脚本configure。以上几步完成后,开发者的工作就算完成了,后面的定制就由开源软件的用户根据需要给configure输入不同的参数来完成。
9. 用户调用configure,生成Makefile,然后make && make install。
说穿了就是在工程目录下运行一系列命令,创建和修改几个文件,就可以生成符合该平台的Makefile文件。
具体使用的时候,首先我们进入 project 目录:
在project下面新建src目录:mkdir src
切换到src目录下面 :cd src
自己写一些代码:main.cpp,写好后保存。
切换到project目录:cd ..
1) 运行autoscan命令
2) 将configure.scan 文件重命名为configure.ac或者configure.in,并修改configure.ac文件(参考上面写的修改说明)
3) 在project目录下新建Makefile.am文件,并在各个子目录下也新建makefile.am文件(参考上面写的修改说明)
4) 运行aclocal命令
5) 执行autoheader
6) automake --add-missing
7) libtoolize --automake --copy --debug --force
8) 运行automake命令
9) 运行autoconf命令
10) 运行./confiugre脚本
可以通过图看出产生Makefile的流程,如图所示: