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)

変数#ヘンスウ#

  • カスタム変数=カスタム変数に等号を付ける#コメント
  • 組み込み変数$^依存関係リスト$<依存関係リストの最初の$@target名前
  • prog: main.o func.o   g++ $^ -o $@
    $^   => 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