Linux&&MAKE[瞭解]

MakeFile的定義

makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因爲 makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令.makele就像一個Shell腳本一樣,其中也可以執行操作系統的命令。

一般來說,無論是C、C++、還是 pas,首先要把源文件編譯成中間代碼文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,這個動作叫做編譯(compile)。然後再把大量的Object File合成執行文件,這個動作叫作鏈接(link)。

make命令執行時,需要一個 Makele 文件,以告訴make命令需要怎麼樣的去編譯和鏈接程序。

makefile帶來的好處就是–“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make.可見,makefile都成爲了一種在工程方面的編譯方法。

Make的書寫規則

  1. 如果這個工程沒有編譯過,那麼我們的所有C文件都要編譯並被鏈接。
  2. 1.如果這個工程的某幾個C文件被修改,那麼我們只編譯被修改的C文件,並鏈接目標程序。
  3. 如果這個工程的頭文件被改變了,那麼我們需要編譯引用了這幾個頭文件的C文件,並鏈接目標程序。
  4. 在定義好依賴關係後,後續的那行定義瞭如何生成目標文件的操作繫命令,一定要以一個Tab鍵作爲開頭(make並不管命令是怎麼工作的,他只管執行所定義的命令。)。

Make如何工作

  1. make會在當前目錄下找名字叫“Makele”或“makele”的文件;
  2. 如果找到,它會查找文件中的第一個目標文件.o;
  3. 如果文件不存在,它會根據依賴關係查找.s文件;
  4. 若.s文件不存在,make會在當前文件中查找.s文件的依賴文件.i;
  5. 若.i文件不存在,會根據依賴關係查找.c文件,當然.c文件是存在的,於是,make會生成一個.o文件,然後去執行文件。

這就是整個make的依賴性,make會一層又一層地去找文件的依賴關係,直到最終編譯出第一個目標文件。在找尋的過程中,如果出現錯誤,比如最後被依賴的文件找不到,那麼make就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,make根本不理。make只管文件的依賴性,即如果在我找了依賴關係之後,冒號後面的文件還是不在,那麼make就不工作啦。

Make命令

make
根據Makefile文件編譯源代碼、連接、生成目標文件、可執行文件。
make clean
清除上次的make命令所產生的object文件(後綴爲“.o”的文件)及可執行文件。
make install
將編譯成功的可執行文件安裝到系統目錄中,一般爲/usr/local/bin目錄。
make dist
產生髮布軟件包文件(即distribution package)。這個命令會將可執行文件及相關文件打包成一個tar.gz壓縮的文件用來作爲發佈軟件的軟件包。
它會在當前目錄下生成一個名字類似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我們在configure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。
make distcheck
生成發佈軟件包並對其進行測試檢查,以確定發佈包的正確性。這個操作將自動把壓縮包文件解開,然後執行configure命令,並且執行make,來確認編譯不出現錯誤,最後提示你軟件包已經準備好,可以發佈了。
make distclean
類似make clean,但同時也將configure生成的文件全部刪除掉,包括Makefile文件。
make menuconfig
make menuconfig 是執行makefile裏面的menuconfig目標. 如果後面 ARCH =arm CROSS_COMPILE=arm-linux- 的話表明: 編譯出來的目標是針對ARM體系結構的。因爲是針對ARM體系結構,所以需要使用交叉編譯器。使用CROSS_COMPILE=xxx來指定交叉編譯器。

CROSS_COMPILE=arm-linux- 意思是制定交叉編譯器爲arm-linux-XXX。 如:makefile裏面會指定CC爲arm-linux-gcc。

make -j
爲了使make命令執行並行處理,-j 選項可以用來指定作業數。
用法:make -j4 或 make -jobs=4 //-j==-jobs ;多線程的意思
作業數是在編譯的時候指定主機的CPU個數,所以在腳本中寫成一個常量很糟糕。(特別是把編譯腳本給其他人的時候。)並行處理的作業數和編譯的效率直接相關,所以需要設置合適的作業數量。

腳本實現make的任務數能自動設置成CPU的數量

vim  linux/tools/perf/Makefile
    # Do a parallel build with multiple jobs, based on the number of CPUs 
    online 
    # in this system: 'make -j8' on a 8-CPU system, etc. 
    # (To override it, run 'make JOBS=1' and similar.) 
     
     ifeq ($(JOBS),)   
     JOBS := $(shell grep -c ^processor /proc/cpuinfo 2>/dev/null)   
         ifeq ($(JOBS),)     
             JOBS := 1   
         endif 
    endif 

這種計算了/proc/cpuinfo以processor開頭的行的數量。
這裏不使用wc命令來計算匹配的行數,而是用grep -c來獲取。
這裏JOBS是CPU的個數,用這個變量在子進程中使用make命令。

$(MAKE) -f Makefile.perf --no-print-directory -j$(JOBS) O=$(FULL_O) $(SET_DEBUG) $@

crosstool爲xscale編譯(ct-ng build)過程
ct-ng build.4 //意思是多線程去編譯
make install -s //“-s”不輸出詳細log信息
make -f //”-f”指定特定的makefile文件,運行特定文件名的makefile文件

參考資料:
http://www.jb51.net/LINUXjishu/65444.html
http://blog.csdn.net/yu704645129/article/details/53169589

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章