几句话说清楚17:用Makefile.am和configure.ac构建一个专业的Hello World

首先感谢GUN的良好教程,这里主要是做一点点加工。

GNU Autotool

现在写开源项目,如果只提供一个Makefile可能会令别人怀疑你项目的专业程度:D虽然其实并没有什么关系,但看着别的项目目录下面的configure, configure.ac, Makefile.in, Makefile.am, aclocal.m4等文件还是会觉得有必要也用这些东西“装点”一下。

这些文件其实都是由GNU Autotools生成的。Autotools的功能当然不止是装点一下,但我们不在这里深究这个问题,下面通过一个最简单的Hello World示例来解释一下Autotools的使用方法。

构建必要的文件

src/main.c

在项目根目录下新建一个src文件夹,放Hello World的main.c

1
2
3
4
5
6
7
8
9
10
#include <config.h>
#include <stdio.h>

int
main (void)
{
puts ("Hello World!");
puts ("This is " PACKAGE_STRING ".");
return 0;
}

特别注意一下与”传统”Hello World不同的是include了一个config.h,所以才会有PACKAGE_STRING这一变量。

不直接在根目录创建main.c是因为后续Autotools会自动创建一些额外的作为一个”专业”项目所需要的文件夹,例如man/data/等等。

README

这个直接放根目录就行了:

1
2
This is a demonstration package for GNU Automake.
Type 'info Automake' to read the Automake manual.

根目录下的Makefile.am

这个这么写:

1
2
SUBDIRS = src
dist_doc_DATA = README

src目录下的Makefile.am

是的,确实需要写两个Makefile.am:

1
2
bin_PROGRAMS = hello
hello_SOURCES = main.c

configure.ac

下面就可以写最后的configure.ac文件了,这个放在根目录下:

1
2
3
4
5
6
7
8
9
AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
Makefile
src/Makefile
])
AC_OUTPUT

AC_INIT等等Autotools预定义的宏,看一下括号里的东西大概就能明白是什么意思了吧:D当然,除了这几个之外还有很多其他功能强大的操作,可以自行查找相关信息。

实例化构建系统

运行autoreconf命令:

1
2
3
4
5
autoreconf --install
configure.ac: installing './install-sh'
configure.ac: installing './missing'
configure.ac: installing './compile'
src/Makefile.am: installing './depcomp'

这个时候你就可以看到你的目录下面多出了configrure, config.h.in, Makefile.in以及src/Makefile.in这几个文件。但autoreconf的目的不仅仅是创建这几个文件,而是为了在你的系统里创建GNU Build System。

编译安装

下面你就可以用平时你在开源项目里用到的操作手法编译生成安装了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: executing depfiles commands

用了configure之后就可以看到Makefilesrc/Makefile以及config.h了。下面直接make就好。

1
2
3
4
5
make

src/hello
Hello World!
This is amhello 1.0.
© 2020 DecodeZ All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero