Makfileノート


1.Makfile初認識
1.1 Makefileルール
target ... : prerequisites ...
    command
    ...
    ...
 :  
target:  
prerequisites:    
command:makefile        

Makfile  :
       Makfile ,Makfile   target      ,
        ,      command  ,
       ,   prerequisites       target      ,
      ,       command  。

1.2他のMakefileファイルの参照
include include foo.make $(value) 

1.3 Makefile変数
1.
    :
obj= a.o b.o c.o \
    d.o e.o
target : prerequisites
    command $(obj)
2.CFLAGS,CXXFLAGS 
    CFLAGS      C       ,CXXFLAGS     C++       。
    CFLAGS     (.h  )   、     , :CFLAGS=-I/usr/include -I/path/include -D_YUQIANG。
            gcc    :$(CC) $(CFLAGS)
3.LDFLAGS:
    gcc               ,              。  :
    LDFLAGS=-L/usr/lib -L/path/to/your/lib。
4.LIBS:             , LIBS = -lpthread -liconv

1.4 Makefileワークフロー
1.   makemake         Makefile    
2.   include   makefile  
3.    
4.         
5.             
6.         target         
7.  target       , target            ,           ,            make    

2.書くルール
2.1ルール構文
  1:
targets : prereuuisites
    command
    ...
  2:
targets : prereuuisites ; command
    command
    ...1, command    ,     
2.'\'
3.command    /bash/sh   

2.2ワイルドカード
'*':  『 0'?':  『     』    
'~':        ,~feison/data    feison     data  
 :           ,          '\'

2.3ファイル検索パス
1.VPATH  
VPATH:makefile              
 :VPATH= src:../headers
 :           
2.vpath   
vpath <pattern> <directories> :     <pattern>         <directories>
vpath <pattern> :      <pattern>        
vpath :               
 :vpath %h ../headers

2.4ダミーターゲット
       :
    :
phonytargets:
    commands
    :
.PHONY:phonytargets
phonytargets:
    commands
 :         
all:prog1 prog2 prog3
.PHONY: all

prog1:prog1.o
    commands1
prog2:prog2.o
    commands2
prog3:prog3.o
    commands3

2.5静的モード
::
    
    ...
 :
targets:   ,      
target-pattern:     
prereq-pattern:    
 :
foo.o bar.o abc.m : %.o : %.c
    $(CC) -c $(CFLAGS) $< -o $@
   .o        .c  ,    makefile   ,       

3.書くコマンド
3.1表示コマンド
1.@command command  
    @command       make  
    command      make  
 :
    @echo this is a test
    make  :
    this is a test

    echo this is a test
    make  :
    echo this is a test
    this is a test
2.make -n      ,      
3.make -s          

3.2ネスト実行make
make  ,  make  ,            
 :
./Makefile:(  Makefile)
subsystem:
    cd subdir && $(MAKE)
<==>
sybsystem:
    $(MAKE) -C subdir
1.makefile      
     ,   Makefile           makefile ,       makefile    ,     -e  。
export ...>         makefile   
unport ...>          makefile   
 :
SHELL MAKEFLAGS             makefile 
2.make -w
 make          ,           

3.3コマンドブロックの定義
  :
define cmdblocks-name
cmd1
cmd2
...
endef
 :
target : prereqs
    $(cmdblocks-name)

4.変数
4.1変数宣言
1.    
variable = value
$(variable)==>value
${variable}==>value
2.      
variable :=value
1                 ,  
A=$(B)
B=$(A)
:=                     ,            ,     
 :
x:=foo
y:=$(x) bar $(m)
x:=later
==>
y:=foo bar
x:=later
3.            
nullstring:=
space:=$(nullstring) #end of the line
 :nullstring Empty  ,space      ,Empty             ,#         
4.   ?=
variable ?=value
   variable      ,      ,       ,   value

4.2変数の使用
1.    
x=y
y=z
a:=$($(x))
==>
a:=z

2.      
$(var:a=b)
${var:a=b}
     var    a      a   b   
 :
foo := a.o b.o c.o
bar :=$(foo:.o=.c)

foo := a.o b.o c.o
bar :=$(foo:%.o=%.c)

3.    
variable +=value
 :
a := b
a +=c
==>
a := b
a :=$(a) b

4.  
 :
first_second = Hello
a = first
b = second
c =$($(a)_$(b))
==>
c = Hello

4.3 override識別子
  make           ,   makefile            ,     override1.
override ; =<value>
2.
override ; :=<value>
3.
override ; +=<value>
4.
override define foo
bar
endef

4.4複数行変数
    :
define two-lines
echo foo
echo $(bar)
endef
 :  3.3     

4.5環境変数
  3.2    make

4.6目標変数
                   ,             
  :
...>:
...>:override          
        make            
 :
m = flag
target:m= flag_target
target:
    @echo $(m)
 $(m)   flage_target

4.7モード変数
...>:
...>:override 
         
 :
%.o : CFLAGS = -g
prog: prog1.o prog2.o
    $(CC) $(CFLAGS ) prog1.o prog2.o
prog1.o:prog1.c
    $(CC) $(CFLAGS ) prog1.c
prog2.o:prog2.c
    $(CC) $(CFLAGS ) prog2.c
    prog1.o prog2.o      CFLAGS   -O,         

4.8自動化変数
      (       ),                   。                  ,  ,              ,            。                   ,             。make    “     ”       ,                   ,                   。
                      。               :
$@
           。         (Linux ,   .a     ),             。          ,                    。
$%
                ,           。  ,      “foo.a(bar.o)”,  ,“$%”    “bar.o”,“$@”   “foo.a”。           ,    。
$<
           。       ,                  。
$?
                ,    。           ,       (.o  )     。
$^
           ,      。           ,             (.o  ) 。                 ,  “$^”           。     “$^”          。
$+$^”,                  。         ,        。
$*
             ,  “ ”。“ ”      “%”      (          ,“ ”     (    )  )。  :  “dir/a.foo.b”,       “a.%.b” ,“$*”   “dir/a.foo”。“ ”             。
     “$*”      :
Ø                        “ ”,     “$*”         。  ,                 ,  “$*”             。  :“foo.c” “$*”   :“foo”,  .c            。GUN make                        make  。  ,             ,                    。
Ø                                   ,     。
     “$?”             ,                        。  ,     “libN.a”,    .o    。             .o       :

lib: foo.o bar.o lose.o win.o
    ar r lib $?

           。                ($@$<$%$*)。                    。GUN make ,                                    ,          “D”  “F”  。                 。          make   ,      make ,    “dir”  “notdir”          。
$(@D)
           (             )。  “$@” “dir/foo.o”,  “$(@D)”   “dir”。  “$@”     ,    “.”(    )。      “dir”   !
$(@F)
                   (     )。  “$@” “dir/foo.o”,  “$(@F)”   “foo.o”。“$(@F)”     “$(notdir $@)”。
$(*D)
$(*F)
      “ ”            。
$(%D)
$(%F)
   “archive(member)”         ,         “member”             。              。
$($($(^D)
$(^F)
                    (       )。
$(+D)
$(+F)
                    (       )。
$(?D)
$(?F)
                      。

5.論理判断文
5.1使用文法
1.ifeq/else/endif
    <1>
    ifeq (,)
    
    else
    else>
    endif

    <2>
    ifeq (,)
    
    endif

2.ifneq/else/endif
    <1>
    ifneq (,)
    
    else
    else>
    endif

    <2>
    ifneq (,)
        
    endif

3.ifdef/else/endif
    <1>
    ifdef 
    
    else
    else>
    endif

    <2>
    ifdef 
    
    endif

4.if , , <else-part>
       C   :
    if(condition)
        then-part;
    else
        else-part;

6.一般的な関数
6.1関数呼び出し構文
  :
$(<function> <arguments>)
${<function> <arguments>}

6.2文字列処理関数
1.subst
       
$(subst ,,<text>)
 :
$(subst ee,EE,feet on the street)
==>fEEt on the strEEt

2.patsubst
         
$(patsubst ,,<text>)

3.strip$(strip <string>)

4.findstring
       
$(findstring ,<string>)

5.filter
    
$(filter ,<text>)

6.filter-out
     
$(filter-out ,<text>)

7.sort
    
$(sort )

8.word
     
$(word ,<text>)

9.wordlist
      ,        
$(wordlist ,,<text>)

10.words
       
$(words <string>)

11.firstword
      
$(firstword <string>)

6.3ファイル名操作関数
1.dir
     
$(dir <path_files_name>)

2.notdir
      
$(nodir <path_files_name>)

3.suffix
     
$(suffix <names>)

4.basename
     
$(basename <names>)

5.addsuffix
      
$(addsuffix <suffix>,<names>)

6.addprefix
      
$(addprefix  <prefix>,<names>)

7.join
    
$(join <list1>,<list2>)

6.4 makefileデバッグ関数
1.error
        
$(error <text>)

2.warning
        
$(warning <text>)

3.info
        
$(info <text>)

6.5その他の関数
1.foreach
    
$(foreach ,,)

2.if
      
$(if ,)
$(if ,,<else-part>)

3.call
       
$(call ,,,,...)
 :
func:     
parm1:func    1($(1))
parm2: func    2($(2))
func          ,$(1),$(2)...  
 :
reverse = $(2) $(1)
foo=$(call reverse ,a,b)
==>
foo=b a

4.origin
     ,      
   :
<1>undefined:     
<2>default:    
<3>environment:    
<4>file:makefile      
<5>command line:        
<6>override:override       
<7>automatic:     
$(origin )

5.shell
    shell    
$(shell commands)
 :
fileslist:=$(shell echo *.c)

7.Makefileデバッグ機能
7.1 makefileデバッグ
一般的なデバッグ方法:https://www.cnblogs.com/AP0904225/p/5936465.html
7.2 makefileソースデバッグ
       makefile        
main.c:
#ifdef DEBUG
.....
Makefile:
.PHONY: all clean

LINUX_ROOT=$(LINUX_SRC)

obj-m := sil9024.o

all:
    @make -C $(LINUX_ROOT) M=$(PWD) modules "CFLAGS += -DDEBUG"
    @cp sil9024.ko ../ko/  -vfr

clean:
    @make -C $(LINUX_ROOT) M=$(PWD) clean

8.暗黙のルール
      

9.後ろに書く
皓兄の「私と一緒にMakefileを書く」に感謝します.前に少し見たことがありますが、全部理解する機会はありません.今回は基本的に全部理解しました.これは私の読書ノートです.主に皓兄のこの本を参考にしています(一応本を計算しましょう^-^)アンドロイドソースのmakefileを分析するために基礎を作ったので、研究は深くありません.後で詳しく知る時間があります.