Makefile整理

18358 ワード

1.基本ルール
target :   
      

makeは上から下へtargetを探します.つまり、最初のtargetが最終目標です.最初のtargetが見つかった後、makeはtargetファイルを探し、targetが存在しない場合はtargetの依存を探し、一般的に最終目標の依存は「.o」の中間ファイルである.「.o」のファイルが存在しない場合、makeはその「.o」をtargetとする行を探し続け、順次探します.
Makefileは自動的に「.o」の「.c」ファイルにプッシュされ、自動的にCC xxがあります.cコマンド.だからMakefileを簡略化することができます
objs = x1.o x2.o
target0:  $(objs)
    $(CC) -o target0 $(objs)
x1.o : x11.h x12.h
x2.o : x21.h x22.h
.PHONY : clean        #  clean        
clean :
    rm -rf $(objs)

同じ依存を持つhのoは一緒に目標を立てて、依存を後ろに書くこともできます.これは別の構造です.
x1.o x2.o : x12.h x21.h

Makefileには主に5つのものが含まれています.明示的なルール、暗黙的なルール、変数定義、ファイルの指示、注釈です.
     : makefile     ,
target : depends 
    command xx.c xx.c ...
     :  makefile      。

     :     '=',':=','?=','export','overide'

     : include

      :  #  

2.検索ルール
makeコマンドは、Makefile、makefileという名前のファイルをデフォルトで検索します.-fオプションを使用して、make検索のファイル名を指定します.
Makefileでは、3種類のワイルドカード「*」、「?」をサポートしています.[…]”.
makefileのファイルのデフォルトは、makefileファイルが存在するディレクトリの下で検索されます.makefile検索ファイルのPATHは、2つの方法で変更できます.
1.    VPATH
VPATH = src:.../inc
#     ,      ,src .../inc。
2.   vpath
    2.1 vpath  
    #              。
    2.2 vpath 
    #              。
    2.3 vpath
    #                 。

vapth           “ %”  。“ %”    
        ,  , “%.h”     “.h”     。
    vpath           。

3.ダミーターゲット
ダミーターゲットは、複数の実行可能ファイルを一度に生成するか、どの実行可能ファイルを生成するかを選択するために使用できます.例1
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
    cc -o prog1 prog1.o utils.o
prog2 : prog2.o
    cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
    cc -o prog3 prog3.o sort.o utils.o
#    make             。

例2
.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
    rm program
cleanobj :
    rm *.o
cleandiff :
    rm *.diff
#        make cleanall cleanobj cleandiff

4.マルチターゲット
Makefileのルールのターゲットは1つだけでなく、複数のターゲットをサポートし、私たちの複数のターゲットが同時に1つのファイルに依存し、生成されたコマンドはほぼ同じである可能性があります.そこで私たちはそれを統合することができます.もちろん、複数のターゲットの生成ルールの実行コマンドは同じであり、これは私たちに迷惑をかける可能性がありますが、幸いなことに、現在のルール内のすべてのターゲットの集合を表す自動化変数「$@」を使用することができます.
bigoutput littleoutput : text.g
    generate text.g -$(subst output,,$@) > $@
       :
bigoutput : text.g
    generate text.g -big > bigoutput
littleoutput : text.g
    generate text.g -little > littleoutput

  , -$(subst output,,$@)  "$"       Makefile    ,     subst,      。               ,"$@"       ,      .

"$@"      ,     。

静的モードは、マルチターゲットのルールをより容易に定義することができ、私たちのルールをより弾力性と柔軟性にすることができます.構文:
...>: : ...>

...

targetsは、ワイルドカードを持つことができる一連のターゲットファイルを定義します.ターゲットの集合です.target−parrternは、targetsを示すモード、すなわちターゲットセットモードである.prereq−parrternsはターゲットの依存モードであり、target−parrternによって形成されたモードをもう一度依存ターゲットの定義を行う.
例:
<target-parrtern>   “ %.o”,      <target>      “ .o”    
<prereq-parrterns>   “ %.c”,    <target-parrtern>              ,      , <target-parrtern>    “ %”(       [.o]    ),     [.c]    ,      。

したがって、私たちの「ターゲット・モード」または「依存モード」には「%」という文字があるはずです.ファイル名に「%」がある場合は、逆スラッシュ「」を使用して、実際の「%」文字を表すことができます.
例:
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
    $(CC) -c $(CFLAGS) $< -o $@
  
foo.o : foo.c
    $(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
    $(CC) -c $(CFLAGS) bar.c -o bar.o

例:
files = foo.elc bar.o lose.o
    $(filter %.o,$(files)): %.o: %.c
    $(CC) -c $(CFLAGS) $< -o $@
    $(filter %.elc,$(files)): %.elc: %.el
    emacs -f batch-byte-compile $<


##$(filter %.o,$(files))     Makefile   filter   ,  ##"$filter""%.o"

5.依存の自動生成
大規模なプロジェクトの場合、どのCファイルにどのヘッダファイルが含まれているかを明らかにする必要があります.また、ヘッダファイルを追加または削除する際にも、メンテナンス性のない作業であるMakefileを注意深く修正する必要があります.このような煩雑でエラーが発生しやすいことを避けるために、C/C++コンパイルの機能を使用することができます.ほとんどのC/C++コンパイラでは、ソースファイルに含まれるヘッダファイルを自動的に検索し、依存関係を生成する「-M」オプションがサポートされています.
たとえば
main.c  
#include
#include
  
    gcc -M main.c
   
    gcc main.c stdio.h defs.h

GNU組織は、コンパイラがソースファイルごとに自動的に生成する依存関係を1つのファイルに配置し、「name.c」のファイルごとに「name.d」のMakefileファイルを生成し、[.d]のファイルに対応する[.c]ファイルの依存関係を格納することを提案しています.
[.c]ファイルと[.d]ファイルの依存関係を書き出し、makeに自動的に[.d]ファイルを更新または自成させ、それをマスターMakefileに含めることで、各ファイルの依存関係を自動化して生成することができます.
ここでは、[.d]ファイルを生成するためのモード規則を示します.
%.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$

       ,   [.d]     [.c]  ,“ rm -f $@”           ,   [.d]  .

       ,       “ $<”,   [.c]         ,“ $@”    “ %.d”  ,      C     name.c,  “ %”  “ name”, “ $$$$”        ,            
“ name.d.12345”,

      sed         ,   sed                。

           。

6.変数
Makefileの変数は#defineの定数に相当します.ファイルの先頭に置くと、最終targetの依存の代わりにOBJS変数、コンパイルコマンドの代わりにCCが使用されます.
宣言変数:
1.
    =  1  2 ...  n  /     。
    :
$(   )

2.
      :=  。             。
    := $(shell pwd)      。

3.
?=   ifndef
a ?=b
   
a     , a=b
        

 .  
  :
foo := a.o b.o c.o
bar := $(foo:.o=.c)
     ,      “ $(foo)”  ,         " $(foo)"     ".o"  "  "     " .c",   $(bar)    " a.c b.c c.c"。


 .          
x = y
y = z
a := $($(x))


 .     
+=


 . override    
         make          ,   Makefile              。      Makefile          ,  ,    "override"   。
    :
override <variable> = <value>
override <variable> := <value>
  ,      :
override <variable> += text>
         ,    define    ,  define     ,       
ovveride    , :
override define foo
bar
endef


 .    
define    。   define               ,            (“   ”            )。

define              ,           ,     endef      。      “ =”     。          、  、  ,      。       [Tab]   ,       define            [Tab]   ,   make           。

           define    :
define two-lines
    echo foo
    echo $(bar)
endef


 .    
export
     make      ,  makefile   ,       makefile。


 .    
        
       
target :   


 .    
      %  
         。

7.関数とその高度な関数
      
$(functionname    arguments)

1.    
subst   from,to,in
 in from  to

2.    
patsubst 

3.       
strip

4.  
find  find,in

5.  
filter  string1 ...,in
       

6.    
filter-out
       

7.    
sort  list

8.  n   
word n,text

9. m-n   
word-list n,m,text

10.    
words text

11.      
firstword text

12.      
dir  file...

13.    
notdir file...
  file...      

14.   
suffix file...
     

15.   
basename 

16.   
addsuffix  .x,file....

17.   
addprefix  pre,file...

18.  
join  aa bb,11 22 33
  
aa11 bb22 33


    ;
1. foreach  

   :
$(foreach ,,<text>)
                      ,     <text>       。   <text>        ,     , <text>                ,          , <text>                  (     )    foreach       。  ,         , <text>                   。

  :
names := a b c d
files := $(foreach n,$(names),$(n).o)
      , $(name)          ,     “ n” ,“ $(n).o”    “ $(n)”      ,        ,     foreach      ,  ,$(files)   “ a.o b.o c.o d.o”。
  , foreach               , foreach       ,          ,       foreach     。


2.if   

   GNU   make         ——ifeq, if$(if <condition>,)
  
$(if <condition>,,<else-part>)

  , ifelse”  ,    。  if           ,      。 

<condition>    if     ,            ,              ,  ,     ,  <else-part>    。

  if        ,  <condition>  (     ),            ,  <condition>  (    ),  <else-part>          ,    <else-part>     ,  ,         。

  ,  <else-part>        。

3.call  

call                      。              ,      ,        ,      call              。

    :
$(call <expression>,,,...)
  make        , <expression>      , $(1), $(2), $(3) ,        。 <expression>       call       。  :

reverse = $(1) $(2)
foo = $(call reverse,a,b)
  , foo     “ a b”

4.origin  
origin          ,         ,                 .

    :
$(origin )

  ,       ,      。        $”  。 Origin                  “    ”,

  ,  origin      :
“ undefined”
         , origin        “ undefined”。
“ default        ,  “ CC”    ,          
  。
“ environment”
         ,    Makefile     ,“ -e”     
  。
“ file         Makefile  。
“ command line”
              。
“ override”
     override         。
“ automatic”
  5.shell  
shell   
 make   shell  

6.error warning
error text...
     make
warning