makeツールとその使用

8185 ワード

概要
ソフトウェアシステム全体がいくつかの小さなサブシステムに分割され、各小さなサブシステムが独立して動作するファイルのセットからなるモジュールに分割されると、モジュール間の協調問題に関連する.
(ソフトウェアシステム→サブシステム→モジュール)
makeツールの役割は、1つのモジュールが修正された後、他のモジュールに関連する部分も変化し、モジュール間の協調関係に影響を与えないことを保証することです.
make自体は単独で動作するプログラムであり、プログラムモジュールの修正状況に基づいてリンクターゲットコードを再コンパイルし、ターゲットコードが常に最新のモジュールから構成されることを保証することができる.
makeコマンドとMakefile
makeを使用するには、Makefileというファイルを作成する必要があります.パッケージ内の各ファイルの関係を説明し、各ファイルを更新するコマンドを提供します.1つのパッケージで、ソフトウェアの更新順序:
実行可能ファイル更新リンク先ファイル更新コンパイルソースファイル更新
Makefileの各関連行は、ターゲットがどのファイルに依存するか、ターゲットを生成または更新するために必要なコマンドを説明します.
Makefileファイルのフォーマットは次のとおりです.
#     
  :     
    [  ]
  :     
    [  ]
...

注意:
  • Makefileファイルはソースファイルと同じディレクトリの下に置く.
  • Makefileファイルは、記述文行の前に「#」を付けて注釈を表すこともできる.
  • 関連行が長すぎる場合は、逆斜線""を後続の行記号として使用して行を継続することもできます.
  • makeプログラムがMakefileを実行する関連行のデフォルトは実行状態を表示することであり、関連行の前に「@」を付けると、その行の表示を避けることができる.
  • makeプログラム-fオプションを使用してMakefileを指定していない場合、makeソースバーの現在のディレクトリの下で、GNUMakefile、Makefile、makefileの順に次のファイルを探します.最初の文字が大文字なので、Makefileを使用することをお勧めします.通常、ディレクトリのファイルリストの一番前にリストされます.

  • makeコマンド:
    適切なMakefileが存在する場合、いくつかのソースファイルを変更するたびに、簡単なshellコマンドを使用します.
    make [  ][ ][  ]

    必要なすべての再コンパイルを完了するのに十分です.
    入力のみの場合
    make

    他のパラメータが指定されていない場合、makeはMakefileの最初の行のターゲットを維持します(つまり、最初の行のターゲットが依存する関係のみを検索更新することを意味します).
    makeプログラムは、メンテナンスの目標を指定することもできます.
    make module.o

    module 1だけをoターゲットとして、依存するファイルの更新のみを考慮する.
    自分で指定したMakefileファイルを使用する場合は、次のコマンドを使用します.
    make -f filename

    これにより、makeは現在のディレクトリの下でfilenameというMakefileファイルを探し、ファイルの関連行を読み込みます.
    Makefileファイルの実行命令の1行を指定することもできます.たとえば、Makefileファイルの内容は次のとおりです.
    exe:exe.o f.o
        gcc exe.o f.o -o exe
    exe.o: exe.c f.h
        gcc -c exe.c
    f.o:f.c f.h
        gcc -c f.c
    clean:
        rm -f exe *.o

    次のコマンドを使用します.
    make -f exe clean

    すると、rm -f exe *.oのコマンドが実行する、ディレクトリの下のexeファイルとをクリアする.o形式のファイル.
      
    例:module 1の2つのターゲットコードモジュールからなるアプリケーションexe 1.oとmodule 2.o ;そしてmodule 1.o module 1に依存する.cとmodule 1.h , module2.o module 2に依存する.cとmodule 2.h . Makefileは次のように書くべきです.
    exe1:module1.o module2.o
        gcc module1.o module2.o -o exe1
    module1.o:module1.c module1.h
        gcc -c module1.c
    module2.o:module2.c module2.h
        gcc -c module2.c

    Makefileのルール
    Makefileファイルには、次の2つの方法があります.
  • 手動作成
  • は自動的に手動で作成され、ファイルが多い場合、この方法は煩雑で、正確性も保証できない.自動生成を使用する傾向があります.コンパイラは、ソースファイルからファイルの相互依存関係を自動的に生成します.コンパイラが各ソースファイルをコンパイルすると、どのようなヘッダファイルが含まれるべきかがわかります.gccを使用する場合、-Mスイッチを使用すると、入力されたC言語ソースファイルごとに依存ルールを出力し、gccが生成するターゲットファイルをMakefileルールのターゲットファイルとし、このターゲットファイルを生成するC言語ソースファイルと参照すべきすべてのヘッダファイルを依存ファイルとすることができる.上記の方法gccは、システムのヘッダファイルとプログラムが持参するヘッダファイルを区別しない.一般にシステムヘッダファイルは変更されないため、出力の依存関係にシステムヘッダファイルが含まれることを避けるために、−Mパラメータを用いて−Mの代わりにgccに伝達することができる.gccはルールの依存関係のみを出力し,コマンド部分は含まれない.ユーザーは、必要なコマンドを自分で書き込むか、何も書かないかで、makeは暗黙のルールを使用します.

  • Makefileの変数
    Makefileの変数は環境変数のようなものです.この変数は大文字と小文字に敏感で、一般的に大文字を使用します.メリットは、変数の値が変化した場合、1つの場所で修正するだけで、Makefileのメンテナンスが簡素化されることです.機能:
  • 保存ファイル名リスト
  • コンパイラパラメータ
  • を保存
    次の操作を行います.
    Makefileの変数は、変数の値である文字列を使用してMakefileで定義されます.1行の先頭にこの変数の名前を書き、後に「=」番号を付け、設定する変数の値を付けるだけで、変数を定義できます.
       =   

    使用する場合は、変数をかっこで囲み、前に「$」記号を付けると、変数の値を参照できます.
    $(   )

    Makefileのデフォルト変数(略)
    例:
    上のMakefileを変数で書き直した後、
    #   
    exe:exe.o f.o
        gcc exe.o f.o -o exe
    exe.o: exe.c f.h
        gcc -c exe.c
    f.o:f.c f.h
        gcc -c f.c
    clean:
        rm -f exe *.o
    #   
    OBJS=exe.o f.o
    C=-c
    exe:$(OBJS)
        gcc $(OBJS) -o exe
    exe.o: exe.c f.h
        gcc $(C) exe.c
    f.o:f.c f.h
        gcc $(C) f.c
    clean:
        rm -f exe *.o

    ダミーターゲット
    Makefileでは、すべてのターゲットがディスク上のファイルに対応しているわけではありません.ルールを形成するためにmakeが特定の作業を完了させ、新しいターゲットファイルを生成しないターゲットがあり、このようなターゲットが偽ターゲットになります.例えば、上記の例のcleanは.よく見られる偽ターゲットはall、cleanなどです.
    例:
    all:exe1 exe2 exe3
    exe1:exe1.c exe1.h
        gcc exe1.c -o exe1
    exe2:exe2.c exe2.h
        gcc exe2.c -o exe2  
    exe3:exe3.c exe3.h
        gcc exe3.c -o exe3
    clean:
        rm -f exe*

    ここで、all、cleanは擬似ターゲットであり、擬似ターゲットと通常のターゲットはほぼ同じであるが、擬似ターゲットのターゲットファイルは存在しない.以上のMakefileの最初のルールはコマンド動作が空になり、makeはアクションを実行せず、依存ファイルの更新状況をチェックするだけなので、残りのいくつかのルールをスキャンして応答するコンパイルコマンドを実行して実行可能ファイルを生成します.同様に、他のルールに依存するcleanがないため、コマンドラインでmakeを実行する場合、このルールは実行されませんが、コマンドmake cleanを明確に使用すると、makeはコマンドラインのパラメータcleanをターゲットとし、対応する削除コマンドを実行します.
    じょうけんステートメント
    条件文には、ifeq、else、endifの3つの命令が含まれます.例:
    ifeq($(VAR),1)
        gcc -o exe1 module
    else
        gcc -o exe2 moudle
    endif
    #  Makefile        

    上記条件文は、変数VAR=1の場合、moudleモジュールコンパイル出力ファイルをexe 1、等しくない場合、moudleモジュールコンパイル出力ファイルをexe 2とすることを説明する.
    デバッグmake
    -dオプションを使用して、makeがコマンドを実行するときにデバッグ情報を印刷します.これらの情報には、次の内容が含まれます.
  • make再コンパイル時にチェックするファイル
  • それらのファイルが比較および比較された結果
  • 再生成が必要なファイル
  • makeが使用する暗黙のルール
  • makeが実際に実行する暗黙のルールおよびコマンド