2012-10-19 143 views
0

我在另一个帖子中问了这个问题,但可能太含糊,所以我再试一次。使用GNU make来复制源文件

我有一个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 $< [email protected] 

当我测试这个文件“使-f测试-n”它回应:

make: *** No targets. Stop. 

我与“统计”是main.c中,许多验证源文件夹中的其他人更新,所以应该有很多目标。有人可以帮我修复这个简单的makefile吗?我怎么改变它来处理.h文件呢? 在此先感谢 - 格雷格

编辑:谢谢@PW为您的输入。我现在有这个:

DEST = $(addprefix ../firmware_us100c/, $(wildcard *.c)) 
all: $(DEST) 
../firmware_us100c/%.c: %.c 
    cp $< [email protected] 

我该如何扩展它来覆盖.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 $< [email protected] 
../firmware_us100c/%.h: %.h 
    cp $< [email protected] 
../firmware_us100c/zem510/%.c: zem510/%.c 
    cp $< [email protected] 
../firmware_us100c/zem510/%.h: zem510/%.h 
    cp $< [email protected] 
../firmware_us100c/fpsensor/%.c: fpsensor/%.c 
    cp $< [email protected] 
../firmware_us100c/fpsensor/%.h: fpsensor/%.h 
    cp $< [email protected] 
../firmware_us100c/iclock/%.c: iclock/%.c 
    cp $< [email protected] 
../firmware_us100c/iclock/%.h: iclock/%.h 
    cp $< [email protected] 

如果有更清洁的方式,请让我知道。

编辑:谢谢@PW的额外编辑来清理它。还有一件事会有帮助。有没有方法来逆转逻辑,以便它将在目标(目标)目录中运行?因为我必须在编辑后的目录之间切换回&以更新源文件,然后运行makefile。我尝试了一些东西,但无法弄清楚。

+0

那是*所有*您在Makefile中有吗? – bmargulies

+0

是的,项目生成器位于单独的生成文件中。如果我能弄清楚如何,我会将它合并,以便更新源文件,然后构建项目。 – pwrgreg007

+0

您与包含合并。 – bmargulies

回答

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) $< [email protected] 

your_dest_folder/%.h: %.h 
    $(CP) $< [email protected] 

.PHONY: all 

,因为你有子目录,改变通配符$(wildcard */*.c */*.h)

+0

你应该解释你的答案并举一个例子。 – Stony

+0

您可以将其作为评论发布... –

+0

这适用于较小的修改。我删除了-p因为我想要更新目标日期戳。我的示例从目标文件夹运行,并且您的源代码从源文件运行。看到我上面的编辑。 – pwrgreg007