【Linux笔记】【基础系列】 Automake基础使用
GNU Automake 是一个从模板文件创建符合 GNU 标准的 Makefile 的程序。Automake 从名为 Makefile.am 的文件中自动生成 Makefile.in。Automake 是一组称为 Autotools 的工具的一部分。其中包含名为 configure、configure.ac、Makefile.in、Makefile.am、aclocal.m4 等文件的包,其中一些是由 Autoconf 或 Automake 生成的。GNU Makefile 标准文档很长、很复杂,并且可能会发生变化,而 Automake 的目标是减轻单个 GNU 维护者的 Makefile 维护负担
下面基于树莓派4B平台进行开发,使用一个简单的例子来实现 Automake 生成 Makefile 的步骤。
首先安装automake:
sudo apt install automake
安装完成后,新建一个用于写示例的文件夹:
pi@raspberrypi:~/Desktop $ mkdir automaketest
新建3个文件:
pi@raspberrypi:~/Desktop $ cd automaketest/
pi@raspberrypi:~/Desktop/automaketest $ touch test.c isPrime.c isPrime.h
文件内容为:
isPrime.c用于判断数值是否为素数。
#include <stdio.h>
#include <stdlib.h>
int isPrime(unsigned int num)
{
unsigned int i;
if(num <= 1)
return 0;
for(i = 2; i < num; i++)
{
if(num % i == 0)
return 0;
}
return 1;
}
isPrime.h对应的头文件:
int isPrime(unsigned int num);
test.c是主程序,用于打印0到100之间的素数。
#include <stdio.h>
#include <stdlib.h>
#include "isPrime.h"
int main(int argc, char* argv[])
{
int i;
for(i = 0; i < 100; i++)
{
if(isPrime(i))
printf("%d ", i);
}
printf("\n");
return 0;
}
所需的文件就都准备好了,现在开始生成Makefile。
-
执行 autoscan 命令
pi@raspberrypi:~/Desktop/automaketest $ autoscan pi@raspberrypi:~/Desktop/automaketest $ ls -l 总用量 16 -rw-r--r-- 1 pi pi 0 5月 3 16:06 autoscan.log -rw-r--r-- 1 pi pi 495 5月 3 16:06 configure.scan -rw-r--r-- 1 pi pi 238 5月 3 15:58 isPrime.c -rw-r--r-- 1 pi pi 31 5月 3 15:59 isPrime.h -rw-r--r-- 1 pi pi 242 5月 3 16:00 test.c
执行完 autoscan 命令后,会发现生成了 autoscan.log 和 configure.scan 这两个文件。
-
将 configure.scan 重命名为 configure.ac,并修改 configure.ac 文件
pi@raspberrypi:~/Desktop/automaketest $ mv configure.scan configure.ac
configure.ac 文件修改前内容如下:
pi@raspberrypi:~/Desktop/automaketest $ 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([test.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
我们修改并添加一些内容,变成这样:
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT(automaketest, 1.0.0, test@test.com) AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR([test.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_CONFIG_FILES([Makefile]) AC_OUTPUT
可以看到,修改了用于定义软件名称、版本号、联系地址的
AC_INIT
,添加了参数AM_INIT_AUTOMAKE
,AC_CONFIG_FILES([Makefile])
。 -
执行 aclocal 命令
pi@raspberrypi:~/Desktop/automaketest $ aclocal pi@raspberrypi:~/Desktop/automaketest $ ls -l 总用量 64 -rw-r--r-- 1 pi pi 41888 5月 3 16:19 aclocal.m4 drwxr-xr-x 2 pi pi 4096 5月 3 16:19 autom4te.cache -rw-r--r-- 1 pi pi 0 5月 3 16:06 autoscan.log -rw-r--r-- 1 pi pi 522 5月 3 16:15 configure.ac -rw-r--r-- 1 pi pi 238 5月 3 15:58 isPrime.c -rw-r--r-- 1 pi pi 31 5月 3 15:59 isPrime.h -rw-r--r-- 1 pi pi 242 5月 3 16:00 test.c
执行完 aclocal 命令后,会发现生成了 aclocal.m4 文件和 autom4te.cache 文件夹。
-
执行 autoconf 命令
pi@raspberrypi:~/Desktop/automaketest $ autoconf pi@raspberrypi:~/Desktop/automaketest $ ls -l 总用量 228 -rw-r--r-- 1 pi pi 41888 5月 3 16:19 aclocal.m4 drwxr-xr-x 2 pi pi 4096 5月 3 16:22 autom4te.cache -rw-r--r-- 1 pi pi 0 5月 3 16:06 autoscan.log -rwxr-xr-x 1 pi pi 165467 5月 3 16:22 configure -rw-r--r-- 1 pi pi 522 5月 3 16:15 configure.ac -rw-r--r-- 1 pi pi 238 5月 3 15:58 isPrime.c -rw-r--r-- 1 pi pi 31 5月 3 15:59 isPrime.h -rw-r--r-- 1 pi pi 242 5月 3 16:00 test.c
执行完 autoconf 命令后,会发现生成了 configure 文件。
-
执行 autoheader 命令
pi@raspberrypi:~/Desktop/automaketest $ autoheader pi@raspberrypi:~/Desktop/automaketest $ ls -l 总用量 232 -rw-r--r-- 1 pi pi 41888 5月 3 16:19 aclocal.m4 drwxr-xr-x 2 pi pi 4096 5月 3 16:22 autom4te.cache -rw-r--r-- 1 pi pi 0 5月 3 16:06 autoscan.log -rw-r--r-- 1 pi pi 1437 5月 3 16:24 config.h.in -rwxr-xr-x 1 pi pi 165467 5月 3 16:22 configure -rw-r--r-- 1 pi pi 522 5月 3 16:15 configure.ac -rw-r--r-- 1 pi pi 238 5月 3 15:58 isPrime.c -rw-r--r-- 1 pi pi 31 5月 3 15:59 isPrime.h -rw-r--r-- 1 pi pi 242 5月 3 16:00 test.c
执行完 autoheader 命令后,生成了 config.h.in 文件。
-
创建一个Makefile.am文件
pi@raspberrypi:~/Desktop/automaketest $ touch Makefile.am
文件内容为:
AUTOMAKE_OPTIONS = foreign bin_PROGRAMS = test test_SOURCES = test.c isPrime.c isPrime.h
AUTOMAKE_OPTIONS
用于设置automake的选项,这里只设置了发布软件的严格等级。发布软件的严格等级一共有三个等级gnu, foreign, gnits,这里使用foreign,表示 Automake 将仅检查正确操作绝对需要的那些东西。详细可以参考Strictness。
bin_PROGRAMS
表示生成的可执行文件名称。
test_SOURCES
用于表示生成的可执行文件 test 所依赖的源文件。注意test
是可执行文件名称,如果可执行文件名称换成autotest
,那么这个名称就要改成autotest_SOURCES
。
-
执行 automake --add-missing 命令
这个命令会让 automake 加入一个标准的软件包所必须的一些文件。
pi@raspberrypi:~/Desktop/automaketest $ automake --add-missing configure.ac:11: installing './compile' configure.ac:6: installing './install-sh' configure.ac:6: installing './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 Makefile.am: installing './depcomp'
执行完后提示,缺少了文件
NEWS
,README
,AUTHORS
,ChangeLog
,那就需要先创建这四个文件:pi@raspberrypi:~/Desktop/automaketest $ touch NEWS README AUTHORS ChangeLog
然后再执行一次 automake --add-missing 命令
pi@raspberrypi:~/Desktop/automaketest $ automake --add-missing pi@raspberrypi:~/Desktop/automaketest $ ls -l 总用量 260 -rw-r--r-- 1 pi pi 41888 5月 3 16:19 aclocal.m4 -rw-r--r-- 1 pi pi 0 5月 3 16:44 AUTHORS drwxr-xr-x 2 pi pi 4096 5月 3 16:40 autom4te.cache -rw-r--r-- 1 pi pi 0 5月 3 16:06 autoscan.log -rw-r--r-- 1 pi pi 0 5月 3 16:44 ChangeLog lrwxrwxrwx 1 pi pi 32 5月 3 16:40 compile -> /usr/share/automake-1.16/compile -rw-r--r-- 1 pi pi 1437 5月 3 16:24 config.h.in -rwxr-xr-x 1 pi pi 165467 5月 3 16:22 configure -rw-r--r-- 1 pi pi 522 5月 3 16:15 configure.ac lrwxrwxrwx 1 pi pi 32 5月 3 16:40 COPYING -> /usr/share/automake-1.16/COPYING lrwxrwxrwx 1 pi pi 32 5月 3 16:40 depcomp -> /usr/share/automake-1.16/depcomp lrwxrwxrwx 1 pi pi 32 5月 3 16:40 INSTALL -> /usr/share/automake-1.16/INSTALL lrwxrwxrwx 1 pi pi 35 5月 3 16:40 install-sh -> /usr/share/automake-1.16/install-sh -rw-r--r-- 1 pi pi 238 5月 3 15:58 isPrime.c -rw-r--r-- 1 pi pi 31 5月 3 15:59 isPrime.h -rw-r--r-- 1 pi pi 95 5月 3 16:39 Makefile.am -rw-r--r-- 1 pi pi 24453 5月 3 16:45 Makefile.in lrwxrwxrwx 1 pi pi 32 5月 3 16:40 missing -> /usr/share/automake-1.16/missing -rw-r--r-- 1 pi pi 0 5月 3 16:44 NEWS -rw-r--r-- 1 pi pi 0 5月 3 16:44 README -rw-r--r-- 1 pi pi 242 5月 3 16:00 test.c
-
执行 ./configure 命令
执行 ./configure 命令后,就会把 Makefile.in 转变为 Makefile 文件。
pi@raspberrypi:~/Desktop/automaketest $ ./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 whether make supports the include directive... yes (GNU style) 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 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
这个时候查看下文件夹下的内容:
pi@raspberrypi:~/Desktop/automaketest $ ls -l 总用量 344 -rw-r--r-- 1 pi pi 41888 5月 3 16:19 aclocal.m4 -rw-r--r-- 1 pi pi 0 5月 3 16:44 AUTHORS drwxr-xr-x 2 pi pi 4096 5月 3 16:40 autom4te.cache -rw-r--r-- 1 pi pi 0 5月 3 16:06 autoscan.log -rw-r--r-- 1 pi pi 0 5月 3 16:44 ChangeLog lrwxrwxrwx 1 pi pi 32 5月 3 16:40 compile -> /usr/share/automake-1.16/compile -rw-r--r-- 1 pi pi 1635 5月 3 16:48 config.h -rw-r--r-- 1 pi pi 1437 5月 3 16:24 config.h.in -rw-r--r-- 1 pi pi 13282 5月 3 16:48 config.log -rwxr-xr-x 1 pi pi 32909 5月 3 16:48 config.status -rwxr-xr-x 1 pi pi 165467 5月 3 16:22 configure -rw-r--r-- 1 pi pi 522 5月 3 16:15 configure.ac lrwxrwxrwx 1 pi pi 32 5月 3 16:40 COPYING -> /usr/share/automake-1.16/COPYING lrwxrwxrwx 1 pi pi 32 5月 3 16:40 depcomp -> /usr/share/automake-1.16/depcomp lrwxrwxrwx 1 pi pi 32 5月 3 16:40 INSTALL -> /usr/share/automake-1.16/INSTALL lrwxrwxrwx 1 pi pi 35 5月 3 16:40 install-sh -> /usr/share/automake-1.16/install-sh -rw-r--r-- 1 pi pi 238 5月 3 15:58 isPrime.c -rw-r--r-- 1 pi pi 31 5月 3 15:59 isPrime.h -rw-r--r-- 1 pi pi 24245 5月 3 16:48 Makefile -rw-r--r-- 1 pi pi 95 5月 3 16:39 Makefile.am -rw-r--r-- 1 pi pi 24453 5月 3 16:45 Makefile.in lrwxrwxrwx 1 pi pi 32 5月 3 16:40 missing -> /usr/share/automake-1.16/missing -rw-r--r-- 1 pi pi 0 5月 3 16:44 NEWS -rw-r--r-- 1 pi pi 0 5月 3 16:44 README -rw-r--r-- 1 pi pi 23 5月 3 16:48 stamp-h1 -rw-r--r-- 1 pi pi 242 5月 3 16:00 test.c
会发现这个时候已经生成了 Makefile 文件。
-
执行 make 命令
执行 make 命令后,就可以生成最终的可执行文件了。
pi@raspberrypi:~/Desktop/automaketest $ make make all-am make[1]: 进入目录“/home/pi/Desktop/automaketest” gcc -DHAVE_CONFIG_H -I. -g -O2 -MT test.o -MD -MP -MF .deps/test.Tpo -c -o test.o test.c mv -f .deps/test.Tpo .deps/test.Po gcc -DHAVE_CONFIG_H -I. -g -O2 -MT isPrime.o -MD -MP -MF .deps/isPrime.Tpo -c -o isPrime.o isPrime.c mv -f .deps/isPrime.Tpo .deps/isPrime.Po gcc -g -O2 -o test test.o isPrime.o make[1]: 离开目录“/home/pi/Desktop/automaketest”
查看当前文件夹下的内容:
pi@raspberrypi:~/Desktop/automaketest $ ls -l 总用量 376 -rw-r--r-- 1 pi pi 41888 5月 3 16:19 aclocal.m4 -rw-r--r-- 1 pi pi 0 5月 3 16:44 AUTHORS drwxr-xr-x 2 pi pi 4096 5月 3 16:40 autom4te.cache -rw-r--r-- 1 pi pi 0 5月 3 16:06 autoscan.log -rw-r--r-- 1 pi pi 0 5月 3 16:44 ChangeLog lrwxrwxrwx 1 pi pi 32 5月 3 16:40 compile -> /usr/share/automake-1.16/compile -rw-r--r-- 1 pi pi 1635 5月 3 16:48 config.h -rw-r--r-- 1 pi pi 1437 5月 3 16:24 config.h.in -rw-r--r-- 1 pi pi 13282 5月 3 16:48 config.log -rwxr-xr-x 1 pi pi 32909 5月 3 16:48 config.status -rwxr-xr-x 1 pi pi 165467 5月 3 16:22 configure -rw-r--r-- 1 pi pi 522 5月 3 16:15 configure.ac lrwxrwxrwx 1 pi pi 32 5月 3 16:40 COPYING -> /usr/share/automake-1.16/COPYING lrwxrwxrwx 1 pi pi 32 5月 3 16:40 depcomp -> /usr/share/automake-1.16/depcomp lrwxrwxrwx 1 pi pi 32 5月 3 16:40 INSTALL -> /usr/share/automake-1.16/INSTALL lrwxrwxrwx 1 pi pi 35 5月 3 16:40 install-sh -> /usr/share/automake-1.16/install-sh -rw-r--r-- 1 pi pi 238 5月 3 15:58 isPrime.c -rw-r--r-- 1 pi pi 31 5月 3 15:59 isPrime.h -rw-r--r-- 1 pi pi 4660 5月 3 16:51 isPrime.o -rw-r--r-- 1 pi pi 24245 5月 3 16:48 Makefile -rw-r--r-- 1 pi pi 95 5月 3 16:39 Makefile.am -rw-r--r-- 1 pi pi 24453 5月 3 16:45 Makefile.in lrwxrwxrwx 1 pi pi 32 5月 3 16:40 missing -> /usr/share/automake-1.16/missing -rw-r--r-- 1 pi pi 0 5月 3 16:44 NEWS -rw-r--r-- 1 pi pi 0 5月 3 16:44 README -rw-r--r-- 1 pi pi 23 5月 3 16:48 stamp-h1 -rwxr-xr-x 1 pi pi 13252 5月 3 16:51 test -rw-r--r-- 1 pi pi 242 5月 3 16:00 test.c -rw-r--r-- 1 pi pi 5520 5月 3 16:51 test.o
可以看到最终的可执行文件 test 已经成功生成了。
-
运行 test 程序。
最后执行下测试程序 test 。
pi@raspberrypi:~/Desktop/automaketest $ ./test 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
可以看到,0 到 100 之间的素数被打印出来了。
这样一个最简单的使用 Automake 生成 Makefile 的示例就完成了。
【参考资料】
本文链接:https://blog.csdn.net/u012028275/article/details/124557928