Autoconf/automake step by step

本文详细介绍如何使用Autoconf和Automake快速搭建可执行文件及共享库工程。从配置文件生成到Makefile.am编写,再到自动化脚本创建,提供了一套完整的实践方案。

Autoconf/automake step by step

Autoconf/automake 在开源社区里,它的重要性可以说不下于gcc,目前除了Xfree86外,几乎所有的开源项目都使用Autoconf/automake,甚至Xfree86的开发人员已经计划抛弃imake,而采用Autoconf/automake作为工程管理工具了。

Autoconf/automake冗长的手册让我犯晕。虽然我曾耐着性子浏览过一遍,但是决大部分内容,在日常工作根本用不上。加上建立工程的机会并不多,等到下一次要建立时,上次学到的知识早忘光了,还得去看手册,真是麻烦。

大多数时候,我更需要的是step by step的指南,只有在特殊情况下,要使用Autoconf/automake的高级功能时候,我才愿意去查手册。最近刚好建过几个工程,记个笔记吧,以便下次查阅。

一、建立可执行文件工程。

l 前提:

项目目录:helloworld

源文 件:helloworld/src/helloworld.c

l autoscan产生configure.in的框架:

[root@linux helloworld]# autoscan

[root@linux helloworld]# mv configure.scan configure.in

打开configure.in,我们可以看到:

# -*- Autoconf -*-

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

AC_PREREQ(2.59)

AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

AC_CONFIG_SRCDIR([src/helloworld.c])

AC_CONFIG_HEADER([config.h])

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT

这个文件并不能直接使用,要做几处修改才行。

AC_INIT的参数要换成实际的参数。

AC_OUTPUT中要指明实际要生成的文件。

增加automake的初始化宏。

我们把它修改为:

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

AC_PREREQ(2.59)

AC_INIT(helloworld, 0.1, jim@jim.com)

AC_CONFIG_SRCDIR([src/helloworld.c])

AC_CONFIG_HEADER([config.h])

AM_INIT_AUTOMAKE(helloworld, 0.1)

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT([

Makefile

src/Makefile

])

l 建立根顶层目录中的Makefile.am,用SUBDIRS指明子目录。

SUBDIRS=src

l 建立src目录中的Makefile.am,这里我们生成的可执行文件名为helloworld,安装目录为${prefix}/bin。如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS

bin_PROGRAMS=helloworld

helloworld_SOURCES=helloworld.c

l 在顶层目录中建立几个空文件。

[root@linux helloworld]# touch NEWS README ChangeLog AUTHORS

l 拷贝automake必要的文件。

[root@linux helloworld]# cp -f /usr/share/automake-1.9/depcomp .

[root@linux helloworld]# cp -f /usr/share/automake-1.9/compile .

l 建立autogen.sh

#!/bin/bash

aclocal

autoheader

autoconf

automake -a

./configure

[root@linux helloworld]# chmod 755 autogen.sh

l 测试一下

[root@linux helloworld]# ./autogen.sh ;make;make install

OK

二、建立共享库工程。

l 前提:

项目目录:helloworld

源文 件:helloworld/src/helloworld.c

头文 件:helloworld/src/helloworld.h

l autoscan产生configure.in的框架:

[root@linux helloworld]# autoscan

[root@linux helloworld]# mv configure.scan configure.in

打开configure.in,我们可以看到:

# -*- Autoconf -*-

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

AC_PREREQ(2.59)

AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

AC_CONFIG_SRCDIR([src/helloworld.c])

AC_CONFIG_HEADER([config.h])

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT

这个文件并不能直接使用,要做几处修改才行。

AC_INIT的参数要换成实际的参数。

AC_OUTPUT中要指明实际要生成的文件。

增加automake的初始化宏。

增加libtool检查。

我们把它修改为:

# -*- Autoconf -*-

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

AC_PREREQ(2.59)

AC_INIT(helloworld, 0.1, jim@jim.com)

AC_CONFIG_SRCDIR([src/helloworld.c])

AC_CONFIG_HEADER([config.h])

AM_INIT_AUTOMAKE(helloworld, 0.1)

# Checks for programs.

AC_PROG_CC

AC_LIBTOOL_DLOPEN

AC_PROG_LIBTOOL

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT([

Makefile

src/Makefile

])

l 建立根顶层目录中的Makefile.am,用SUBDIRS指明子目录。

SUBDIRS=src

l 建立src目录中的Makefile.am,这里我们生成的共享文件名为libhelloworld.la,安装目录为${prefix}/lib,头文件安装到${prefix}/include/helloworld/

lib_LTLIBRARIES = libhelloworld.la

libhelloworld_la_SOURCES=helloworld.c

libhelloworld_la_CFLAGS=-I./

libhelloworld_la_LDFLAGS=

helloworldincludedir=$(includedir)/helloworld

helloworldinclude_HEADERS= helloworld.h

l 在顶层目录中建立几个空文件。

[root@linux helloworld]# touch NEWS README ChangeLog AUTHORS

l 拷贝automakelibtool必要的文件。

[root@linux helloworld]# cp -f /usr/share/automake-1.9/depcomp .

[root@linux helloworld]# cp -f /usr/share/automake-1.9/compile .

[root@linux helloworld]# cp -f /usr/share/libtool/ltmain.sh .

l 建立autogen.sh

#!/bin/bash

aclocal

autoheader

autoconf

automake -a

./configure

[root@linux helloworld]# chmod 755 autogen.sh

l 测试一下

[root@linux helloworld]# ./autogen.sh ;make;make install

OK

还是出现这个问题 zhihonghe@ubuntu:~/Desktop/docker-ub-18$ sudo docker build -t ubuntu_openwrt_18 -f Dockerfile . Sending build context to Docker daemon 8.704kB Step 1/23 : FROM ubuntu:18.04 ---> f9a80a55f492 Step 2/23 : LABEL Authors="Kun Liu <liukun@tp-link.com.hk> " ---> Using cache ---> 0c24f88a2436 Step 3/23 : LABEL Description="Broadcom SDK Build based on 18.04 LTS" Version="1.0" ---> Using cache ---> 6e934d1e19e4 Step 4/23 : ENV STAGINGDIR="" ---> Using cache ---> b30883665d79 Step 5/23 : ENV CONFIGDIR="" ---> Using cache ---> 60ee218d114e Step 6/23 : ENV PACKAGEDIR="" ---> Using cache ---> 13d94fd9880e Step 7/23 : RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections ---> Using cache ---> 597ec0c7bcd1 Step 8/23 : RUN apt-get clean && apt-get update && apt-get install --yes --no-install-recommends --no-install-suggests build-essential net-tools inetutils-ping libncurses5-dev libdigest-crc-perl libpopt-dev xxd liblzo2-dev zlib1g-dev lib32z1 libssl-dev libglib2.0-dev libreadline-dev libjson-c-dev libxml2-dev libsqlite3-dev sqlite3 libuv1-dev libxslt1-dev libfcgi-dev libevent-dev libyajl-dev liburiparser-dev libwebsockets-dev locales lua5.1 liblua5.1-dev python python3 python3-dev python3-pip git git-lfs subversion autoconf automake pkg-config ccache cmake ninja-build clang-tools-6.0 bison flex gettext ca-certificates libtool patch vim unzip uuid-dev wget curl cpio bc gawk gdb valgrind diffstat chrpath texinfo ssh openssh-client openssh-server netbase quilt protobuf-c-compiler dropbear-bin openvswitch-switch tmux dirmngr lighttpd alien mlocate iproute2 dos2unix lsb-release rsync gdisk man pax moreutils npm sudo ---> Running in 055b66ac3c61 Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB] Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [102 kB] Get:3 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [1637 kB] Get:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [102 kB] Get:5 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [102 kB] Get:6 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB] Get:7 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB] Get:8 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [1688 kB] Get:9 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [3373 kB] Get:10 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB] Get:11 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [23.8 kB] Get:12 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB] Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [2411 kB] Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [30.8 kB] Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [3786 kB] Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [1728 kB] Get:17 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [20.6 kB] Get:18 http://archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [64.0 kB] Fetched 28.2 MB in 19s (1467 kB/s) Reading package lists... Reading package lists... Building dependency tree... Reading state information... Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation: The following packages have unmet dependencies: npm : Depends: node-gyp (>= 0.10.9) but it is not going to be installed E: Unable to correct problems, you have held broken packages. The command '/bin/sh -c apt-get clean && apt-get update && apt-get install --yes --no-install-recommends --no-install-suggests build-essential net-tools inetutils-ping libncurses5-dev libdigest-crc-perl libpopt-dev xxd liblzo2-dev zlib1g-dev lib32z1 libssl-dev libglib2.0-dev libreadline-dev libjson-c-dev libxml2-dev libsqlite3-dev sqlite3 libuv1-dev libxslt1-dev libfcgi-dev libevent-dev libyajl-dev liburiparser-dev libwebsockets-dev locales lua5.1 liblua5.1-dev python python3 python3-dev python3-pip git git-lfs subversion autoconf automake pkg-config ccache cmake ninja-build clang-tools-6.0 bison flex gettext ca-certificates libtool patch vim unzip uuid-dev wget curl cpio bc gawk gdb valgrind diffstat chrpath texinfo ssh openssh-client openssh-server netbase quilt protobuf-c-compiler dropbear-bin openvswitch-switch tmux dirmngr lighttpd alien mlocate iproute2 dos2unix lsb-release rsync gdisk man pax moreutils npm sudo' returned a non-zero code: 100
11-08
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值