使用 GNU Autotools 生成 Makefile 文件

by LauCyun Jun 7,2016 07:46:18 13,617 views

手工写 Makefile 是一件很有趣的事情,对于比较大型的项目,如果有工具可以代劳,自然是一件好事。在 Linux 系统开发环境中,GNU Autotools 无疑就充当了这个重要角色。(在 Windows 系统的开发环境中,IDE 工具,诸如 Visual Studio,来管理项目也很方便。)

本文以一个简单项目为例子,来讲述 GNU Autotools 的一列工具及其命令的用法。

autotools 是系列工具, 它主要由 autoconfautomakeperl 语言环境和 m4 等组成;所包含的命令有五个:

  • aclocal
  • autoscan
  • autoconf
  • autoheader
  • automake

其工作流程,如图1

图1 autotools 的工作流程

 

一、安装 autotools 

ubuntu@localhost:~$ sudo apt-get install autoconf -y

显示如下:

Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  automake autotools-dev m4
Suggested packages:
  autoconf2.13 autoconf-archive gnu-standards autoconf-doc libtool gettext
The following NEW packages will be installed:
  autoconf automake autotools-dev m4
0 upgraded, 4 newly installed, 0 to remove and 106 not upgraded.
Need to get 1,072 kB of archives.
After this operation, 3,995 kB of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com/ubuntu/ trusty/main m4 amd64 1.4.17-2ubuntu1 [195 kB]
Get:2 http://us.archive.ubuntu.com/ubuntu/ trusty/main autoconf all 2.69-6 [322 kB]
Get:3 http://us.archive.ubuntu.com/ubuntu/ trusty/main autotools-dev all 20130810.1 [44.3 kB]
Get:4 http://us.archive.ubuntu.com/ubuntu/ trusty/main automake all 1:1.14.1-2ubuntu1 [510 kB]
Fetched 1,072 kB in 1min 29s (11.9 kB/s)
Selecting previously unselected package m4.
(Reading database ... 58977 files and directories currently installed.)
Preparing to unpack .../m4_1.4.17-2ubuntu1_amd64.deb ...
Unpacking m4 (1.4.17-2ubuntu1) ...
Selecting previously unselected package autoconf.
Preparing to unpack .../autoconf_2.69-6_all.deb ...
Unpacking autoconf (2.69-6) ...
Selecting previously unselected package autotools-dev.
Preparing to unpack .../autotools-dev_20130810.1_all.deb ...
Unpacking autotools-dev (20130810.1) ...
Selecting previously unselected package automake.
Preparing to unpack .../automake_1%3a1.14.1-2ubuntu1_all.deb ...
Unpacking automake (1:1.14.1-2ubuntu1) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Processing triggers for install-info (5.2.0.dfsg.1-2) ...
Setting up m4 (1.4.17-2ubuntu1) ...
Setting up autoconf (2.69-6) ...
Setting up autotools-dev (20130810.1) ...
Setting up automake (1:1.14.1-2ubuntu1) ...
update-alternatives: using /usr/bin/automake-1.14 to provide /usr/bin/automake (automake) in auto mode

最好一起安装它建议安装的软件包,否则autotools工具使用可能出错。

ubuntu@localhost:~$ sudo apt-get install autotools-dev m4 autoconf autoconf-archive gnu-standards autoconf-doc libtool -y

 

二、 使用 autotools 步骤

说明:

    1、本文中用到的源代码在第五章中有提供。

    2、用 * 表示为可选步骤。

2.1 使用 autoscan 命令,它将扫描工作目录,生成 configure.scan 文件。

root@liuker:/home/workspace/cmysql# autoscan
root@liuker:/home/workspace/cmysql# ll
total 28
drwxr-xr-x 2 root root 4096 Jun  7 20:59 ./
drwxr-xr-x 3 root root 4096 Jun  7 11:16 ../
-rw-r--r-- 1 root root    0 Jun  7 20:59 autoscan.log
-rw-r--r-- 1 root root 1126 Jun  7 14:22 CMysql.c
-rw-r--r-- 1 root root  419 Jun  7 10:40 CMysql.h
-rw-r--r-- 1 root root  497 Jun  7 20:59 configure.scan
-rw-r--r-- 1 root root 2340 Jun  7 18:19 table_user.c
-rw-r--r-- 1 root root  420 Jun  7 14:47 table_user.h
root@liuker:/home/workspace/cmysql#

2.2configure.scan 文件重命名为 configure.ac,并做适当的修改。在 configure.ac 中,# 号开始的行是注释,其他都是 m4 宏命令;configure.ac 里面的宏的主要作用是侦测系统。

root@liuker:/home/workspace/cmysql# mv configure.scan configure.ac
root@liuker:/home/workspace/cmysql# ll
total 28
drwxr-xr-x 2 root root 4096 Jun  7 20:59 ./
drwxr-xr-x 3 root root 4096 Jun  7 11:16 ../
-rw-r--r-- 1 root root    0 Jun  7 20:59 autoscan.log
-rw-r--r-- 1 root root 1126 Jun  7 14:22 CMysql.c
-rw-r--r-- 1 root root  419 Jun  7 10:40 CMysql.h
-rw-r--r-- 1 root root  497 Jun  7 20:59 configure.ac
-rw-r--r-- 1 root root 2340 Jun  7 18:19 table_user.c
-rw-r--r-- 1 root root  420 Jun  7 14:47 table_user.h
root@liuker:/home/workspace/cmysql# cat configure.ac
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([CMysql.c])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
AC_CHECK_HEADERS([stdlib.h])
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT
root@liuker:/home/workspace/cmysql#

2.3configure.ac 文件做适当的修改,修改如下:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
# AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_INIT(cmysql, 1.0.0, liu@liuker.xyz)
AM_INIT_AUTOMAKE
# AC_CONFIG_SRCDIR([CMysql.c])
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
AC_CHECK_HEADERS([stdlib.h])
AC_CHECK_HEADERS(/usr/include/mysql/mysql.h) #包含头文件
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
# AC_CHECK_LIB(/usr/lib/mysql/mysqlclient)
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

说明:

  • #  开始的行均为注释行。
  • AC_PREREQ 宏声明本文要求的 autoconf 版本,如本例中的版本 2.69。
  • AC_INIT 宏用来定义软件的名称、版本等信息、作者的E-mail等。
  • AM_INIT_AUTOMAKE 是通过手动添加的,它是 automake 所必备的宏,FULL-PACKAGE-NAME 是软件名称,VERSION 是软件版本号。
  • AC_CONFIG_SCRDIR 宏用来侦测所指定的源码文件是否存在,来确定源码目录的有效性。此处为当前目录下 main.c。
  • AC_CONFIG_HEADER 宏用于生成 config.h 文件,以便 autoheader 命令使用。
  • AC_PROG_CC用来指定编译器,如果不指定,默认gcc。
  • AC_OUTPUT 用来设定 configure 所要产生的文件,如果是 makefile,configure 会把它检查出来的结果带入 makefile.in 文件产生合适的 makefile。使用 Automake 时,还需要一些其他的参数,这些额外的宏用 aclocal 工具产生。
  • AC_CONFIG_FILES 宏用于生成相应的 Makefile 文件。

2.4 使用 aclocal 命令,扫描 configure.ac 文件生成 aclocal.m4 文件, 该文件主要处理本地的宏定义,它根据已经安装的宏、用户定义宏和 acinclude.m4 文件中的宏将 configure.ac 文件需要的宏集中定义到文件 aclocal.m4 中。

root@liuker:/home/workspace/cmysql# aclocal
root@liuker:/home/workspace/cmysql# ll
total 76
drwxr-xr-x 3 root root  4096 Jun  7 21:00 ./
drwxr-xr-x 3 root root  4096 Jun  7 11:16 ../
-rw-r--r-- 1 root root 41927 Jun  7 21:00 aclocal.m4
drwxr-xr-x 2 root root  4096 Jun  7 21:00 autom4te.cache/
-rw-r--r-- 1 root root     0 Jun  7 20:59 autoscan.log
-rw-r--r-- 1 root root  1126 Jun  7 14:22 CMysql.c
-rw-r--r-- 1 root root   419 Jun  7 10:40 CMysql.h
-rw-r--r-- 1 root root   674 Jun  7 21:00 configure.ac
-rw-r--r-- 1 root root  2340 Jun  7 18:19 table_user.c
-rw-r--r-- 1 root root   420 Jun  7 14:47 table_user.h
root@liuker:/home/workspace/cmysql#

2.5 使用 autoconf 命令生成 configure 文件。这个命令将 configure.ac 文件中的宏展开,生成 configure 脚本。这个过程可能要用到 aclocal.m4 中定义的宏。

root@liuker:/home/workspace/cmysql# autoconf
root@liuker:/home/workspace/cmysql# ll
total 240
drwxr-xr-x 3 root root   4096 Jun  7 21:01 ./
drwxr-xr-x 3 root root   4096 Jun  7 11:16 ../
-rw-r--r-- 1 root root  41927 Jun  7 21:00 aclocal.m4
drwxr-xr-x 2 root root   4096 Jun  7 21:01 autom4te.cache/
-rw-r--r-- 1 root root      0 Jun  7 20:59 autoscan.log
-rw-r--r-- 1 root root   1126 Jun  7 14:22 CMysql.c
-rw-r--r-- 1 root root    419 Jun  7 10:40 CMysql.h
-rwxr-xr-x 1 root root 165053 Jun  7 21:01 configure*
-rw-r--r-- 1 root root    674 Jun  7 21:00 configure.ac
-rw-r--r-- 1 root root   2340 Jun  7 18:19 table_user.c
-rw-r--r-- 1 root root    420 Jun  7 14:47 table_user.h
root@liuker:/home/workspace/cmysql#

2.6 使用 autoheader 命令生成 config.h.ini 文件。该命令通常会从 acconfig.h 文件中复制用户附加的符号定义。

root@liuker:/home/workspace/cmysql# autoheader
root@liuker:/home/workspace/cmysql# ll
total 244
drwxr-xr-x 3 root root   4096 Jun  7 21:01 ./
drwxr-xr-x 3 root root   4096 Jun  7 11:16 ../
-rw-r--r-- 1 root root  41927 Jun  7 21:00 aclocal.m4
drwxr-xr-x 2 root root   4096 Jun  7 21:01 autom4te.cache/
-rw-r--r-- 1 root root      0 Jun  7 20:59 autoscan.log
-rw-r--r-- 1 root root   1126 Jun  7 14:22 CMysql.c
-rw-r--r-- 1 root root    419 Jun  7 10:40 CMysql.h
-rw-r--r-- 1 root root   1553 Jun  7 21:01 config.h.in
-rwxr-xr-x 1 root root 165053 Jun  7 21:01 configure*
-rw-r--r-- 1 root root    674 Jun  7 21:00 configure.ac
-rw-r--r-- 1 root root   2340 Jun  7 18:19 table_user.c
-rw-r--r-- 1 root root    420 Jun  7 14:47 table_user.h
root@liuker:/home/workspace/cmysql#

2.7 手工创建 Makefile.am 文件。Automake工具会根据 configure.in 中的参量把 Makefile.am 转换成 Makefile.in 文件。

root@liuker:/home/workspace/cmysql# vim Makefile.am
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = cmysql
cmysql_SOURCES = CMysql.h CMysql.c table_user.h table_user.c

INCLUDES = -I /usr/include/mysql
LIBS = -L /usr/lib/mysql -l mysqlclient

说明:

  • 其中的 AUTOMAKE_OPTIONS 为设置 automake 的选项。由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则 automake 执行时会报错。automake 提供了3中软件等级:foreigngnugnits,供用户选择。默认级别是 gnu。在本例中, 使用了foreign等级: 它只检测必须的文件。
  • bin_PROGRAMS 定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。
  • cmysql_SOURCES 定义“cmysql”这个可执行程序所需的原始文件。如果”cmysql”这个程序是由多个源文件所产生的,则必须把它所用到的所有源文件都列出来,并用空格隔开。如果要定义多个可执行程序,那么需要对每个可执行程序建立对应的 file_SOURCES
  • INCLUDES 头文件路径。
  • LIBS 库文件路径。

2.8 使用 automake 命令生成 Makefile.in 文件。使用选项 --add-missing 可以让 automake 自动添加一些必需的脚本文件。

root@liuker:/home/workspace/cmysql# automake --add-missing
configure.ac:12: installing './compile'
configure.ac:7: installing './install-sh'
configure.ac:7: installing './missing'
Makefile.am:4: warning: 'INCLUDES' is the old name for 'AM_CPPFLAGS' (or '*_CPPFLAGS')
Makefile.am: installing './depcomp'
root@liuker:/home/workspace/cmysql# ll
total 272
drwxr-xr-x 3 root root   4096 Jun  7 21:02 ./
drwxr-xr-x 3 root root   4096 Jun  7 11:16 ../
-rw-r--r-- 1 root root  41927 Jun  7 21:00 aclocal.m4
drwxr-xr-x 2 root root   4096 Jun  7 21:02 autom4te.cache/
-rw-r--r-- 1 root root      0 Jun  7 20:59 autoscan.log
-rw-r--r-- 1 root root   1126 Jun  7 14:22 CMysql.c
-rw-r--r-- 1 root root    419 Jun  7 10:40 CMysql.h
lrwxrwxrwx 1 root root     32 Jun  7 21:02 compile -> /usr/share/automake-1.14/compile*
-rw-r--r-- 1 root root   1553 Jun  7 21:01 config.h.in
-rwxr-xr-x 1 root root 165053 Jun  7 21:01 configure*
-rw-r--r-- 1 root root    674 Jun  7 21:00 configure.ac
lrwxrwxrwx 1 root root     32 Jun  7 21:02 depcomp -> /usr/share/automake-1.14/depcomp*
lrwxrwxrwx 1 root root     35 Jun  7 21:02 install-sh -> /usr/share/automake-1.14/install-sh*
-rw-r--r-- 1 root root    161 Jun  7 21:02 Makefile.am
-rw-r--r-- 1 root root  23821 Jun  7 21:02 Makefile.in
lrwxrwxrwx 1 root root     32 Jun  7 21:02 missing -> /usr/share/automake-1.14/missing*
-rw-r--r-- 1 root root   2340 Jun  7 18:19 table_user.c
-rw-r--r-- 1 root root    420 Jun  7 14:47 table_user.h
root@liuker:/home/workspace/cmysql#

* 2.8.1 再次使用 automake --add-missing 运行一次,可以辅助生成几个必要的文件。

root@liuker:/home/workspace/cmysql# automake --add-missing
Makefile.am: installing './INSTALL'
Makefile.am: error: required file './NEWS' not found
Makefile.am: error: required file './README' not found
Makefile.am: error: required file './AUTHORS' not found
Makefile.am: error: required file './ChangeLog' not found
Makefile.am: installing './COPYING' using GNU General Public License v3 file
Makefile.am:     Consider adding the COPYING file to the version control system
Makefile.am:     for your code, to avoid questions about which license your project uses

* 2.8.2 在当前目录创建上面未发现的四个文件,并再次使用 automake --add-missing 运行一次。

root@liuker:/home/workspace/cmysql# touch NEWS  
root@liuker:/home/workspace/cmysql# touch README  
root@liuker:/home/workspace/cmysql# touch AUTHORS  
root@liuker:/home/workspace/cmysql# touch ChangeLog  
root@liuker:/home/workspace/cmysql#  
root@liuker:/home/workspace/cmysql# automake --add-missing

2.9 使用 ./configure 命令, 把 Makefile.in 变成最终的 Makefile 文件。

root@liuker:/home/workspace/cmysql# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
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 whether gcc understands -c and -o together... yes
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for stdlib.h... (cached) yes
checking /usr/include/mysql/mysql.h usability... yes
checking /usr/include/mysql/mysql.h presence... yes
checking for /usr/include/mysql/mysql.h... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
root@liuker:/home/workspace/cmysql# ll
total 360
drwxr-xr-x 4 root root   4096 Jun  7 21:05 ./
drwxr-xr-x 3 root root   4096 Jun  7 11:16 ../
-rw-r--r-- 1 root root  41927 Jun  7 21:00 aclocal.m4
drwxr-xr-x 2 root root   4096 Jun  7 21:02 autom4te.cache/
-rw-r--r-- 1 root root      0 Jun  7 20:59 autoscan.log
-rw-r--r-- 1 root root   1126 Jun  7 14:22 CMysql.c
-rw-r--r-- 1 root root    419 Jun  7 10:40 CMysql.h
lrwxrwxrwx 1 root root     32 Jun  7 21:02 compile -> /usr/share/automake-1.14/compile*
-rw-r--r-- 1 root root   1731 Jun  7 21:05 config.h
-rw-r--r-- 1 root root   1553 Jun  7 21:01 config.h.in
-rw-r--r-- 1 root root  13571 Jun  7 21:05 config.log
-rwxr-xr-x 1 root root  32880 Jun  7 21:05 config.status*
-rwxr-xr-x 1 root root 165053 Jun  7 21:01 configure*
-rw-r--r-- 1 root root    674 Jun  7 21:00 configure.ac
lrwxrwxrwx 1 root root     32 Jun  7 21:02 depcomp -> /usr/share/automake-1.14/depcomp*
drwxr-xr-x 2 root root   4096 Jun  7 21:05 .deps/
lrwxrwxrwx 1 root root     35 Jun  7 21:02 install-sh -> /usr/share/automake-1.14/install-sh*
-rw-r--r-- 1 root root  23595 Jun  7 21:05 Makefile
-rw-r--r-- 1 root root    161 Jun  7 21:02 Makefile.am
-rw-r--r-- 1 root root  23821 Jun  7 21:02 Makefile.in
lrwxrwxrwx 1 root root     32 Jun  7 21:02 missing -> /usr/share/automake-1.14/missing*
-rw-r--r-- 1 root root     23 Jun  7 21:05 stamp-h1
-rw-r--r-- 1 root root   2340 Jun  7 18:19 table_user.c
-rw-r--r-- 1 root root    420 Jun  7 14:47 table_user.h
root@liuker:/home/workspace/cmysql#

OK,Makefile 文件已经生成成功。

 

三、Makefile的用法

3.1 make 命令,用来编译代码, 默认执行 make all 命令,可以看到生成了 cmysql 的可执行文件。

root@liuker:/home/workspace/cmysql# make
make  all-am
make[1]: Entering directory `/home/workspace/cmysql'
gcc -DHAVE_CONFIG_H -I. -I /usr/include/mysql    -g -O2 -MT CMysql.o -MD -MP -MF .deps/CMysql.Tpo -c -o CMysql.o CMysql.c
mv -f .deps/CMysql.Tpo .deps/CMysql.Po
gcc -DHAVE_CONFIG_H -I. -I /usr/include/mysql    -g -O2 -MT table_user.o -MD -MP -MF .deps/table_user.Tpo -c -o table_user.o table_user.c
mv -f .deps/table_user.Tpo .deps/table_user.Po
gcc  -g -O2   -o cmysql CMysql.o table_user.o  -L /usr/lib/mysql -l mysqlclient
make[1]: Leaving directory `/home/workspace/cmysql'

文件显示如下:

root@liuker:/home/workspace/cmysql# ll
total 444
drwxr-xr-x 4 root root   4096 Jun  7 21:09 ./
drwxr-xr-x 3 root root   4096 Jun  7 11:16 ../
-rw-r--r-- 1 root root  41927 Jun  7 21:00 aclocal.m4
drwxr-xr-x 2 root root   4096 Jun  7 21:02 autom4te.cache/
-rw-r--r-- 1 root root      0 Jun  7 20:59 autoscan.log
-rwxr-xr-x 1 root root  30657 Jun  7 21:09 cmysql*
-rw-r--r-- 1 root root   1126 Jun  7 14:22 CMysql.c
-rw-r--r-- 1 root root    419 Jun  7 10:40 CMysql.h
-rw-r--r-- 1 root root  21392 Jun  7 21:09 CMysql.o
lrwxrwxrwx 1 root root     32 Jun  7 21:02 compile -> /usr/share/automake-1.14/compile*
-rw-r--r-- 1 root root   1731 Jun  7 21:05 config.h
-rw-r--r-- 1 root root   1553 Jun  7 21:01 config.h.in
-rw-r--r-- 1 root root  13571 Jun  7 21:05 config.log
-rwxr-xr-x 1 root root  32880 Jun  7 21:05 config.status*
-rwxr-xr-x 1 root root 165053 Jun  7 21:01 configure*
-rw-r--r-- 1 root root    674 Jun  7 21:00 configure.ac
lrwxrwxrwx 1 root root     32 Jun  7 21:02 depcomp -> /usr/share/automake-1.14/depcomp*
drwxr-xr-x 2 root root   4096 Jun  7 21:09 .deps/
lrwxrwxrwx 1 root root     35 Jun  7 21:02 install-sh -> /usr/share/automake-1.14/install-sh*
-rw-r--r-- 1 root root  23595 Jun  7 21:05 Makefile
-rw-r--r-- 1 root root    161 Jun  7 21:02 Makefile.am
-rw-r--r-- 1 root root  23821 Jun  7 21:02 Makefile.in
lrwxrwxrwx 1 root root     32 Jun  7 21:02 missing -> /usr/share/automake-1.14/missing*
-rw-r--r-- 1 root root     23 Jun  7 21:05 stamp-h1
-rw-r--r-- 1 root root   2340 Jun  7 18:19 table_user.c
-rw-r--r-- 1 root root    420 Jun  7 14:47 table_user.h
-rw-r--r-- 1 root root  25256 Jun  7 21:09 table_user.o
root@liuker:/home/workspace/cmysql#

3.2 make clean 命令清除编译时的 obj 文件,它与 make 命令是对应关系,一个是编译,一个清除编译的文件。

3.3 运行 ./cmysql 就能看到运行结果:

root@liuker:/home/workspace/cysql# ./cmysql
Affected row: 1
Total: 3 Rows
1       liuker  zaqwsx  1
2       demo    123123  2
3       netvine ha.ha.ha..      1
Affected row: 1
Total: 4 Rows
1       liuker  zaqwsx  1
2       demo    123123  2
3       netvine ha.ha.ha..      1
15      admin   password        1
Affected row: 1
Total: 4 Rows
1       liuker  zaqwsx  1
2       demo    123123  2
3       netvine ha.ha.ha..      1
15      admin   zaqwsx  1
root@liuker:/home/workspace/cmysql#

3.4 make install 命令把目标文件安装到系统中。直接输入 cmysql,就可以看到程序的运行结果。

3.5 make uninstall 命令把目标文件从系统中卸载。

3.6 make dist 命令将程序和相关的文档打包为一个压缩文档以供发布,在本例子中,生成的打包文件名为:cmysql-1.0.0.tar.gz。

root@liuker:/home/workspace/cmysql# make dist
make  dist-gzip am__post_remove_distdir='@:'
make[1]: Entering directory `/home/workspace/mysql-demo/mysql'
if test -d "cmysql-1.0.0"; then find "cmysql-1.0.0" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -rf "cmysql-1.0.0" || { sleep 5 && rm -rf "cmysql-1.0.0"; }; else :; fi
test -d "cmysql-1.0.0" || mkdir "cmysql-1.0.0"
test -n "" \
        || find "cmysql-1.0.0" -type d ! -perm -755 \
                -exec chmod u+rwx,go+rx {} \; -o \
          ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
          ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
          ! -type d ! -perm -444 -exec /bin/bash /home/workspace/mysql-demo/mysql/install-sh -c -m a+r {} {} \; \
        || chmod -R a+r "cmysql-1.0.0"
tardir=cmysql-1.0.0 && ${TAR-tar} chof - "$tardir" | GZIP=--best gzip -c >cmysql-1.0.0.tar.gz
make[1]: Leaving directory `/home/workspace/mysql-demo/mysql'
if test -d "cmysql-1.0.0"; then find "cmysql-1.0.0" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -rf "cmysql-1.0.0" || { sleep 5 && rm -rf "cmysql-1.0.0"; }; else :; fi

 

四、总结

本文描述了如果使用GNU Autotools的来管理源代码,发布源代码包,以及获得源代码包后如何编译、安装。由于这个例子过于简单,GNU Autotools的用法还未完全描述清楚,主要体现在以下几点:

(1)在创建 Makefile.am 文件中,描述的很简单。在实际的项目中,文件关系很复杂,而且还有引用其他动态库、第三方动态库等关系。

(2)虽然 makefile 是自动生成的,但是了解它的规则是非常重要的。makefile 涉及到的规则本文并未加以描述。

 

五、传送门

1 源代码传送门: GitHub - liuker/mysql-c-example 

2 参考文档:GNU Autotools的使用方法

(全文完)

Tags