自動生成makefile流程
如圖所示為automake,autoconf生成makefile的過程(簡化)。
為壹個項目源文件生成makefile並make的步驟如下:
操作在包含源文件的項目目錄下進行。
(1). 運行autoscan,生成文件configure.scan。
(2). 修改configure.scan,改名為configure.in。
(3).運行autoheader,生成文件configure.h.in(現在壹般改為configure.ac)。configure.in裏有宏AC_CONFIG_HEADER()時用。
(4).運行libtoolize,生成壹些支持文件,ltmain.sh。需要用libtool生成***享庫用。
(5).運行allocal,生成aclocal.m4。
(6). 運行autoconf,生成configure。
(7).為源文件編寫makefie.am,每壹個包含源文件的目錄和子目錄都有壹個makefile.am。
(8).運行automake,生成makefile.in,每個包含makefile.am的子目錄都生成makefile.in。
automake -a選項可以補齊文件config.guess,config.sub,install-sh,missing,depcomp。
(9).運行./configure,生成config.status,config.h,makefile。
(10).運行make,生成中間文件對象文件,庫文件,最後生成可執行文件。
(11).運行make install,相應的可執行文件,庫文件,頭文件拷貝到系統相應位置。
自動生成makefile例子
這個例子***有三個C文件,main.c,add/add.c和sub/sub.c。源代碼如下:
/*main.c*/
#include
int main(void)
{
printf("%d\n",add(sub(100,5),1));
return 0;
}
/* add/add.c */
int add(int x,int y)
{
return x+y;
}
/* sub/sub.c */
int sub(int x,int y)
{
return x-y;
}
這個例子中add.c和sub.c被編譯成動態連接庫,然後main.c與這兩個庫連接生成可執行文件。
1.手動輸入configure.in和makefile.am
Q:自動生成makefile需要手動輸入什麽文件,作用是什麽?
按照上面的步驟執行,需要手動輸入的文件只有兩類configure.in和makefile.am。
(1).手動修改configure.in
autoscan運行後configure.scan文件為(系統不壹樣可能略有會不同)
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.63])
AC_INIT([FULL-PACKAGE-NAME],[VERSION],[BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT
手動修改為configure.in:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.63])
AC_INIT(hellobb,1.0,[])
AM_INIT_AUTOMAKE(hellobb,1.0)
AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT(Makefile add/Makefile sub/Makefile)
其中宏AC_INIT和AC_OUTPUT是必需的,AC_INIT放在開頭,AC_OUTPUT放在結尾。
AC_INIT:說明軟件包的名字,版本等。
AC_OUTPUT:說明生成的shell腳本文件configure運行後輸出的文件。
AM_INIT_AUTOMAKE:用automake需要的宏。
AC_PROG_CC:決定要使用的C編譯器。如果環境變量CC沒有值,檢查gcc和cc,別的C編譯器。設置變量CC的值為找到的編譯器名稱。
AC_PROG_LIBTOOL:檢查LIBTOOL。
AC_CONFIG_SRCDIR([main.c]):./configure檢查在給它的目錄裏是否有main.c文件。
AC_CONFIG_HEADER([config.h]):./configure從config.h.in中生成config.h文件,config.h文件是包含了很多#define宏的c頭文件。當編譯文件的時候,用壹個宏-DHAVE_CONFIG_H代替原來需要用-Dmacro傳遞的所有預處理宏集合。
例如屏蔽掉這句#AC_CONFIG_HEADER([config.h]),make時編譯main.c的命令是
gcc -DPACKAGE_NAME=\"hellobb\" -DPACKAGE_TARNAME=\"hellobb\" -DPACKAGE-VERSION=\"1.0\" -DPACKAGE_STRING=\"hellobb\ 1.0\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"hellobb\" -DVERSION=\"1.0\" -DSTDC_HEADERS=1 _DHAVE_SYS_TYPES_H=1 -DHAVE_UNISTDLIB_H=1 -DHAVE_STING_H=1 -DHAVE_MEMORY_H=1 -dHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\"./libs/\" -I. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.c main.c
如果啟用AC_CONFIG_HEADER([config.h]),make時編譯main.c的命令是
gcc -DHAVE_CONFIG_H -I. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
上面那些宏-Dmacro都包含在config.h裏了,我們只需要給編譯器傳遞-DHAVE_CONFIG_H就行了。