Makefile簡易チュートリアル
3741 ワード
1.定義
target: dependencies
[tab] command
NOTE:[tab]は4つのスペースにできません.
2.使用規則
2.1テストファイル
func.h func.cpp main.cpp
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void PrintHello(); | void PrintHello() | int main()
| { | {
| cout << "Hello World!"; | PrintHello();
| } | }
2.2原始社会
g++ func.cpp main.cpp -o prog
複数のファイルがある場合、毎回g++cppファイルの列が必要で、煩雑で非効率です.
2.3奴隷社会
compile.sh
-----------------
#!/bin/sh
g++ func.cpp main.cpp -o prog
事前にスクリプトを作成し、コンパイル操作をワンタッチで完了し、
./compile.sh
.同様に、ファイル数が急激に上昇したとき、問題が現れます.ソースファイルが変更されるかどうかにかかわらず、すべてのcppを.o
ターゲットファイルにコンパイルする必要があり、時間とコストがかかります.2.4封建社会
makefileの依存関係では,修正したファイルをコンパイルするだけでよいが,修正したソースファイルはなく,再コンパイルする必要はない.時間を節約するが、力を節約しない.
prog: func.o main.o
g++ func.o main.o -o prog
func.o: func.cpp
g++ -c func.cpp -o func.o
main.o: main.cpp
g++ -c main.cpp -o main.o
2.5社会主義
封建社会では、cppファイルが1つ存在する限り、このcppファイルにルールを書き、ソースファイルの数が上昇するとmakefileがボトルネックになる.
CC = g++
RM = rm -rf
CFLAGS = -g -WALL
OBJS = main.o func.o
EXEC = main
$(EXEC): $(OBJS)
$(CC) $^ $(CFLAGS) -o $@
%.o : %.cpp
$(CC) -c $< -o $@
clean:
$(RM) $(OBJS) $(EXEC)
変数#ヘンスウ#
$^ => main.o func.o $@ => prog $< => main.o
パターン規則
targetターゲットには
%
、すなわちモードルールが含まれている.%.o : %.cpp
は、いずれかのcpp
ファイルを対応する.o
ファイルにコンパイルするように指示する2.5共産主義
社会主義では、仕事の効率が大幅に向上したが、
.cpp
文書ごとに.o
文書に手動で対応する必要がある.共産主義社会では、関数を導入することで、この煩雑な仕事を自動的に完成させる.CC = g++
RM = rm -rf
CFLAGS = -g -WALL
SRCS = $(wildcard *.cpp)
OBJS = $(SRCS:.cpp=.o)
EXEC = main
$(EXEC): $(OBJS)
$(CC) $^ $(CFLAGS) -o $@
%.o : %.cpp
$(CC) -c $< -o $@
clean:
$(RM) $(OBJS) $(EXEC)
関数#カンスウ#
構文
$(function arguments)
-function関数名-arguments関数パラメータMakefileマニュアル:Functions for Transforming Text
wildcard関数
wildcard
はワイルドカード関数であり、ワイルドカード%
と類似している.(wildcard*.cpp)現在のディレクトリの下にあるすべてのcppファイルを取得
変数置換
foo = test.c main.c
bar = $(foo:**.**c=**.**o)
prog :
echo $(bar)
-------------------
: test.o main.o
MakeFileマニュアル:Substitution References
置換ルール:-単語を置換し、foo変数単語を直接スペースで区切る-接尾辞を置換し、一致する接尾辞のみを置換します.
foo = test.o oppo.o bar = $(foo: o = x)
bar => test.x oppo.x
3.Shell構文
スクリプト構文-各行に1つのプロセスが処理されるため、各コマンドユニットは行を切断できません.makefileの変数は
$
で始まり、衝突を避けるためにshell変数は$$
で始まります. DIRS = common logic middle_tier bootstrap
all:
@for dir in $(DIRS); do make -C $$dir; done
rm -rf prog/conf/*
mkdir -p prog/conf
cp -r bootstrap/conf/* prog/conf
Note:@このコマンドを実行しますが、make-Cネスト呼び出しサブディレクトリのMakefileを出力しないでください.
Shell関数files=$(shell echo*.c)
DIRS = $(shell ls -F | grep /$)
all:
@for dir in $(DIRS); do make -C $$dir; done