2012-01-17 4 views
1

趣味として、私は単純なコンパイラを書いて、うまく動作することを確認するためのテストファイルをいくつか書きました。私はmakefileにいくつかの行を追加しました。そのため、あるコマンドでコンパイラをコンパイルし、テストファイルをコンパイルし(使用して)、アセンブルしてリンクすることができます。問題は、(コンパイラがリンクされた)オブジェクトファイルを削除してmakeにテストを実行するよう指示した場合、バイナリファイルがまだ存在するにもかかわらず、コンパイラが再コンパイルされるということです。私はmakeにそれをしないように伝えることはできますか? (でも、変更したソースファイルを再コンパイルし、コンパイラを再リンクするようにmakeに指示するオプションが必要です)。私のメイクファイルからオブジェクトファイルを削除した場合、makeに再コンパイルしないよう伝えるには?

いくつかの行:

OBJS=asm.o main.o type.o var.o ... 
SAMPLES=arr.out sample.out ... 
SAMPASM=arr.asm sample.asm ... 

all: myc 

myc: ${OBJS} 
    ${CC} ${LDFLAGS} -o myc ${OBJS} 

%.o: src/%.c src/myc.h 
    $(CC) $(CFLAGS) $< -o [email protected] 

test: ${SAMPLES} ${SAMPASM} 

%.out: %.aso asm/com.aso 
    ld $< asm/com.aso -o [email protected] 

%.aso: %.asm 
    nasm -f elf64 $< -o [email protected] 

%.asm: samples/%.myc myc 
    ./myc $< -o [email protected] 

clean: 
    rm -f *.o *.out *.asm myc 

答えて

4

あなたは.SECONDARYを使用することができますか.INTERMEDIATE

.INTERMEDIATEが依存するターゲットはとして を扱われ.INTERMEDIATE http://theory.uwinnipeg.ca/localfiles/infofiles/make/make_36.html

から中間ファイル。セクションChains of Implicit Rulesを参照してください。 依存関係のない.INTERMEDIATEは、 に記載されているすべてのファイルターゲットを中間ファイルとしてマークします。

.SECONDARY .SECONDARYが依存するターゲットは、自動的に決して削除されない点を除き、 中間ファイルとして扱われます。 参照。暗黙のルールのチェーン。依存関係のない.SECONDARY は、メイクファイルに記述されているすべてのファイルターゲットをセカンダリとしてマークします。一般

、あなたの.oファイルが自動的に削除したい場合、あなたは

を使用し、Oファイルが存在したりしない場合だけで気にしないために作りたい場合は、

.INTERMEDIATE: $(OBJS) 

を使用

.SECONDARY: $(OBJS) 
0

推奨事項:ごcompil別に

  • あなたのテストERビルドディレクトリ

(それはあなたが問題に遭遇しないように、あなたは、別のディレクトリにあなたのテストを行うべきである。)

私が作るGNUに手を加えていませんでした

.INTERMEDIATEまたは.SECONDARYファイル。それがあなたのために仕事をするかどうかわかりません。

私はあなたのための参照の代替オプションがたびにそのソースファイルやヘッダの変更のいずれかを全体のコンパイラを再構築することです。

FILES.c = src/main.c src/type.c src/var.c ... 
FILES.s = src/asm.s 
FILES.h = src/myc.h ... 

PROGRAM = myC 

all: ${PROGRAM} test 

${PROGRAM}: ${FILES.c} ${FILES.s} ${FILES.h} 
    ${CC} ${CFLAGS} -o [email protected] ${FILES.c} ${FILES.s} ${LDFLAGS} ${LDLIBS} 

コンパイラは苦痛ではないことが、このために十分に小さいですが、それは意志作業。ただし、コンパイラ自体のオブジェクトファイルの利点を完全に排除します。すべてが常に再コンパイルされることを意味します。しかし、コンパイラはそれらに依存すると文書化されていないので、いつでもオブジェクトファイルを取り除くことができます。

私はこれが間違ったアプローチだと確信していますが、それはうまくいくでしょう。コンパイラーをビルドし、コンパイラーでテストを実行するには、別個のディレクトリーを使用する必要があります。

+0

別のディレクトリにテストをビルドする場合、コンパイラが必要なときにコンパイラを再構築して、オブジェクトファイルがない場合、どのようにして保守しますか? – asaelr

+0

これはオブジェクトファイルに依存しません。コンパイラオブジェクトファイルが存在するかどうかは、たぶん偶然それらを使用するためです。 'make'は、コンパイラがソースとヘッダとアセンブラに依存していると言われています。これらのファイルが変更された場合は、*すべて*を再コンパイルします。コンパイラはオブジェクトファイルを生成するかもしれませんが、 'make'は気にしないように言われているので気にしません。 –

関連する問題