Using Automake and Autoconf「建议收藏」

引用自:http://www.pigfoot.org/cc/devel/auto1/ MurrayCumming<murrayc@usa.net>ChenChih-Chia<pigfoot@CDPA.nsysu.edu.tw>May28,2005(Updated)Abstract在Unix底下,automake和au…

大家好,又见面了,我是你们的朋友全栈君。

引用自:

http://www.pigfoot.org/cc/devel/auto1/

 

Murray Cumming <murrayc@usa.net>
Chen Chih-Chia <pigfoot@CDPA.nsysu.edu.tw>

May 28, 2005 (Updated)

Abstract

在 Unix 底下,automakeautoconf 常被用來管理 C/C++ 的專案。 如果您的專案是根據 GNU 的標準建構出來的,那麼它們能夠幫您節省很多 make 以及 configure 的時間。然而,萬事起頭難。希望這篇指南能夠為剛入門的程式設計師提供一些有用的資訊。

我不是 Unix 以及 autoconf, automake 的專家,所以我歡迎有建設性的批評與指教。

make and configure

這個 make tool 能夠用來管理多個檔案的專案。make 會用到您專案裡的 Makefile 這個檔案,這個檔案列出了各式的編譯以及連結步驟,目的,以及一些相依關係。多檔的專案與 GNU 的 make 工具程式是有很大的關係的。

configure 這個 script 被用來協助處理跨平台的編譯工作。一個合適的 configure script 能夠正確的解譯 Makefile.in 然後產生該平台相依的 Makefile。當然。產生 Makefile 之前必須經過很多測試來決定該平台的特性。

所以我們允許使用者執行 ‘./configure ‘ 然後再執行 ‘make ‘ 來根據自身的平台而編譯這個專案。

aclocal.m4

很明顯的,大部分寫好的 Makefile 和 configure script 看起來都非常的類似。事實上,GNU 提供了一些關於這些檔案的細部描述。因此,GNU 寫出了 automake 以及 autoconf 來簡化處理這些過程,並且確保 Makefile 以及 configure script 能夠遵守 GNU 標準。

這裡是這些工具的簡單的介紹。我這裡也提供了範例供您測試使用。

注意 :這些工具使用 m4 程式語言。 aclocal 增加 aclocal.m4 這個檔案到您的專案目錄,因為包含了一些需要用到的 m4 巨集。

autoconf

autoconf 會尋找叫做 configure.in 這個檔案,然後會根據他找到的巨集而生出 configure script。

注意要的是 autoscan 可以用來產生一個可能使用的 configure.in。它會測試你的原始檔案,然後放進一些建議值到一個叫做 configure.scan 的檔案。當然您必須改名成 configure.in

不管什麼時候,您在 configure.in 加入一個巨集時,然後必須執行 aclocalautoconf ,因為 aclocal 會掃描 configure.in 然後找出它必須提供的巨集。

Lines which every configure.in should have

每一個 configure.in 應該有底下這幾行:

AC_INIT(hello.cc)
AM_INIT_AUTOMAKE(hello,0.1)
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
AC_OUTPUT(Makefile)

AC_INIT
這個巨集以一個原始檔當作參數。它會檢查該檔是否存在,也會檢查目錄是否存在。

AM_INIT_AUTOMAKE
這行增加了幾個標準的檢查。它是以程式名稱以及版本號碼當作參數。

AC_PROG_CC
指出了該原始檔是用 C 寫成的。假如原始檔是用 C++ 寫成的,那麼應該改成 AC_PROG_CXX

AC_PROG_INSTALL
會產生安裝目的地,好讓使用者打 make install 便能安裝這套軟體。

AC_OUTPUT
指出應該產生的 Makefile 檔案名稱。

Using a Config Header

AM_CONFIG_HEADER(config.h) 這行指出了您將會使用 config.h 檔。autoconf 將會需要 config.h.in ,並將之處理成 config.h。這是你的原始檔案中,透過 #define 定義的標頭檔,好提供一個方式讓人們為它們的平台自訂 configuration。config.h.in 能夠被 autoheader 這個工具程式自動產生。

然而,在你的專案中,你需要 stamp-h 這個檔案來確保 automake 從 config.h.in 重新產生 config.h。執行 ‘touch stamp-h ‘ 讓您的專案新增這個檔案。

automake

automake 會尋找 Makefile.am 這個檔案,然後依據它找到的巨集產生 Makefile.in。當然,這個會在稍後的 configure script 用到。

GNU-style projects, or not

因為預設值 automake 會嘗試產生 GNU-style 的專案,因此如果一些該有的檔案不存在,automake 會向您抱怨。所以您可以用以下指令產生需要的空白文件:

touch NEWS README AUTHORS ChangeLog

如果您不需要 GNU-style 的檔案,您可以在您的 Makefile.am 增加以下這行:

AUTOMAKE_OPTIONS = foreign

Telling automake about your source files

使用下面這兩行來命名您的程式名稱,以及列出它的原始程式:

bin_PROGRAMS = hello
hello_SOURCES = hello.h hello.cc main.cc

注意:第二個變數的前置是依據第一個變數的。

The Whole Process

假設您已經概略的編輯完 Makefile.am 和 configure.in (底下有範例),藉由底下的指令,您應該能夠 build 您專案了:

autoheader
touch NEWS README AUTHORS ChangeLog
touch stamp-h
aclocal
autoconf
automake

./configure
make

當你想完整重新 build 專案,請重複最後五個步驟。

* autoheader – creates config.h.in
* aclocal – adds aclocal.m4 to directory.
* autoconf – creates configure from configure.in
* automake – Creates Makefile.in from Makefile.am
* ./configure – creates Makefile from Makefile.in

Sub Directories

當 然,專案的檔案應該被組織化的放在子目錄裡。理想上來說,原始檔和 makefile,configure scripts,以及 README 等等這些檔案,應該都放在專案的 src 這個子資料匣中。多層式的專案我們把它叫做 Deep 專案。我會列出應該處理的步驟,但是你依然可以看看範例程式。

當使用子目錄的時候,你必須坐下的步驟:

1. 增加 SUBDIRS 這一項到最頂層的 Makefile.am。例如:

SUBDIRS = doc intl po src tests

注意這些資料匣的名稱要以空白區分。

2. 在每一個子目錄中都要新增一個 Makefile.am。但是不需要 configure.in。而且要確定最頂層的 configure.in 中的 AC_OUPUT 巨集要加入檔名以產生 Makefile。

For sub directories containing additional source code

3. 增加 AC_PROG_RANLIB 巨集到您的 configure.in 。這允許您在子目錄中 build 的 code 能夠暫時放到某個暫存目錄,以便之後用來和其他 code 作連結之用。

4. 增加一些巨集到 src 下的任何原始檔目錄的 Makefile.am。這將會 build 一個不會安裝的函式庫。你需要給定以 lib 字母為開頭的函式庫名稱,並且指定該函式庫的原始碼以及標頭檔,例如:

noinst_LIBRARIES = libfoo.a
libfoo_a_SOURCES = foo.h foo.cc
INCLUDES = -I@top_srcdir@/src/includes

注意 SOURCES 巨集會使用底線 ‘_’ 來代替函式庫的名稱的點 ‘.’。而且要使用 top_srcdir 這個變數來參考到專案的最頂端。

5. 在上一層目錄使用 Makefile.am 的 LDADD 這個巨集,來連結任何可能用到這個暫時函式庫的 Code。例如:

LDADD = foofiles/libfoo.a

For sub directories containing non-source files

3. 一個子目錄下的 Makefile.am 應該包含像底下的這行:

EXTRA_DIST = somefile.txt someotherfile.html

這會告訴 automake 您要發布這些檔案,但是它們不需要編譯。

Example Files

底下就是範例檔了。它是一個使用一個標準函式庫的 C++ 專案。

看看 autoconf 和 automake 的手冊來參閱使用到的一些巨集以及變數。我不要這些範例因為註解而變的難以閱讀。

這個 Deep 專案的架構如下:

helloworld_cc

configure.in
Makefile.am

src

Makefile.am
helloworld.h
helloworld.cc
main.cc

foofiles

Makefile.am
foo.h
foo.cc

configure.in

AC_INIT(src/hello.cc)
AM_INIT_AUTOMAKE(hello,0.1)
AM_CONFIG_HEADER(config.h)
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
AC_PROG_RANLIB
AC_OUTPUT(Makefile src/Makefile src/foofiles/Makefile)

Makefile.am

SUBDIRS = src

Makefile.am for the src directory

bin_PROGRAMS = hello
INCLUDES = foofiles
hello_SOURCES = hello.h hello.cc main.cc
SUBDIRS = foofiles
LDADD = foofiles/libfoo.a

Makefile.am for foofiles directory under src

noinst_LIBRARIES = libfoo.a
libfoo_a_SOURCES = foo.h foo.cc
INCLUDES = -I@top_srcdir@/

您可以下載這個簡單的範例檔: helloworld_cc-0.3.tar.gz

Related Link

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127614.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pidstat_使用pidstat查看进程资源使用情况

    pidstat_使用pidstat查看进程资源使用情况引言在查看系统资源使用情况时,很多工具为我们提供了从设备角度查看的方法。例如使用iostat查看磁盘io统计信息:linux:~#iostat-d3Device:tpsBlk_read/sBlk_wrtn/sBlk_readBlk_wrtnsda1.670.0040.000…

    2025年5月23日
    4
  • redis集群搭建(非常详细,适合新手)_redis集群模式

    redis集群搭建(非常详细,适合新手)_redis集群模式一、基本环境首先我们需要使用VMware配置几个虚拟机,我们需要安装VMWare然后下载自己的linux镜像文件,在虚拟机上安装linux系统,vm15和centos7下载传送门提取码:lvb5。我使用的是centos764,大致步骤可以根据其他博客将第一台虚机的系统安装成功,然后直接clone这台机器就可以了,然后需要修改ip。二、准备相关软件安装包…

    2022年10月15日
    2
  • tcp粘包分析_解决tcp粘包问题

    tcp粘包分析_解决tcp粘包问题原文源自:https://blog.csdn.net/zhangxinrun/article/details/6721495一.两个简单概念长连接与短连接:1.长连接   Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。2.短连接   Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种…

    2022年8月11日
    5
  • 关于坑爹的编解码问题

    关于坑爹的编解码问题

    2021年5月26日
    119
  • Quartz异常-Error creating bean with name ‘org.springframework.scheduling.quartz.SchedulerFactoryBean「建议收藏」

    Quartz异常-Error creating bean with name ‘org.springframework.scheduling.quartz.SchedulerFactoryBean「建议收藏」目录一、问题描述二、问题分析三、问题解决四、工程源码4.1maven配置4.2 web.xml4.3spring配置文件4.4 Quartz配置文件4.5定时任务类4.6工程总体结构一、问题描述  今天使用Quartz+Spring测试定时任务时,发现报异常:Errorcreatingbeanwithname’org.spring…

    2022年5月23日
    42
  • Pytest(1)安装与入门[通俗易懂]

    Pytest(1)安装与入门[通俗易懂]pytest介绍pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。根据pytest的官方网站介绍,它

    2022年7月28日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号