Makfileノート
1.Makfile初認識
1.1 Makefileルール
1.2他のMakefileファイルの参照
1.3 Makefile変数
1.4 Makefileワークフロー
2.書くルール
2.1ルール構文
2.2ワイルドカード
2.3ファイル検索パス
2.4ダミーターゲット
2.5静的モード
3.書くコマンド
3.1表示コマンド
3.2ネスト実行make
3.3コマンドブロックの定義
4.変数
4.1変数宣言
4.2変数の使用
4.3 override識別子
4.4複数行変数
4.5環境変数
4.6目標変数
4.7モード変数
4.8自動化変数
5.論理判断文
5.1使用文法
6.一般的な関数
6.1関数呼び出し構文
6.2文字列処理関数
6.3ファイル名操作関数
6.4 makefileデバッグ関数
6.5その他の関数
7.Makefileデバッグ機能
7.1 makefileデバッグ
一般的なデバッグ方法:https://www.cnblogs.com/AP0904225/p/5936465.html
7.2 makefileソースデバッグ
8.暗黙のルール
9.後ろに書く
皓兄の「私と一緒にMakefileを書く」に感謝します.前に少し見たことがありますが、全部理解する機会はありません.今回は基本的に全部理解しました.これは私の読書ノートです.主に皓兄のこの本を参考にしています(一応本を計算しましょう^-^)アンドロイドソースのmakefileを分析するために基礎を作ったので、研究は深くありません.後で詳しく知る時間があります.
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. make ,make 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 , override 。
1.
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を分析するために基礎を作ったので、研究は深くありません.後で詳しく知る時間があります.