【Linux笔记】【基础系列】 automake基础使用

【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。

  1. 执行 autoscan 命令

    pi@raspberrypi:~/Desktop/automaketest $ autoscan
    pi@raspberrypi:~/Desktop/automaketest $ ls -l
    总用量 16
    -rw-r--r-- 1 pi pi   0 53 16:06 autoscan.log
    -rw-r--r-- 1 pi pi 495 53 16:06 configure.scan
    -rw-r--r-- 1 pi pi 238 53 15:58 isPrime.c
    -rw-r--r-- 1 pi pi  31 53 15:59 isPrime.h
    -rw-r--r-- 1 pi pi 242 53 16:00 test.c
    

    执行完 autoscan 命令后,会发现生成了 autoscan.log 和 configure.scan 这两个文件。

  2. 将 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_AUTOMAKEAC_CONFIG_FILES([Makefile])

  3. 执行 aclocal 命令

    pi@raspberrypi:~/Desktop/automaketest $ aclocal
    pi@raspberrypi:~/Desktop/automaketest $ ls -l
    总用量 64
    -rw-r--r-- 1 pi pi 41888 53 16:19 aclocal.m4
    drwxr-xr-x 2 pi pi  4096 53 16:19 autom4te.cache
    -rw-r--r-- 1 pi pi     0 53 16:06 autoscan.log
    -rw-r--r-- 1 pi pi   522 53 16:15 configure.ac
    -rw-r--r-- 1 pi pi   238 53 15:58 isPrime.c
    -rw-r--r-- 1 pi pi    31 53 15:59 isPrime.h
    -rw-r--r-- 1 pi pi   242 53 16:00 test.c
    

    执行完 aclocal 命令后,会发现生成了 aclocal.m4 文件和 autom4te.cache 文件夹。

  4. 执行 autoconf 命令

    pi@raspberrypi:~/Desktop/automaketest $ autoconf
    pi@raspberrypi:~/Desktop/automaketest $ ls -l
    总用量 228
    -rw-r--r-- 1 pi pi  41888 53 16:19 aclocal.m4
    drwxr-xr-x 2 pi pi   4096 53 16:22 autom4te.cache
    -rw-r--r-- 1 pi pi      0 53 16:06 autoscan.log
    -rwxr-xr-x 1 pi pi 165467 53 16:22 configure
    -rw-r--r-- 1 pi pi    522 53 16:15 configure.ac
    -rw-r--r-- 1 pi pi    238 53 15:58 isPrime.c
    -rw-r--r-- 1 pi pi     31 53 15:59 isPrime.h
    -rw-r--r-- 1 pi pi    242 53 16:00 test.c
    

    执行完 autoconf 命令后,会发现生成了 configure 文件。

  5. 执行 autoheader 命令

    pi@raspberrypi:~/Desktop/automaketest $ autoheader
    pi@raspberrypi:~/Desktop/automaketest $ ls -l
    总用量 232
    -rw-r--r-- 1 pi pi  41888 53 16:19 aclocal.m4
    drwxr-xr-x 2 pi pi   4096 53 16:22 autom4te.cache
    -rw-r--r-- 1 pi pi      0 53 16:06 autoscan.log
    -rw-r--r-- 1 pi pi   1437 53 16:24 config.h.in
    -rwxr-xr-x 1 pi pi 165467 53 16:22 configure
    -rw-r--r-- 1 pi pi    522 53 16:15 configure.ac
    -rw-r--r-- 1 pi pi    238 53 15:58 isPrime.c
    -rw-r--r-- 1 pi pi     31 53 15:59 isPrime.h
    -rw-r--r-- 1 pi pi    242 53 16:00 test.c
    

    执行完 autoheader 命令后,生成了 config.h.in 文件。

  6. 创建一个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

  1. 执行 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 53 16:19 aclocal.m4
    -rw-r--r-- 1 pi pi      0 53 16:44 AUTHORS
    drwxr-xr-x 2 pi pi   4096 53 16:40 autom4te.cache
    -rw-r--r-- 1 pi pi      0 53 16:06 autoscan.log
    -rw-r--r-- 1 pi pi      0 53 16:44 ChangeLog
    lrwxrwxrwx 1 pi pi     32 53 16:40 compile -> /usr/share/automake-1.16/compile
    -rw-r--r-- 1 pi pi   1437 53 16:24 config.h.in
    -rwxr-xr-x 1 pi pi 165467 53 16:22 configure
    -rw-r--r-- 1 pi pi    522 53 16:15 configure.ac
    lrwxrwxrwx 1 pi pi     32 53 16:40 COPYING -> /usr/share/automake-1.16/COPYING
    lrwxrwxrwx 1 pi pi     32 53 16:40 depcomp -> /usr/share/automake-1.16/depcomp
    lrwxrwxrwx 1 pi pi     32 53 16:40 INSTALL -> /usr/share/automake-1.16/INSTALL
    lrwxrwxrwx 1 pi pi     35 53 16:40 install-sh -> /usr/share/automake-1.16/install-sh
    -rw-r--r-- 1 pi pi    238 53 15:58 isPrime.c
    -rw-r--r-- 1 pi pi     31 53 15:59 isPrime.h
    -rw-r--r-- 1 pi pi     95 53 16:39 Makefile.am
    -rw-r--r-- 1 pi pi  24453 53 16:45 Makefile.in
    lrwxrwxrwx 1 pi pi     32 53 16:40 missing -> /usr/share/automake-1.16/missing
    -rw-r--r-- 1 pi pi      0 53 16:44 NEWS
    -rw-r--r-- 1 pi pi      0 53 16:44 README
    -rw-r--r-- 1 pi pi    242 53 16:00 test.c
    
  2. 执行 ./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 53 16:19 aclocal.m4
    -rw-r--r-- 1 pi pi      0 53 16:44 AUTHORS
    drwxr-xr-x 2 pi pi   4096 53 16:40 autom4te.cache
    -rw-r--r-- 1 pi pi      0 53 16:06 autoscan.log
    -rw-r--r-- 1 pi pi      0 53 16:44 ChangeLog
    lrwxrwxrwx 1 pi pi     32 53 16:40 compile -> /usr/share/automake-1.16/compile
    -rw-r--r-- 1 pi pi   1635 53 16:48 config.h
    -rw-r--r-- 1 pi pi   1437 53 16:24 config.h.in
    -rw-r--r-- 1 pi pi  13282 53 16:48 config.log
    -rwxr-xr-x 1 pi pi  32909 53 16:48 config.status
    -rwxr-xr-x 1 pi pi 165467 53 16:22 configure
    -rw-r--r-- 1 pi pi    522 53 16:15 configure.ac
    lrwxrwxrwx 1 pi pi     32 53 16:40 COPYING -> /usr/share/automake-1.16/COPYING
    lrwxrwxrwx 1 pi pi     32 53 16:40 depcomp -> /usr/share/automake-1.16/depcomp
    lrwxrwxrwx 1 pi pi     32 53 16:40 INSTALL -> /usr/share/automake-1.16/INSTALL
    lrwxrwxrwx 1 pi pi     35 53 16:40 install-sh -> /usr/share/automake-1.16/install-sh
    -rw-r--r-- 1 pi pi    238 53 15:58 isPrime.c
    -rw-r--r-- 1 pi pi     31 53 15:59 isPrime.h
    -rw-r--r-- 1 pi pi  24245 53 16:48 Makefile
    -rw-r--r-- 1 pi pi     95 53 16:39 Makefile.am
    -rw-r--r-- 1 pi pi  24453 53 16:45 Makefile.in
    lrwxrwxrwx 1 pi pi     32 53 16:40 missing -> /usr/share/automake-1.16/missing
    -rw-r--r-- 1 pi pi      0 53 16:44 NEWS
    -rw-r--r-- 1 pi pi      0 53 16:44 README
    -rw-r--r-- 1 pi pi     23 53 16:48 stamp-h1
    -rw-r--r-- 1 pi pi    242 53 16:00 test.c
    

    会发现这个时候已经生成了 Makefile 文件。

  3. 执行 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 53 16:19 aclocal.m4
    -rw-r--r-- 1 pi pi      0 53 16:44 AUTHORS
    drwxr-xr-x 2 pi pi   4096 53 16:40 autom4te.cache
    -rw-r--r-- 1 pi pi      0 53 16:06 autoscan.log
    -rw-r--r-- 1 pi pi      0 53 16:44 ChangeLog
    lrwxrwxrwx 1 pi pi     32 53 16:40 compile -> /usr/share/automake-1.16/compile
    -rw-r--r-- 1 pi pi   1635 53 16:48 config.h
    -rw-r--r-- 1 pi pi   1437 53 16:24 config.h.in
    -rw-r--r-- 1 pi pi  13282 53 16:48 config.log
    -rwxr-xr-x 1 pi pi  32909 53 16:48 config.status
    -rwxr-xr-x 1 pi pi 165467 53 16:22 configure
    -rw-r--r-- 1 pi pi    522 53 16:15 configure.ac
    lrwxrwxrwx 1 pi pi     32 53 16:40 COPYING -> /usr/share/automake-1.16/COPYING
    lrwxrwxrwx 1 pi pi     32 53 16:40 depcomp -> /usr/share/automake-1.16/depcomp
    lrwxrwxrwx 1 pi pi     32 53 16:40 INSTALL -> /usr/share/automake-1.16/INSTALL
    lrwxrwxrwx 1 pi pi     35 53 16:40 install-sh -> /usr/share/automake-1.16/install-sh
    -rw-r--r-- 1 pi pi    238 53 15:58 isPrime.c
    -rw-r--r-- 1 pi pi     31 53 15:59 isPrime.h
    -rw-r--r-- 1 pi pi   4660 53 16:51 isPrime.o
    -rw-r--r-- 1 pi pi  24245 53 16:48 Makefile
    -rw-r--r-- 1 pi pi     95 53 16:39 Makefile.am
    -rw-r--r-- 1 pi pi  24453 53 16:45 Makefile.in
    lrwxrwxrwx 1 pi pi     32 53 16:40 missing -> /usr/share/automake-1.16/missing
    -rw-r--r-- 1 pi pi      0 53 16:44 NEWS
    -rw-r--r-- 1 pi pi      0 53 16:44 README
    -rw-r--r-- 1 pi pi     23 53 16:48 stamp-h1
    -rwxr-xr-x 1 pi pi  13252 53 16:51 test
    -rw-r--r-- 1 pi pi    242 53 16:00 test.c
    -rw-r--r-- 1 pi pi   5520 53 16:51 test.o
    

    可以看到最终的可执行文件 test 已经成功生成了。

  4. 运行 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 的示例就完成了。


【参考资料】

Linux c 开发 - Autotools使用详细解读

Autoconf

automake


本文链接:https://blog.csdn.net/u012028275/article/details/124557928

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值