Makefileを使ってコンパイルしています。きれいパスワード。私のクリーンファイルには、次の形式のファイル名が*.icl
あります.icl
。
$(EXE): % : %.icl | copy
$(CLM) $(CLM_LIBS) $(CLM_INC) $(CLM_OPTS) $@ -o $@
それでは、バイナリを実行できるルールを追加したいと思います。最近はよくあります。
make some_module && ./some_module
上記のルールに従ってモジュールを実行する make ターゲットが欲しい。しかし、モジュール名自体はすでに別々のコンパイル対象なので、そのままにしたいと思います。私が望むのはmake run some_module
、呼び出し可能で上記の規則に従って実行できる2つの単語を持つターゲットです./some_module
。
複数の単語を含むターゲットを作成できますか?
私は次の規則を作成しようとしました(今は依然として依存関係がありません)。
run $(EXE):
./$@
実行すると、make run some_module
多くのレシピが「上書き」と「無視」され、最終的に./run
存在しなくなります。
Makefile:24: warning: overriding recipe for target 'tut7_2_2'
Makefile:21: warning: ignoring old recipe for target 'tut7_2_2'
Makefile:24: warning: overriding recipe for target 'support_check'
Makefile:21: warning: ignoring old recipe for target 'support_check'
[...]
Makefile:24: warning: overriding recipe for target 'drawingframe'
Makefile:21: warning: ignoring old recipe for target 'drawingframe'
./run
/bin/bash: ./run: No such file or directory
Makefile:24: recipe for target 'run' failed
make: *** [run] Error 127
ベストアンサー1
あなたは使用することができます$(MAKECMDターゲット)run
コマンドラインで指定された他のターゲットの中で最後に強制します。以下の例は、Cleanがわからないので、Cで書かれています。
EXE = a b c
%: %.c
$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
all: $(EXE)
clean:
rm -f $(EXE)
run: $(filter-out run, $(MAKECMDGOALS))
@for i in $^; do ./$$i; done
.PHONY: all clean run
make run program
常に不要な出力を生成するため、少しぎこちないように見えますprogram is up to date
。
$ cat a.c
#include <stdio.h>
int main(int argc, char **argv) { printf("This is %s\n", argv[0]); return 0; }
$ cp a.c b.c
$ cp a.c c.c
$ make run a b
cc -o a a.c
cc -o b b.c
This is ./a
This is ./b
make: 'a' is up to date.
make: 'b' is up to date.
make program run
そのような出力がなければ、英語のようにもっと自然になるかもしれません。
$ make c run
cc -o c c.c
This is ./c