我在另一篇文章中问了这个问题,但可能太模糊了,所以我再试一次。
我有一个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进行额外修改以进行清理。还有一件事会有所帮助。有没有办法扭转逻辑,使其在目标(目标)目录中运行?因为它是我必须切换回&amp;编辑后的目录之间,更新源,然后运行makefile。我尝试了一些事情,但无法弄明白。
答案 0 :(得分:1)
你的makefile中有规则但没有目标。
CP = cp
# CP = cp -p # if you want to preserve dates
DEST = $(addprefix your_dest_folder/, $(wildcard *.c *.h))
all: $(DEST)
your_dest_folder/%.c: %.c
$(CP) $< $@
your_dest_folder/%.h: %.h
$(CP) $< $@
.PHONY: all
由于您有子目录,请将通配符更改为$(wildcard */*.c */*.h)