說明
從零開始編寫automake工程非常復雜也沒有必要,我們只要能看懂開源項目的automake即可,然后根據自己實際情況進行修改即可,下面給出兩個比較好的參考項目,其中spice-gtk涵蓋了使用libtool生成動態庫的方法,后面所有的教程都是根據這兩個模板進行改編
spice-gtk
virt-viewer
宏 |
作用 |
示例 |
AC_PREREQ |
autoconf最低版本 |
AC_PREREQ([2.69]) |
AC_INIT |
初始化包信息,將會自動生成PACKAGE_NAME、PACKAGE_VERSION、PACKAGE_BUGREPORT宏 |
AC_INIT([Porject], [1.0], [fwdssg.love@163.com]) |
AC_CONFIG_SRCDIR |
通過檢測目錄中必定存在的文件來判斷目錄是否存在 |
AC_CONFIG_SRCDIR([src/main.cpp]) |
AC_CONFIG_HEADERS |
生成config.h文件保存configure.ac定義的宏,此文件可被源文件包含 |
AC_CONFIG_HEADERS([config.h]) |
AC_CONFIG_MACRO_DIRS |
指定本地宏文件的存放目錄,.m4后綴的文件都將被保存進此目錄,acloacl命令會自動創建此目錄 |
AC_CONFIG_MACRO_DIRS([m4]) |
AC_CONFIG_AUX_DIR |
指定輔助腳本文件的存放目錄 |
AC_CONFIG_AUX_DIR([build-aux]) |
AC_MSG_CHECKING |
打印"checking XXX ..." |
AC_MSG_CHECKING([for native Win32]) |
AC_MSG_RESULT |
打印checking結果並另起新行 |
AC_MSG_RESULT([$os_win32]) |
AC_PROG_INSTALL |
生成安裝腳本 install-sh |
AC_PROG_INSTALL |
AC_PROG_LIBTOOL |
使得configure能夠支持--enable-shared、--disable-shared、--enable-static、--disable-static、--with-pic和--without-pic參數 |
AC_PROG_LIBTOOL |
AC_PROG_CXX |
自動檢測要使用的C++編譯器 |
AC_PROG_CXX |
AC_PROG_CC |
自動檢測要使用的C編譯器 |
AC_PROG_CC |
AC_CHECK_HEADERS |
檢測系統頭文件是否存在 |
AC_CHECK_HEADERS([sys/socket.h netinet/in.h arpa/inet.h]) |
AC_SUBST |
輸出能夠被Makefile.am使用的變量 |
AC_SUBST(GLIB2_CFLAGS) |
AC_CONFIG_SUBDIRS |
configure子目錄 |
AC_CONFIG_SUBDIRS([spice-common]) |
PKG_CHECK_MODULES |
檢測對應模塊是否存在 |
PKG_CHECK_MODULES([SPICE_PROTOCOL], [spice-protocol >= 0.12.11]) |
AC_CHECK_FUNCS |
檢測對應函數是否可用 |
AC_CHECK_FUNCS([setlocale]) |
AC_ARG_ENABLE |
為configure添加--XX選項 |
AC_ARG_ENABLE([gstaudio],AS_HELP_STRING([--enable-gstaudio=@<:@yes/auto/no@:>@], [Enable the GStreamer 1.0 audio backend @<:@default=auto@:>@]),[],[enable_gstaudio="auto"]) |
AC_OUTPUT |
運行configure后生成的config腳本需要處理的文件,將Makefile.in變成Makefile |
AC_OUTPUT([Makefile]) |
AM_INIT_AUTOMAKE |
初始化automake |
AM_INIT_AUTOMAKE([subdir-objects -Wno-portability]) |
AM_GNU_GETTEXT |
初始化gettext |
AM_GNU_GETTEXT([external]) |
AM_GNU_GETTEXT_VERSION |
指定gettext最低版本 |
AM_GNU_GETTEXT_VERSION([0.19.7]) |
IT_PROG_INTLTOOL |
初始化並指定libtool最低版本 |
IT_PROG_INTLTOOL([0.35.0]) |
AM_CONDITIONAL |
根據條件來定義宏 |
AM_CONDITIONAL([OS_WIN32],[test "$os_win32" = "yes"]) #如果$os_win32的值為yes則#define OS_WIN32宏 |
Makefile.am宏定義說明
宏 |
作用 |
示例 |
ACLOCAL_AMFLAGS |
指定宏文件的存放目錄,與AC_CONFIG_MACRO_DIRS成配合使用 |
ACLOCAL_AMFLAGS = -I m4 |
SUBDIRS |
指定需要遞歸automake的子文件夾,即存在Makefile.am的子文件夾 |
SUBDIRS = spice-common src man po doc data |
EXTRA_DIST |
指定要被打包的額外文件,即執行make dist 時需要被放入壓縮包的文件,一般是不需要參與編譯但是又需要被使用的文件,比如圖片目錄里的圖片 |
EXTRA_DIST = $(PACKAGE).spec |
DISTCLEAN_FILES |
執行make distclean 時候需要刪除的文件,一般是EXTRA_DIST中的.in文件生成的不需要打包的中間文件 |
DISTCLEAN_FILES = $(PACKAGE).spec |
MAINTAINERCLEANFILES |
執行make maintainer-clean時候需要刪除的文件,即執行autoreconf -vfi 、intltoolize --force 以及configure 或執行autogen.sh 后能夠重新生成的文件都要放入其中 |
MAINTAINERCLEANFILES = $(srcdir)/AUTHORS |
dist-hook |
執行make dist 時需要執行的腳本 |
dist-hook: gen-ChangeLog gen-AUTHORS |
bin_PROGRAMS |
要生成的可執行文件 |
bin_PROGRAMS = spicy |
XX_SOURCES |
編譯可執行文件所需的源文件 |
spicy_SOURCES = spicy.c |
XX_LIBADD |
鏈接參數,即pkg-config --libs 的結果 |
spicy_stats_LDADD = libspice-client-glib-2.0.la |
XX_CFLAGS |
編譯參數,即pkg-config --cflags 的結果和-D 之類的宏定義 |
libvirt_viewer_la_CFLAGS = -DLOCALE_DIR=""./../share/locale"" $(GLIB2_CFLAGS) |
nodist_XX_SOURCES |
執行make dist 時不需要被打包的源文件,一般是根據其他源文件通過腳本臨時生成的中間源文件,比如使用glib-genmarshal 生成的文件 |
nodist_libspice_client_glib_2_0_la_SOURCES = spice-marshal.c spice-marshal.h |
LDADD |
無法被configure找到但是又需要鏈接的庫或資源文件,例如臨時生成的windows下使用的rc文件 |
LDADD += virt-viewer_rc.$(OBJEXT) |
dist_XX_DATA |
程序運行需要的數據文件,比如圖標、配置文件等 |
dist_cfg_DATA = xx.cfg |
dist_bin_SCRIPTS |
程序的腳本文件,將被安裝到bin目錄 |
dist_bin_SCRIPTS = xx.sh |
實際問題處理
# 在對應源文件的Makefile.am中添加
CPPFLAGS = -DSYSCONFDIR='"$(sysconfdir)"'
# 編輯POTFILES.in文件
[type: gettext/glade] src/filename.glade
- 語言國際化textdomain加載成功但是程序卻沒翻譯
# Ubuntu
語言必須帶后綴.utf8,即LANG=zh_CN.utf8而不能直接使用LANG=zh_CN
# Fedora
使用系統頭文件#include <glib/gi18n.h>,而不要自定義