GNU的make命令、makefile編寫

makefile簡介


  • makefile可實現工程的自動化編譯,只需一個make命令即可一鍵完成。makefile定義了一些規則,指定哪些文件需要先編譯、後編譯、重新編譯等。

  • 一般的C或者C++程式,都需要先編譯成中間文件,windows下為.obj文件,UNIX下為.o文件,這個過程稱為編譯(compile)。

  • 每個原文件都應該對應一個中間文件(.obj文件或者.o文件),把大量的中間文件合成執行文件的過程,稱為鏈接(Link);鏈接時,主要是鏈接函數和變數,即可以使用.obj文件或者.o文件鏈接應用程式。鏈接器只關係函數的中間文件,不關心源文件的位置,為了避免大量的中間文件的複雜管理,需給中間文件打包,windows下稱為庫文件(Library File),即.lib文件,UNIX下為Archive File,即 .a文件。

makefile規則


流程

目標 : 需要的條件(注意 : 兩邊的空格)
    命令(以Tab鍵開頭)

解釋一下:

  • 目標 可以是一個或者多個,可以是ObjectFile文件、執行文件、甚至標籤
  • 條件 指的是 依賴的文件或者目標
  • 命令 指的是 生成目標需要執行的腳本

總結:即一條makefile規則定義了編譯的依賴關係,目標文件依賴於條件,生成規則用命令

舉個例子

objects = main.o kbd.o command.o display.o /
              insert.o search.o files.o utils.o
    edit : $(objects)
            cc -o edit $(objects)
    main.o : main.c defs.h
            cc -c main.c
    kbd.o : kbd.c defs.h command.h
            cc -c kbd.c
    command.o : command.c defs.h command.h
            cc -c command.c
    display.o : display.c defs.h buffer.h
            cc -c display.c
    insert.o : insert.c defs.h buffer.h
            cc -c insert.c
    search.o : search.c defs.h buffer.h
            cc -c search.c
    files.o : files.c defs.h buffer.h command.h
            cc -c files.c
    utils.o : utils.c defs.h
            cc -c utils.c
    clean :
            rm edit $(objects)

make命令


  1. 首先在當前目錄下尋找”makefile”或者”Makefile”文件找到,則定位到第一個目標文件(target),上例中,會找到”edit”文件,並把此文件作為最終目標文件
  2. 若eidt文件不存在,或者eidt後依賴的.o文件的修改時間比edit文件新,則執行後面定義的命令生成edit文件
  3. 若edit後依賴的.o文件也不存在,make會在當前文件中尋找.o文件的依賴性,若找到,則根據那個規則生成.o文件.c和.h文件存在,make生成.o文件,最後執行edit

自動推導

GNU的make命令支援自動推導,只要make看到一個.o文件,就會自動把.c文件加到依賴關係中,則上述例子可簡化為以下形式

objects = main.o kbd.o command.o display.o /
              insert.o search.o files.o utils.o
    edit : $(objects)
            cc -o edit $(objects)

    main.o : defs.h
    kbd.o : defs.h command.h
    command.o : defs.h command.h
    display.o : defs.h buffer.h
    insert.o : defs.h buffer.h
    search.o : defs.h buffer.h
    files.o : defs.h buffer.h command.h
    utils.o : defs.h
  clean :
            rm edit $(objects)

文件功能

make支援多文件共簡規則,上述例子可進一步簡化為如下形式(但不推薦,因為較難維護)

objects = main.o kbd.o command.o display.o /
              insert.o search.o files.o utils.o
    edit : $(objects)
            cc -o edit $(objects)

    $(objects) : defs.h
    kbd.o command.o files.o : command.h
    display.o insert.o search.o files.o : buffer.h
    clean :
            rm edit $(objects)

清空目標文件規則

每一個makefile文件都應該清楚的寫一個清空目標的(.o和執行文件)規則,有利於重編譯和文件的清結性。

.PHONY表示clean是一個”偽目標”,rm前的減號表示,某些文件出問題但是不要管,繼續往下走。

clean默認放在文件尾,不然會被當作默認目標。

 `一般的風格為:`
clean:
            rm edit $(objects)
`較為穩健的方法:`
.PHONY : clean
        clean :
                -rm edit $(objects)

make編譯安裝

流程

  • 首先下載.tar.gz或者.tar.bz2軟體包文件

  • 使用tar命令解壓

  • 進入到解壓後文件目錄(因為make是搜索當前文件位置)

  • 使用./configure -prefix={Your Install Path} (其他configure參數自行百度)

  • make編譯(或者使用make all,過程有時很慢,有時會報錯,可能是依賴包的問題,解決依賴關係即可)

  • make install 安裝(需足夠許可權,部分軟體需要make check 或者 make test 進行測試)

  • make clean 清除編譯產生的中間文件(Objectfile或者.o文件)

舉個例子

//1.解壓縮
tar -zxf xxxxx-4.0.2.tar.gz  
//2.進入目錄
cd xxxxx-4.0.2
//3.配置
./configure --prefix=/usr/local/xxxxx     
//4.編譯
make all
//5.安裝
make install && make install-init && make install-commandmode && make install-config
//6.清除中間文件
make clean

相關鏈接