web-dev-qa-db-ja.com

小さなプロジェクトで `make`を使用する利点は何ですか?

makeは、特にMakefileで説明されている複雑な依存関係があり、ワークフローにも役立つ大規模なプロジェクトに役立つことがわかりました。小さなプロジェクトでmakeを使用する利点は何も聞いていません。いずれかがあります?

8
Goodwin Lu

何とは対照的に?

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から始めて、後でマージ/リファクタリングする必要がある場合は、すべてのプロジェクトを個別にビルドすることを覚えておく必要はありません。

15
Stack Tracer

小さなプロジェクトでも、依存関係ロジックを制御し、ビルドを自動化するのに役立ちます。インストールとアンインストールのトリガーにも使用したため、ステージをリセットするメインスイッチでした。

5
user147505

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に詳しい人にとっては非常に便利で完全に透過的です。手動スクリプトよりもはるかに優れています。

3
user996142

非常に小さなプロジェクトの例MakefilegetPixelColor

これは、その名前のとおり正確に実行され、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)

ご覧のとおり、追加で入力することなく、必要なすべてを実行できます。


使用法

次の方法で実行できます。

  1. 古いバイナリをクリーンアップします。

    make clean
    
  2. 新しいバイナリをコンパイルします。

    make
    
  3. 2つの方法で実行可能ファイルを実行します。

    • デフォルトの座標[0,0]

      make run     # equals COORDS='0 0'
      
    • 与えられた座標

      COORDS='5 6' make run
      

Makefileは時に非常に役立ちます。プロジェクトが大きいほど、利益も大きくなります。しかし、私の最小のC++プロジェクトを使用しても、例を見るとわかるように、多くの頭痛の種を省くことができます。

1

makeはかなり確実に利用できます。 makefileを使用してプロジェクトを配布すると、ユーザーは、同じ方法でタスクを実行する方法についての簡単なリファレンスを利用できます。 makefileはコンパイルだけではありません。

たとえば、コンパイルを必要としないプロジェクトを考えてみましょう。すべての.pycファイルをクリアするmakeコマンド、テストを実行するmakeコマンド、静的データのコピーをダウンロードするmakeコマンドを含むPythonプロジェクトで作業したことを思い出します開発サーバーなどから.

0
Adam Barnes