Linuxでのmakeコマンドの使用について詳しく説明します
コードが実行可能ファイルになり、コンパイル(compile)と呼ばれます。これを先にコンパイルするか、それを先にコンパイルするか(つまりコンパイルの手配)、構築(build)と呼ばれます。
一、Makeの概念Makeという言葉は、英語で「作る」という意味です。Makeコマンドは直接この意味を使って、あるファイルを作ることです。たとえば、ファイルa.txtを作成するには、次のコマンドを実行します。
コードのコピーしかし、もしあなたが本当にこのコマンドを入力したら、それは役に立たない。Makeコマンド自体がa.txtの作成方法を知らないため、他のコマンドを呼び出してこの目標を達成する方法を教えてくれる人が必要です。
例えば、ファイルa.txtは、b.txtおよびc.txtに依存し、後の2つのファイル接続(catコマンド)の生成物であると仮定する。では、makeは次のルールを知る必要があります。
コードのコピーcat b.txt c.txt > a.txt
すなわち、make a.txtというコマンドの背後には、実際には2つのステップがあります。第1のステップは、b.txtとc.txtがすでに存在していることを確認し、第2のステップはcatコマンドを使用してこの2つのファイルをマージし、新しいファイルに出力します。
このようなルールは、Makefileというファイルに書かれており、Makeコマンドはこのファイルに依存して構築されます。Makefileファイルはmakefileと書くか、コマンドラインパラメータで他のファイル名として指定することもできます。$ make -f rules.txt
#または $ make --file=rules.txt上のコードはmakeコマンドがrulesに従うことを指定します。txtファイルのルールを構築します。
二、Makefileファイルのフォーマット2.1概要
Makefileファイルは一連のルール(rules)で構成されています。各ルールの形式は以下の通りです。
コードのコピー上の最初の行のコロンの前の部分を「ターゲット」(target)と呼び、コロンの後ろの部分を「前置条件」(prerequisites)と呼ぶ。2行目はtabキーで始まり、「コマンド」(commands)に続く必要があります。
「目標」は必要で、省略できない。「前条件」と「コマンド」はオプションですが、少なくとも1つは存在する必要があります。
2.2目標(target)ファイル名に加えて、ターゲットはアクションの名前であってもよい。これを「擬似ターゲット」(phony target)と呼ぶ。
コードのコピーrm *.o
上のコードのターゲットはcleanで、ファイル名ではなく、操作の名前であり、「擬似ターゲット」に属し、オブジェクトファイルを削除する役割を果たします。
コードのコピーただし、現在のディレクトリにcleanというファイルがある場合、このコマンドは実行されません。Makeはcleanファイルがすでに存在することを発見したので,再構築する必要はないと考え,指定したrmコマンドは実行しない.
このような状況を避けるためにcleanを「偽のターゲット」と明確に宣言することができ、書き方は以下の通りである。
コードのコピーrm *.o temp
cleanが「擬似ターゲット」であることを宣言すると、makeはcleanというファイルが存在するかどうかをチェックするのではなく、実行するたびに対応するコマンドを実行します。像PHONYのような内蔵ターゲット名はまだまだあるので、マニュアルを見ることができます。コードのコピー
$ make前の条件は、通常、ファイル名のセットで、スペースで区切られます。ターゲットが再構築されるかどうかの判断基準を指定します。ターゲットは、ターゲットのタイムスタンプよりも新しいlast-modificationタイムスタンプがある場合、または更新された場合に再構築する必要があります。
コードのコピーcp source.txt result.txt
上のコードではresultを構築します。txtの前置条件はsourceである.txt 。現在のディレクトリの場合、source.txtはすでに存在し、make result.txtは正常に動作し、そうでなければsourceを生成するためにもう一つのルールを書かなければならない。txt 。
コードのコピーecho "this is the source" > source.txt
上のコードではsource.txtの後ろに前置条件がないということは、他のファイルとは無関係であることを意味し、このファイルがまだ存在しない限りmake sourceを呼び出すたびに.txtは、生成されます。$ make result.txt
$ make result.txtコードのコピー
source: file1 file2 file3
上のコードでは、sourceは偽のターゲットであり、3つの前置ファイルしかなく、対応するコマンドはありません。$ make source
make sourceコマンドを実行すると、file 1,file 2,file 3の3つのファイルが一度に生成されます。これは次の書き方よりずっと便利です。
コードのコピー$ make file2
$ make file3コマンド(commands)は、ターゲットファイルを更新する方法を示し、1行または複数行のShellコマンドで構成されます。これは、通常、ターゲットファイルを生成する「ターゲット」を構築する具体的なコマンドです。
各行のコマンドの前にtabキーが必要です。他のキーを使用する場合は、内蔵変数を使用できます。RECIPEPREFIX宣言。.RECIPEPREFIX = >
all:各行のコマンドは、個別のshellで実行されることに注意してください。これらのシェルの間には継承関係はありません。
コードのコピーecho "foo=[$$foo]"
上のコードが実行されると(make var-lost)、fooの値が取れません。2行のコマンドは2つの異なるプロセスで実行されるためです。1つの解決策は、2行のコマンドを1行に書き、真ん中をセミコロンで区切ることです。var-kept:
export foo=bar; echo "foo=[$$foo]"コードのコピー
var-kept:echo "foo=[$$foo]"
最後の方法は加えることです。ONESHELL:コマンド。
コードのコピーexport foo=bar;
echo "foo=[$$foo]"井戸番号(#)はMakefileにコメントを表示します。
コードのコピーresult.txt: source.txt
コメントです通常、makeは各コマンドを印刷して実行します。これをエコー(echoing)と言います。
コードのコピーこれはテストです
上記のルールを実行すると、次の結果が得られます。
コードのコピーこれはテストです
命令の前に@を付けると、エコーを閉じることができます。test:
@#これはテストです
今からmake testを実行しても、出力はありません。test:
@#これはテストですワイルドカードは、条件を満たすファイル名のセットを指定するために使用されます。MakefileのワイルドカードはBashと一致しており、主にアスタリスク(*)、疑問符(?)がある。と[...]。例えば、*.oは、すべての接尾辞がoというファイルを表す。
コードのコピーclean:
rm -f *.oMakeコマンドでは、ファイル名を正規演算のように一致させることができます。主に使用される一致子は%です。例えば、現在のディレクトリの下にf 1があるとする.cとf 2.c 2つのソースファイルは、対応するオブジェクトファイルにコンパイルする必要があります。
コードのコピーコードのコピー
f1.o: f1.cMakefileでは、変数を等号でカスタマイズできます。
コードのコピーtxt = Hello World
test:@echo $(txt)
上記のコードでは、変数txtはHello Worldに等しい。呼び出す場合、変数は$()に配置する必要があります。Shell変数を呼び出すには、Makeコマンドがドル記号をエスケープするため、ドル記号の前にドル記号を追加する必要があります。
コードのコピー
test: < 指代前置文件(src/%.txt), $@ 指代目标文件(dest/%.txt)。 @echo $$HOME変数の値が別の変数を指す場合があります。
コードのコピー上記のコードでは、変数v 1の値は別の変数v 2である。v 1の値が定義時に拡張(静的拡張)されるのか、実行時に拡張(動的拡張)されるのかという問題が発生します。v 2の値がダイナミックである場合、この2つの拡張方式の結果は大きく異なる可能性があります。
同様の問題を解決するために、Makefileには4つの付与演算子(=、:=、?=、+=)が用意されています。違いはStackOverflowを参照してください。VARIABLE = value
#実行時に拡張し、再帰的な拡張を許可します。VARIABLE ?= value
#変数が空の場合にのみ値を設定します。#変数の末尾に値を追加します。
3.6組み込み変数(Implicit Variables)Makeコマンドは、$(CC)が現在使用されているコンパイラを指し、$(MAKE)が現在使用されているMakeツールを指すなど、一連の組み込み変数を提供します。これは主にプラットフォーム間の互換性のためであり、詳細な組み込み変数リストはマニュアルを参照してください。
コードのコピー3.7自動変数(Automatic Variables)
Makeコマンドには、現在のルールに関連する自動変数も用意されています。主に以下のようなものがあります。コードのコピー
a.txt b.txt:b.txt:
touch b.txt コードのコピー