私は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を使用してタスクライン(
rm
、tar
など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
より前のファイルではないため、これ以上作業は必要ありません。.c
Makeが(再)ビルドする必要がある4つの状況があります。
.c
ファイルの1つを変更すると最新のファイルになり、hello
makeを実行したときに再構築する必要があります。- 削除したら、
hello
当然再構築する必要があります。- このオプションを使用すると、makeにすべてを再構築するように強制できます
-B
。make -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
臭いがひどくて使わないようです。とにかくあとで参考にできるように公開いたします。