[解決済み] makefileで別のターゲットを実行する
質問
以下のような構成のmakefileがあります。
all :
compile executable
clean :
rm -f *.o $(EXEC)
私は、"make all" を実行する前に、ターミナルで "make clean" と "clear" を一貫して実行していたことに気づきました。私は、厄介な C++ のコンパイルエラーを調べ上げる前に、ターミナルをクリーンな状態にしておきたいのです。そこで、3番目のターゲットを追加しようとしました。
fresh :
rm -f *.o $(EXEC)
clear
make all
これは動作しますが、これはmakeの2番目のインスタンスを実行します(と私は信じています)。2番目のmakeインスタンスを実行せずに同じ機能を得るための正しい方法はあるのでしょうか?
解決方法は?
実際、あなたの言う通り、makeの別のインスタンスが実行されています。 可能な解決策は、次のとおりです。
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
を呼び出すことで
make fresh
を取得すると、まず
clean
ターゲット、そして
clearscreen
を実行する
clear
で、最後に
all
を実行します。
編集部 8月4日
makeの並列ビルドの場合はどうなるのでしょうか?
-j
というオプションがあります。
順番を固定する方法があります。makeのマニュアル、4.2項より。
しかし、時には、起動するルールに特定の順序を課し、それらのルールのいずれかが実行された場合にターゲットを強制的に更新させたくないという状況が発生します。そのような場合、順序のみの前提条件を定義します。順序のみの前提条件は、前提条件リスト内にパイプ記号(|)を配置することで指定できます。パイプ記号の左側にある前提条件は通常、右側にある前提条件は順序のみです: targets : normal-prerequisites | order-only-prequisites
もちろん、通常の前提条件セクションは空でもかまいません。また、同じターゲットに対して複数行の前提条件を宣言することも可能です:それらは適切に追加されます。同じファイルを通常の前提条件と順序のみの前提条件の両方に宣言した場合、通常の前提条件が優先されることに注意してください(順序のみの前提条件の動作の厳密なスーパーセットであるため)。
したがって、makefileは次のようになります。
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
EDIT 12月5日
複数のmakefileインスタンスを実行しても、タスク内の各コマンドが サブシェル ということです。しかし、再利用可能なメソッドを持つには 呼び出し機能 .
log_success = (echo "\x1B[32m>> $1\x1B[39m")
log_error = (>&2 echo "\x1B[31m>> $1\x1B[39m" && exit 1)
install:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
command1 # this line will be a subshell
command2 # this line will be another subshell
@command3 # Use `@` to hide the command line
$(call log_error, "It works, yey!")
uninstall:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
....
$(call log_error, "Nuked!")
関連
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】Makefileの中の.PHONYの目的は何ですか?
-
[解決済み] CygwinでのMakefile
-
[解決済み] GNU make で "commands commence before first target" エラーが発生する。
-
[解決済み] Make: LDLIBS, 非推奨?
-
[解決済み] GNU Makefile の変数割り当て =, ?=, :=, += の違いは何ですか?
-
[解決済み] makefile の記号 $@ と $< はどういう意味ですか?
-
[解決済み] Makefile.amとMakefile.inとは何ですか?
-
[解決済み】makefileに'cd'コマンドを記述するには?
-
[解決済み】gcc makefileのエラー。"No rule to make target ..." (ターゲットにするルールがありません)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「make」と「make all」の違いとは?
-
[解決済み】なぜmakeはターゲットが最新だと思うのですか?
-
[解決済み] 「複数のターゲットパターン」Makefile のエラー
-
[解決済み] Make: LDLIBS, 非推奨?
-
[解決済み] PATH "文字列を表示するエコーファイルの作成
-
[解決済み] Makefile.amとMakefile.inとは何ですか?
-
[解決済み】ルール実行時にmake変数を定義する。
-
[解決済み] Make: コマンドが失敗した後、どのように続行するのですか?
-
[解決済み] makefileで別のターゲットを実行する
-
[解決済み] CLionでCMakeの代わりにローカルのmakefileを使用する