公司 make makefile 工具

來源:互聯網
上載者:User


make工具概述

為了規範,通用與移植性,Makefile採用GNU的automake系列工具產生。除非實驗性質的項目, 一般來說,不建議自己書寫Makefile。
GNU的Makefile產生工具由,aclocal,autoconf,libtoolize, automake組成。
Aclocal產生m4指令碼。
Autoconf根據configure.ac(在早前版本稱為configure.in)產生configure。
libtoolize,產生動態庫所需要的指令碼。
automake,根據Makefile.am,產生Makefile.in。
configure,根據Makefile.in產生Makefile。

準備條件安裝

ubuntu 8.04

sudo apt-get install autoconfsudo apt-get install automakesudo apt-get install libtool

redhat 5.x
make tools的rpm包都位於安裝光碟片中,不同版本的rpm包,包名除了版本號碼外都一致。

   rpm -ivh autoconf-xxx.rpm   rpm -ivh automake-xxx.rpm   rpm -ivh libtool-xxx.rpm
產生步驟

如,項目名為,myproject,目錄如下:

--myproject+           +--configure.ac           +--Makefile.am           +--src+                 +Makefile.am                 +libmyproject.c                 +myprojectbin.c

產生步驟如下:

$ aclocal$ autoconf$ libtoolize -f -c$ automake -a$ touch NEWS$ touch README$ touch AUTHORS$ touch ChangeLogs$ automake$ ./configure$ make$ sudo make install
configure.ac

configure.ac的書寫原則。

  • 所有需要用的第三方庫,都需要通過PKG_CHECK_MODULES之類的函數來檢測。這類指令碼除了可以在編譯前檢測是否存在需要的庫,最大的 優點是可以自動在Makefile中加入xxx_LDADD這類參數,保證了Makefile.am的簡潔。另外,有些庫的標頭檔與庫檔案比較多,很難用 簡單的一句話書寫。
  • 代碼中需要的宏,都在configure.ac中定義。
  • 自訂的configure參數,應當在configure.ac中實現。 以下是範例configure.ac。
    #                                               -*- 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/myprojectbin.c])AM_INIT_AUTOMAKE()# Checks for programs.AC_PROG_CXXAC_PROG_CCAC_PROG_LIBTOOL# Checks for libraries.PKG_CHECK_MODULES([libmyproject_la], [glib-2.0], [], [    AC_MSG_ERROR(["Error! You need to have libglib2.0 installed."])    ])PKG_CHECK_EXISTS([cppunit], [], [    AC_MSG_ERROR(["Error! You need to have libcppunit-dev installed. Try sudo apt-get install libcppunit-dev."])    ])# Checks for header files.AC_CHECK_HEADERS([stdlib.h stdio.h])# Checks for typedefs, structures, and compiler characteristics.AC_HEADER_STDBOOLAC_TYPE_SIZE_TAC_ARG_WITH(debug,    [AS_HELP_STRING([--with-debug], [enable debugging output])],    [        if test $withval != "no"; then            AC_SUBST(AM_CFLAGS, ["-g3 -O0 -Wall"])            AC_SUBST(AM_CXXFLAGS, ["-g3 -O0 -Wall"])            AC_DEFINE([WITH_DEBUG],1)        fi    ])#cppunit_cflags=`pkg-config --cflags cppunit`#cppunit_libs=`pkg-config --libs cppunit`#AM_CPPFLAGS="$cppunit_cflags"#AM_LDFLAGS="$cppunit_libs"#AC_SUBST(AM_CPPFLAGS)#AC_SUBST(AM_LDFLAGS)# Checks for library functions.AC_FUNC_MALLOCAC_CHECK_FUNCS([memset])AC_DEFINE(_LARGEFILE64_SOURCE)AC_DEFINE(_XOPEN_SOURCE, [500])AC_DEFINE(_FILE_OFFSET_BITS, [64])AC_DEFINE(_GNU_SOURCE)AC_CONFIG_FILES([Makefile                 src/Makefile])AC_OUTPUT
Makefile.am

Makefile.am的書寫原則是:

  • 包含所有需要編譯的可執行檔或庫。
  • 包含可執行檔或庫相對應的原始碼。
  • 包含需要安裝的檔案,如標頭檔、設定檔。
  • 需要引用的標頭檔,儘可能採用已經安裝過的系統絕對目錄。
  • 儘可能不要通過在xxx_CFLAGS中加入-I來指定標頭檔位置,除非需要引用的標頭檔不在/usr/include或/usr/local/include下,而是位於/opt/xxx/include之類的目錄下。
  • 儘可能不要通過在xxx_LDADD中加入-L或-l來指定庫檔案位置,正確的做法應該是在configure.ac中完成這些事。
  • 調試資訊的添加,應當通過設定CFLAGS或CXXFLAGS環境變數來完成,然後執行configure,會保證在編譯的時候是根據環境變數來 決定是否需要調試資訊。不要在Makefile中用CFLAGS,CXXFLAGS,xxx_CFLAGS,xxx_CXXFLAGS來設定調試資訊。這 樣每次發布前都要修改Makefile.am,不利於cvs維護。 以下是範例Makefile.am
    AUTOMAKE_OPTIONS = foreignlib_LTLIBRARIES = libmyproject.lalibmyproject_la_SOURCES = libmyproject.clibmyproject_la_LIBADD = libmyproject_la_CPPFLAGS = $(AM_CPPFLAGS)libmyproject_la_LDFLAGS =  $(AM_LDFLAGS)bin_PROGRAMS = myprojectbinmyprojectbin_SOURCES = myprojectbin.cmyprojectbin_LDADD = myprojectbin_CPPFLAGS = include_HEADERS = libmyproject.hsysconfdir = /etcsysconf_DATA = libmyproject.conf

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.