make
は、特にMakefile
で説明されている複雑な依存関係があり、ワークフローにも役立つ大規模なプロジェクトに役立つことがわかりました。小さなプロジェクトでmake
を使用する利点は何も聞いていません。いずれかがあります?
何とは対照的に?
file1.c
およびfile2.c
という想像上の名前を付けた2つのファイルに分割したプログラムがあるとします。実行することでプログラムをコンパイルできます
cc file1.c file2.c -o yourprogram
ただし、変更したファイルが1つだけであっても、両方のファイルを毎回再コンパイルする必要があります。コンパイル手順を次のように分解できます。
cc -c file1.c
cc -c file2.c
cc file1.o file2.o -o yourprogram
次に、いずれかのファイルを編集するときは、そのファイルのみを再コンパイルします(変更内容に関係なく、リンク手順を実行します)。しかし、1つのファイルを編集したらそれからもう1つで、両方のファイルを編集したことを忘れて、誤って1つだけを再コンパイルした場合はどうでしょうか。
また、ファイルが2つしかない場合でも、そこには約60文字分のコマンドがあります。入力するのはすぐに退屈になります。確かに、それらをスクリプトに入れることはできますが、その後は毎回再コンパイルする必要があります。または、どのファイルが変更されたかをチェックし、必要なコンパイルのみを実行する、本当に豪華で複雑なスクリプトを書くこともできます。これでどこへ行くのか分かりますか?
他の多くの人々は、より複雑なメイクファイルの詳細と、それらに伴う複雑さの多くに取り組んでいます。私は通常、完全に異なる理由でメイクファイルを使用します。
プロジェクトが本当に退屈でシンプルで、makefileを「正しく」使用していない場合でも、
all:
gcc main.c -o project
私はそれについて考えたり、より複雑なプロジェクトと違った扱いをする必要はありません。
all:
gcc libA.c libB.c main.c -o project2
または、フラグを指定した場合(例:-O2
)私は彼らが何であったかを覚える必要はありません。
また、単純なmakefileから始めて、後でマージ/リファクタリングする必要がある場合は、すべてのプロジェクトを個別にビルドすることを覚えておく必要はありません。
小さなプロジェクトでも、依存関係ロジックを制御し、ビルドを自動化するのに役立ちます。インストールとアンインストールのトリガーにも使用したため、ステージをリセットするメインスイッチでした。
2つのソース(.c
ファイル)からアプリをリンクする場合、各ファイルを再コンパイルする必要はありませんが、makeを使用している場合は変更されたファイルのみを再コンパイルする必要があります。
また、BSDの世界の例を紹介します。彼らはシステムベースのメイクファイルのフレームワークを持っています。それらはシステムディレクトリへのパスを提供し、ソフトウェアとマニュアルページをインストールするためのターゲットを持っています。
たとえば、beer.c
アプリとbeer.6
というマニュアルを作成したとします。 Makefile
を作成します。
PROG= beer
MAN= beer.6
.include <bsd.prog.mk>
..そしてmake install
を呼び出します。アプリを自動的にコンパイルして/usr/bin
にインストールし、man
が見つけられる場所にマニュアルページをコンパイルしてインストールします。 1つの簡単なコマンドでアプリをインストールしました!
BSDに詳しい人にとっては非常に便利で完全に透過的です。手動スクリプトよりもはるかに優れています。
Makefile
:getPixelColor
これは、その名前のとおり正確に実行され、2つのオプションの引数、座標を取ります。
私は特に物事がそこに依存する方法が好きです。
COORDS ?= 0 0
CXX := g++-8
CXXFLAGS := -std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
LDLIBS := -lX11
RM := rm -f
BIN := getPixelColor
SRC := $(BIN).cpp
$(BIN): $(SRC)
$(CXX) $(CXXFLAGS) $(SRC) -o $(BIN) $(LDLIBS)
.PHONY: clean
clean:
$(RM) $(BIN)
.PHONY: run
run: $(BIN)
./$(BIN) $(COORDS)
ご覧のとおり、追加で入力することなく、必要なすべてを実行できます。
次の方法で実行できます。
古いバイナリをクリーンアップします。
make clean
新しいバイナリをコンパイルします。
make
2つの方法で実行可能ファイルを実行します。
デフォルトの座標[0,0]
make run # equals COORDS='0 0'
与えられた座標
COORDS='5 6' make run
Makefileは時に非常に役立ちます。プロジェクトが大きいほど、利益も大きくなります。しかし、私の最小のC++プロジェクトを使用しても、例を見るとわかるように、多くの頭痛の種を省くことができます。
make
はかなり確実に利用できます。 makefile
を使用してプロジェクトを配布すると、ユーザーは、同じ方法でタスクを実行する方法についての簡単なリファレンスを利用できます。 makefile
はコンパイルだけではありません。
たとえば、コンパイルを必要としないプロジェクトを考えてみましょう。すべての.pyc
ファイルをクリアするmakeコマンド、テストを実行するmakeコマンド、静的データのコピーをダウンロードするmakeコマンドを含むPythonプロジェクトで作業したことを思い出します開発サーバーなどから.