make Linuxのコマンドは、システム管理者とプログラマーが最も頻繁に使用するコマンドの1つです。管理者がコマンドラインから多くのオープンソースユーティリティをコンパイルおよびインストールするのに役立ちますが、プログラマーはこれを使用して、大規模で複雑なプロジェクトのコンパイルを管理します。この記事では、 makeの内部動作について説明します。 いくつかの実用的な例と一緒にコマンド。
作成の方法 コマンドワークス
知らない人のために、makeコマンドはコマンドライン引数としてターゲットを受け入れます。これらのターゲットは通常、「Makefile」という名前のファイルで指定されます。このファイルには、ターゲットに対応する関連アクションも含まれています。詳細については、Makefileの仕組みに関する一連の記事をご覧ください。
makeコマンドを初めて実行すると、Makefileをスキャンしてターゲット(提供されている)を見つけ、その依存関係を読み取ります。これらの依存関係がそれ自体がターゲットである場合、Makefileをスキャンしてこれらのターゲットを探し、依存関係(存在する場合)を構築してから、それらを構築します。主な依存関係が構築されると、主なターゲット(makeコマンドに渡されたもの)が構築されます。
ここで、1つのソースファイルのみに変更を加えてmakeコマンドを再度実行すると、そのソースファイルに対応するオブジェクトファイルのみがコンパイルされるため、最終的な実行可能ファイルのコンパイルにかかる時間を大幅に節約できます。
コマンド例を作成
この記事で使用したテスト環境の詳細は次のとおりです:
- OS – Ubuntu 13.04
- シェル– Bash 4.2.45
- アプリケーション– GNU Make 3.81
プロジェクトの内容は次のとおりです:
$ ls
anotherTest.c Makefile test.c test.h
Makefileの内容は次のとおりです:
all: test
test: test.o anotherTest.o
gcc -Wall test.o anotherTest.o -o test
test.o: test.c
gcc -c -Wall test.c
anotherTest.o: anotherTest.c
gcc -c -Wall anotherTest.c
clean:
rm -rf *.o test
それでは、Linuxでのmakeコマンドの使用例をいくつか見てみましょう。
1)簡単な例
プロジェクトをコンパイルするには、単に「make」を使用するか、makeコマンドでターゲットの「all」を使用できます。
$ make
gcc -c -Wall test.c
gcc -c -Wall anotherTest.c
gcc -Wall test.o anotherTest.o -o test
したがって、makeコマンドが最初に依存関係を作成し、次に実際のターゲットを作成することがわかります。
ディレクトリの内容を見ると、.oファイルと実行可能ファイルが含まれています:
$ ls
anotherTest.c anotherTest.o Makefile test test.c test.h test.o
ここで、test.cに変更を加え、make:
を使用してプロジェクトを再コンパイルするとします。$ make
gcc -c -Wall test.c
gcc -Wall test.o anotherTest.o -o test
したがって、test.oのみが再コンパイルされ、anotherTest.oは再コンパイルされないことがわかります。
これで、「test」実行可能ファイルとともにすべてのオブジェクトファイルをクリーンアップするために、ターゲット「clean」を使用できます:
$ make clean
rm -rf *.o test
$ ls
anotherTest.c Makefile test.c test.h
したがって、すべての.oファイルと実行可能ファイルの「test」が削除されたことがわかります。
2)常に-Bオプションを使用してすべてのターゲットを作成します
ここまでで、makeコマンドが前回から変更されていないファイルをコンパイルしないことをおそらくご存知でしょう。ただし、makeのデフォルトの動作をオーバーライドする場合は、-Bオプションを使用できます。
次に例を示します:
$ make
make: Nothing to be done for `all'.
$ make -B
gcc -c -Wall test.c
gcc -c -Wall anotherTest.c
gcc -Wall test.o anotherTest.o -o test
したがって、「make」コマンドはファイルをコンパイルしませんでしたが、「make -B」は、最終的な実行可能ファイルとともにすべてのオブジェクトを強制的にコンパイルしたことがわかります。
3)-dオプションを使用してデバッグ情報を出力します
makeコマンドが実行されたときに実際に何をするかについての詳細な説明が必要な場合は、-dオプションを使用してください。
次に例を示します:
$ make -d | more
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-pc-linux-gnu
Reading makefiles...
Reading makefile `Makefile'...
Updating makefiles....
Considering target file `Makefile'.
Looking for an implicit rule for `Makefile'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.o'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.c'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.cc'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.C'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.cpp'.
Trying pattern rule with stem `Makefile'.
--More--
長い出力です。 もっとを使用したことがわかります ページごとに出力を表示するコマンド。このオプションで生成できる詳細をよりよく理解するには、それを自分で確認する必要があります。
4)-Cオプションを使用してディレクトリを変更します
makeコマンドに別のディレクトリパスを指定できます。このパスは、Makefileを探す前に切り替わります。
これが例です。現在このディレクトリにいるとします:
$ ls
file file2 frnd frnd1.cpp log1.txt log3.txt log5.txt
file1 file name with spaces frnd1 frnd.cpp log2.txt log4.txt
ただし、Makefileを../make-dir/に保持してmakeを実行する必要があります。だからここにあなたがしなければならないことがあります:
$ make -C ../make-dir/
make: Entering directory `/home/himanshu/practice/make-dir'
make: Nothing to be done for `all'.
make: Leaving directory `/home/himanshu/practice/make-dir'
したがって、makeコマンドが指定されたディレクトリに切り替わり、そこで実行されてから元に戻ったことがわかります。
5)-fオプションを使用して他のファイルを「Makefile」として扱います
Makefileの名前を「my_makefile」またはその他の名前に変更し、makeコマンドでデフォルトの「Makefile」のように処理する場合は、-fオプションを使用できます。
次に例を示します:
make -f my_makefile
このようにして、makeコマンドはMakefileの代わりにmy_makefileを選択してスキャンします。