我在另一篇文章中问过这个问题,但可能太模糊了,所以我再试一次。
我有一个 Linux GNU C 项目,它需要为两个不同的硬件设备构建输出,使用一个通用的 C 源代码库,但使用不同的 makefile。有足够的磁盘空间,所以我不介意在两个不同的目录中拥有相同源文件的两个副本。目标使用不同的处理器,因此生成的 obj 和 exe 文件完全不同,即使编译的代码几乎相同(不同的预处理器指令等)。
我正在测试一个小的makefile来做到这一点。它需要处理 .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 和许多其他文件都比较新,所以应该有很多目标。有人可以帮我修复这个简单的makefile吗?我将如何更改它以处理 .h 文件呢?在此先感谢 - 格雷格
编辑:感谢@PW 的输入。我现在有这个:
DEST = $(addprefix ../firmware_us100c/, $(wildcard *.c))
all: $(DEST)
../firmware_us100c/%.c: %.c
cp $< $@
我如何扩展它以覆盖 .h 文件呢?
编辑:我玩弄了它并想出了这个来处理 .h 文件,以及三个需要更新的子目录。
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。我尝试了几件事,但无法弄清楚。