別の投稿でこの質問をしましたが、おそらく漠然としすぎていたので、もう一度試してみます。
私は Linux GNU C プロジェクトを持っています。このプロジェクトでは、共通の C ソース コード ベースを使用しますが、メイクファイルは異なります。ディスク容量は十分にあるので、同じソース ファイルの 2 つのコピーが 2 つの異なるディレクトリに存在してもかまいません。ターゲットは異なるプロセッサを使用するため、コンパイルされたコードがほぼ同じ (異なるプリプロセッサ ディレクティブなど) であっても、生成される obj ファイルと exe ファイルは完全に異なります。
これを行うために小さなメイクファイルをテストしています。.c & .h ファイルを処理する必要がありますが、今のところ .c のみを処理します。ソース ディレクトリは「/mnt/hgfs/works/firmware_us10c」で、兄弟ディレクトリ「/mnt/hgfs/works/firmware_us100c」にコピーしています。これは次のようになります。
%.c : ../firmware_us10c/%.c
<tab>cp $< $@
このファイルを「make -f test -n」でテストすると、次のように応答します。
make: *** No targets. Stop.
「stat」で、ソース フォルダー内の main.c およびその他の多くが新しいことを確認したので、ターゲットがたくさんあるはずです。誰かがこの単純なメイクファイルを修正するのを手伝ってくれますか? .h ファイルも処理するように変更するにはどうすればよいですか? 前もって感謝します - グレッグ
編集: @PW ご意見ありがとうございます。私は今これを持っています:
DEST = $(addprefix ../firmware_us100c/, $(wildcard *.c))
all: $(DEST)
../firmware_us100c/%.c: %.c
cp $< $@
これを拡張して .h ファイルもカバーするにはどうすればよいですか?
編集:私はそれをいじって、.hファイルと、更新が必要な3つのサブディレクトリを処理するためにこれを思い付きました。
DEST = $(addprefix ../firmware_us100c/, $(wildcard *.c))
DEST += $(addprefix ../firmware_us100c/, $(wildcard *.h))
DEST += $(addprefix ../firmware_us100c/, $(wildcard zem510/*.c))
DEST += $(addprefix ../firmware_us100c/, $(wildcard zem510/*.h))
DEST += $(addprefix ../firmware_us100c/, $(wildcard fpsensor/*.c))
DEST += $(addprefix ../firmware_us100c/, $(wildcard fpsensor/*.h))
DEST += $(addprefix ../firmware_us100c/, $(wildcard iclock/*.c))
DEST += $(addprefix ../firmware_us100c/, $(wildcard iclock/*.h))
all: $(DEST)
../firmware_us100c/%.c: %.c
cp $< $@
../firmware_us100c/%.h: %.h
cp $< $@
../firmware_us100c/zem510/%.c: zem510/%.c
cp $< $@
../firmware_us100c/zem510/%.h: zem510/%.h
cp $< $@
../firmware_us100c/fpsensor/%.c: fpsensor/%.c
cp $< $@
../firmware_us100c/fpsensor/%.h: fpsensor/%.h
cp $< $@
../firmware_us100c/iclock/%.c: iclock/%.c
cp $< $@
../firmware_us100c/iclock/%.h: iclock/%.h
cp $< $@
もっときれいな方法があれば教えてください。
編集:それをきれいにするための追加の編集をしてくれた@PWに感謝します。もう一つ、役に立ちそうなことがあります。宛先 (ターゲット) ディレクトリで実行されるようにロジックを逆にする方法はありますか? そのままでは、編集後にディレクトリを前後に切り替えてソースを更新し、makefile を実行する必要があります。私はいくつかのことを試しましたが、それを理解できませんでした。