利用autotools自动生成项目的Makefile

Linux下的软件,大多要不是各个发行版打好包的,要不是源代码下来后,

1
./configure && make && make install

  三步曲来完成安装的。对于一个工程,简单的话可以手写Makefile,但是随着项目不断的增长,需要跟踪的文件越来越多的时候,手动维护Makefile会比较的麻烦;同时随着各个发行版和平台的差异性的处理也很尽善尽美;(当然我主要是对Makefile不太熟悉,用这个工具可以傻瓜生成Makefile,是我最大的动力!

1.安装autotools

  在我的地沟油下,是被打包成下面两个文件的:

1
sudo dnf install automake  autoconf

2.建立代码目录,添加测试的源代码文件

  这里直接无耻地照搬了这里的两个测试文件str.h和str.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 user@localhost  ~/Study/project/to_linux/test_project  mkdir include src
user@localhost  ~/Study/project/to_linux/test_project  cat include/str.h
#include <stdio.h>
int str(char *string);
user@localhost  ~/Study/project/to_linux/test_project  cat src/str.cpp
#include "str.h"

int str(char *string){
printf("\n----PRINT STRING----\n\"%s\"\n",string);
return 0;
}

int main(int argc , char **argv){
char str_read[1024];
printf("Please INPUT something end by [ENTER]\n");
scanf("%s",str_read);
return str(str_read );
}
user@localhost  ~/Study/project/to_linux/test_project 

3.生成configure.ac

  autoscan工具在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及子目录树中进行检查,并生成一个configure.scan文件。我们将这个文件命名为configure.ac(有的也命名成configure.in文件,但是.ac是新名字,建议用这个哦!)

1
user@localhost  ~/Study/project/to_linux/test_project  mv configure.scan configure.ac

修改之,添加或者修改如下条目(最终的修改结果会在文末贴出)

1
2
3
4
AC_INIT([strtest], [1.0], [taozhijiang@gmail.com])
AM_INIT_AUTOMAKE
AC_PROG_CXX
AC_CONFIG_FILES([Makefile])

4.执行aclocal

5.创建Makefile.am

  这是另外一个比较讲究的文件。
  一个工程可以创建多个可执行文件,每个可执行文件可以依赖自己的源文件、编译参数等信息。
  AUTOMAKE_OPTIONS提供了三个strictness等级,分别是foreign, gnu(默认), gnits三个,主要差异是对目录下的NEWS、README等要求,以及编译的输出等级等,foreign是最小等级。
  详情请见info automake 3.2 Strictness

5.1 方案1

  我们简单使用的文件如下:

1
2
3
4
5
AUTOMAKE_OPTIONS = foreign

bin_PROGRAMS = strtest
strtest_SOURCES = src/str.cpp
strtest_CPPFLAGS = -I include/ -include ./WINTYPES.H

  下面很明显啦,就是每个执行文件的名字,及其源代码和额外的编译参数。

5.2 方案2

  这样每个源代码添加src比较的麻烦,还以使用SUBDIRS指令。在顶层的Makefile.am的内容为

1
2
AUTOMAKE_OPTIONS = foreign
SUBDIRS = src

然后在src目录添加Makefile.am,内容为

1
2
3
bin_PROGRAMS = strtest
strtest_SOURCES = str.cpp
strtest_CPPFLAGS = -I include/ -include ./WINTYPES.H

还需要修改之前的configure.ac文件,增加子目录生成Makefile

1
AC_CONFIG_FILES([Makefile src/Makefile])

所以一开始就要规划好!

6.执行autoconf

  生成configure可执行文件,用于检测系统配置等信息。

7.autoheader

  负责生成configure.ac配置文件中的config.h.in文件。打开看主要是一些包的名字、URL等信息。可能是修改配置configure.ac中的某些参数会生成,对这里的实质性工作没啥作用。

8.automake –add-missing

  GNU的要求还是比较规范的,什么INSTALL COPYING 等信息都不能少。添加–add-missing参数自动添加这些丢失的东西!

9. ./configure && make

  这就是通常的编译步骤,完成后就会在根目录或者src目录下生成可执行文件strtest啦!

附录详细的文件清单:

===================================
configure.ac

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 #                                               -*- Autoconf -*-


# Process this file with autoconf to produce a configure script.



AC_PREREQ([2.69])
AC_INIT([strtest], [1.0], [taozhijiang@gmail.com])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([include/str.h])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CC
AC_PROG_CXX

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
AC_CONFIG_FILES([Makefile])

AC_OUTPUT
user@localhost  ~/Study/project/to_linux/test_project 

Makefile.am
```bash
AUTOMAKE_OPTIONS = foreign
SUBDIRS = src

src/Makefile.am

1
2
3
4
bin_PROGRAMS = strtest
strtest_SOURCES = str.cpp

strtest_CPPFLAGS = -I ../include/ -include ../WINTYPES.H

参考