0

我在另一篇文章中问过这个问题,但可能太模糊了,所以我再试一次。

我有一个 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。我尝试了几件事,但无法弄清楚。

4

1 回答 1

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)

于 2012-10-19T12:24:00.067 回答