1

不确定标题是否有意义......所以我会详细说明一下。

我正在玩弄这个使用 gcc 的自动依赖列表生成器的 makefile。

同时,我想保持一个良好的排序目录结构,将源、标头和资源分开。

布局很好很简单,就像这样

  • 主要的
    • 源代码
    • 包括
    • 对象
    • 依赖关系

现在,makefile 依赖列表生成器 atm 是这样的:

$(DEP_PATH)%.d : $(SRC_PATH)%.c
    @${CC} $(CFLAGS) -MM -c $(INCLUDE) $< > $(DEP_PATH)$*.d
include $@

这里的想法是我们生成依赖规则,然后将其包含到 make 构建中。

foo1.o 的结果是:

foo1.o: src/foo1.c include/foo1.h include/foo2.h include/foo3.h

如果我将所有对象标记为在主目录中找到,这将正常工作......但是因为它们在 /main/objects 中...... make 说它找不到 /main/objects/foo1 的规则。 ○

现在,我尝试了这个:

@echo "$(OBJ_PATH)" > $(DEP_PATH)$*.d
@${CC} $(CFLAGS) -MM -c $(INCLUDE) $< >> $(DEP_PATH)$*.d

> 将对象路径提供给新/覆盖的文件,然后将 GCC 自动依赖规则生成连接到它......但它在两组之间添加了换行符。

我也尝试使用所述信息对两个单独的文件进行分类......但他们也得到了换行符。

有没有一种好方法可以在不添加换行符的情况下添加依赖文件?

另外,如果您有关于 makefile、cat 和 echo 的任何真正好的教程,我将不胜感激。

感谢您的所有回复。

4

2 回答 2

3

你问的问题的答案是sed

@${CC} blah blah blah | sed 's|^|$(OBJ_PATH)|' > $(DEP_PATH)$*.d

但是这部分你会有一个不同的问题:

include $@

include指令用于 Make 本身,它不是 shell 命令(如$(CC)...)。并且$@是在规则内定义的自动变量,对规则外的指令不可用。相反,尝试这样的事情:

include $(DEP_PATH)/*.d

并查看Advanced Auto-Dependency Generation

于 2010-07-27T16:47:38.703 回答
0

虽然我想有其他选择,可能是更好的选择......我想我找到了解决问题的方法。

我可以将 echo 输入 tr 以删除换行符。所以结果代码是:

$(DEP_PATH)%.d : $(SRC_PATH)%.c
    @echo "$(OBJ_PATH)" | tr -d '\n' > $(DEP_PATH)$*.d
    @${CC} $(CFLAGS) -MM -c $(INCLUDE) $< >> $(DEP_PATH)$*.d
cat $@
include $@

现在执行以下操作...

1) 对于每个 .d,确保 .c 存在并且是最新的。

2)显对象路径,| (管道)它到tr将删除换行符,然后>将使结果覆盖/创建到 .d 文件

3)让 $(CC) 生成依赖列表......不幸的是,它排除了目标文件的预期位置(这就是存在 1-2 行的原因)

4) 只需将生成的文件连接到终端(不需要,但我喜欢现在可以使用!)

5) 使生成的依赖项列表包含在构建中。

值得注意的是,在随后的运行中......我将其列在最前面:

all: $(MAIN)
-include $(DEP)

这将检查主要的可执行文件,然后包含依赖文件(如果它们已创建)。(如果尚未制作文件,则 - 在这里忽略错误......这没关系,因为我从一开始的片段将在之后运行。)

再次,感谢任何建议和建设性的批评。

于 2010-07-27T16:53:21.600 回答