make:「ビルド」とは何の関係もありません。

make:「ビルド」とは何の関係もありません。

私はC ++を学んでいますが、今は一般的な質問がありますが、プログラマーには適していませんが、IMHOはLinuxユーザーに最適です。

私が欲しい:

make

このコマンドは常に新しいバイナリを構築します。これはBashエイリアスを作成することで簡単に実行できます。たとえば、次のようになります。

alias make='\make clean && \make'

私はこれを定義したくありません。これはalias片側で達成できますか?Makefile

Makefile私が考えることができる最も簡単なものは次のとおりです。

PROGRAM=project

CXXFLAGS=-std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors

OPTIMIZATION=-O2

.PHONY: build
.PHONY: clean
.PHONY: distrib

build: ${PROGRAM}

clean:
    rm ${PROGRAM}

distrib:
    tar -czf ${PROGRAM}.tar.gz ${PROGRAM}.cpp Makefile

${PROGRAM}:
    g++ ${PROGRAM}.cpp ${CXXFLAGS} ${OPTIMIZATION} -o ${PROGRAM}

今この状態では、次のように言います。

make: Nothing to be done for 'build'.

本質的に最新のタイムスタンプを見ることができ、ビルドされないかもしれないと思います。

編集1:

これだけ追加します質問関係ありませんTab。バイナリが所定の位置にない場合は、正しく構築されます。

編集2:

Katsura Satoの回答に基づいて修正しました。

次のようになりますMakefile

https://www.vlastimilburian.cz/public/linux/Makefile.gz

(タブはテキストで表示できないため上げました)

それでも上記のように:

make: Nothing to be done for 'build'.

編集3:

$ make --version

GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

答え1

簡単なチェックリストは次のとおりです。

  • TABを使用してタスクライン(rmtarなどg++)をインデントします。
  • または代わりに$(FOO)変数を拡張するにはFOO${FOO}$FOO
  • 関連する場合は依存関係を追加します。

あなたのMakefile行は次のようにする必要があります(やはり、行は空白ではなくタブにインデントされます)。

PROGRAM=project
CXXFLAGS=-std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
OPTIMIZATION=-O2

.PHONY: build
.PHONY: clean
.PHONY: distrib      

build: $(PROGRAM)

clean:
        rm $(PROGRAM)

distrib:
        tar -czf $(PROGRAM).tar.gz $(PROGRAM).cpp Makefile

$(PROGRAM): $(PROGRAM).cpp
        g++ $(PROGRAM).cpp $(CXXFLAGS) $(OPTIMIZATION) -o $(PROGRAM)

答え2

私が見つけたStackOverflowへの回答

私は引用する:

Makeが正しく動作します。すでに存在し、そのファイルhelloより前のファイルではないため、これ以上作業は必要ありません。.cMakeが(再)ビルドする必要がある4つの状況があります。

  • .cファイルの1つを変更すると最新のファイルになり、hellomakeを実行したときに再構築する必要があります。
  • 削除したら、hello当然再構築する必要があります。
  • このオプションを使用すると、makeにすべてを再構築するように強制できます-Bmake -B all
  • make clean all削除してhello再作成する必要があります。 (@ Matのコメントを見ることをお勧めします。rm -f *.o hello

したがって、以前にバグで誤って評価されたソースコードファイルを変更しない限り、常にビルドに固執することはありません。ソースコードを変更すると、最初の実行時にmake正しく構築されます。明らかに二度目にする必要がないので、知的だと人間は言うこともできます。

どんな場合でも常に再構築したい場合は、次のように定義できます。

alias make='make -B'

または、より自明に説明することができます。

alias make='make --always-make'

ただし、次のように指定されています。

Unconditionally make all targets.

all targets臭いがひどくて使わないようです。とにかくあとで参考にできるように公開いたします。

関連情報