make命令和makefile文件

  make命令和makefile文件的結合提供了一個在項目管理領域十分強大的工具,它不只常被用於控制源代碼的編譯,並且還用於手冊頁的編寫以及將應用程序安裝到目標目錄。app

  makefile文件由一組依賴關係和規則構成,每一個依賴關係由一個目標和一組該目標所依賴的源文件組成,而規則描述瞭如何經過這些依賴文件建立目標,通常來講,目標是一個單獨的可執行文件。工具

1. make命令的選項和參數

  make程序自己有許多選項,其中最經常使用的三個選項以下所示:優化

(1)-k:讓make命令在發現錯誤時仍然繼續執行spa

(2)-n:讓make命令輸出將要執行的操做步驟,而不真正執行這些操做命令行

(3)-f <filename>:告訴male命令將哪一個文件做爲makefile文件調試

1.1 依賴關係

myapp: main.o 2.o 3.o 
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h

  依賴關係定義了最終應用程序裏的每一個文件和源文件之間的關係code

  若是想一次建立多個文件,能夠利用僞目標allblog

all:    myapp    myapp.1

  建議約定:在本身的makefile文件中將第一個目標定爲all,而後再列出其它重屬目標項目管理

1.2 規則

  makefile文件中一個很是奇怪而又使人遺憾的語法現象:空格和製表符是有區別的,規則所在的行必須以製表符開頭,用空格是不行的,若是makefile文件中的某行以空格結尾,也可能致使make命令執行失敗。io

myapp: main.o 2.o 3.o
    gcc -o myapp main.o 2.o 3.o
main.o: main.c a.h
    gcc -c main.c 
2.o: 2.c a.h b.h
    gcc -c 2.c
3.o: 3.c b.h c.h 
    gcc -c 3.c

1.3 makefile文件中的宏

  爲了讓makefile文件在面對大項目時不至於過於龐大和缺少彈性,makefile文件容許使用宏以一種更通用的格式來書寫它們

  MACRONAME = value

  $(MACRONAME)或${MACRONAME}或$MACRONAME

  若要定義一個值爲空的宏,能夠MACRONAME = 

  宏一般都是在makefile中定義的,但也能夠在調用make命令時在命令行上給出宏定義,例如male CC=c89.命令行上的宏定義將覆蓋makefile中的宏定義。

all: myapp 

#which compier
CC = gcc

#where are include files kept
INCLUDE = 

#options for development
CFLAGS =  -g -Wall -ansi

#options for release
#CFLAGS = -0 -Wall -ansi

myapp: main.o 2.o 3.o
    $(CC) -o myapp main.o 2.o 3.o
main.o: main.c a.h
    $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
2.o: 2.c a.h b.h 
     $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
     $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

  "-g" 是 gcc 的選項, "-o"也是 gcc 的選項。前者指示加入調試信息,後者指示對代碼進行優化。

   gcc 的-Wall 選項能夠打印出編譯時全部的錯誤或者警告信息

1.3.1 make命令內置的特殊宏

  $?   當前目標所依賴的文件列表中比當前目標文件還要新的文件

  $@  當前的目標的名字

  $<   當前規則的第一個依賴文件

  $^   當前規則的全部依賴文件,以逗號分隔

  $*   不包括後綴名的當前依賴文件的名字

  -     告訴make命令忽略全部的錯誤

  @   告訴make在執行命令前不要將該命令顯示在標準輸出上@echo

  $(@D) 目標文件的目錄名部分

  $(@F) 目標文件的文件名部分

1.3.2 多個目標

all: myapp 

#which compier
CC = gcc

#where to install
INSTDIR = /usr/local/bin

#where are include files kept
INCLUDE = 

#options for development
CFLAGS =  -g -Wall -ansi

#options for release
#CFLAGS = -0 -Wall -ansi

myapp: main.o 2.o 3.o
    $(CC) -o myapp main.o 2.o 3.o
main.o: main.c a.h
    $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
2.o: 2.c a.h b.h 
     $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
     $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

clean:
    -rm main.o 2.o 3.o 

install:myapp
    @if [-d $(INSTDIR)]; \
        then \
        cp myapp $(INSTDIR) &&\
        chmod a+x $(INSTDIR)/myapp && \
        chmod og-w $(INSTDIR)/myapp;\
    else \
        echo "Sorry,$(INSTDIR) does not exist";\
    fi

  clean:刪除不須要的目標文件,因爲clean:的後面是空的,所以該目標總被認爲是過期,因此在執行make命令時,若是指定目標clean,則目標所對應的規則將總被執行

  install:將編譯成功的應用程序安裝到另外一個目錄下

  -rm:rm命令以減號開頭是讓make命令忽略rm命令的執行結果

1.4 內置規則

  能夠經過make -p來打印make的全部內置規則,好比:

OUTPUT_OPTION=-o ¥@
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
%.o: %.c
    $(CONPILE.c) $(OUTPUT_OPTION) $<
相關文章
相關標籤/搜索