【Linuxシステムプログラミング】 9. Makefile

目次

1 ルール

全て

2つの機能

ワイルドカード

パットサブスト

クリーン

3つの自動変数

パターンルール

静的パターンのルール

偽のターゲット

追加の変数

-n

-f

名前: makefileまたはMakefile 。これは、 makeコマンドを直接実行する場合に便利です

1 ルール

  1. ターゲットの時間は依存条件の時間より後である必要があります。そうでない場合、ターゲットは更新されます。

  2. 依存条件が存在しない場合は、依存条件を生成する新しいルールを見つけます。

目标:依赖条件
	命令
main.out:main.c
	gcc main.c -o main.out

全て

Makefile の最終的な目標を指定します。

ALL:终极目标
ALL:main.out

指定しないと、場合によっては Makefile が完全に実行されません。

例えば:

ALL:main.out

a1.o:a1.c
	gcc -c a1.c -o a1.o
	
a2.o:a2.c
	gcc -c a2.c -o a2.o
	
a3.o:a3.c
	gcc -c a3.c -o a3.o
	
main.o:main.c
	gcc -c main.c -o main.o
	
main.out:main.o a1.o a2.o a3.o
	gcc main.o a1.o a2.o a3.o -o main.out

2つの機能

ワイルドカード

src=$(wildcard ./*.c)
src=a1.c a2.c a3.c

現在の作業ディレクトリ内のすべての.cファイルを照合し、ファイル名のリストを作成し、それらを変数srcに割り当てます。

パットサブスト

obj=$(patsubst %.c,%.o,$(src))
obj=a1.o a2.o a3.o

3番目のパラメータの最初のパラメータを含む部分を2番目のパラメータに置き換えます。

クリーン

依存関係はありません。最初の「-」: 存在しないファイルを削除する場合、エラーは報告されず、実行は続行されます。

clean:
	-rm -rf $(obj) xxx.out

3つの自動変数

$@

ルールのコマンド内で、ルールのターゲットを示します。

$^

 ルールのコマンドでは、すべての依存関係が表現されます。

$<

        ルールのコマンドにおいて、最初の依存条件を示します。この変数をパターン ルールに適用すると、依存関係条件リスト内の依存関係を 1 つずつ取り出してパターン ルールを適用できます。

src=$(wildcard ./*.c)	#a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src))	#a1.o a2.o a3.o main.o

ALL:main.out

main.out:$(obj)
	gcc $^ -o $@

a1.o:a1.c
	gcc -c $< -o $@

a2.o:a2.c
	gcc -c $< -o $@

a3.o:a3.c
	gcc -c $< -o $@
	
main.o:main.c
	gcc -c $< -o $@
	
clean:
	-rm -rf $(obj) main.out

パターンルール

%.o:%.c
	gcc -c $< -o $@
src=$(wildcard ./*.c)	#a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src))	#a1.o a2.o a3.o main.o

ALL:main.out

main.out:$(obj)
	gcc $^ -o $@

%.o:%.c
	gcc -c $< -o $@
	
clean:
	-rm -rf $(obj) main.out

静的パターンのルール

複数のターゲットが存在する場合、それらが最初に実行されます。

$(obj):%.o:%.c
	gcc -c $< -o $@
src=$(wildcard ./*.c)	#a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src))	#a1.o a2.o a3.o main.o

ALL:main.out

main.out:$(obj)
	gcc $^ -o $@

$(obj):%.o:%.c
	gcc -c $< -o $@
	
%.o:%.s
	gcc -S $< -o $@
	
clean:
	-rm -rf $(obj) main.out

偽のターゲット

同じ名前のクリーンなファイルとターゲットが存在する場合、メイクファイルは実行を続行できます。

.PHONY:clean ALL
src=$(wildcard ./*.c)	#a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src))	#a1.o a2.o a3.o main.o

ALL:main.out

main.out:$(obj)
	gcc $^ -o $@

$(obj):%.o:%.c
	gcc -c $< -o $@
	
%.o:%.s
	gcc -S $< -o $@
	
clean:
	-rm -rf $(obj) main.out
	
.PHONY:clean ALL

追加の変数

src=$(wildcard ./*.c)	#a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src))	#a1.o a2.o a3.o main.o

myArgs=-Wall -g

ALL:main.out

main.out:$(obj)
	gcc $^ -o $@ $(myArgs)

$(obj):%.o:%.c
	gcc -c $< -o $@ $(myArgs)
	
%.o:%.s
	gcc -S $< -o $@
	
clean:
	-rm -rf $(obj) main.out
	
.PHONY:clean ALL

-n

特に make clean コマンドのエラーを防ぐために実行をシミュレートします。

make clean -n

-f

makeコマンドを実行するファイルを指定します。

make -f 文件名
make -f xxx.mk

おすすめ

転載: blog.csdn.net/CETET/article/details/130062384