Gcc 为Makefiles自动生成的依赖项列表添加前缀(带/不带换行符)

Gcc 为Makefiles自动生成的依赖项列表添加前缀(带/不带换行符),gcc,makefile,compilation,echo,cat,Gcc,Makefile,Compilation,Echo,Cat,不确定标题是否有意义。。。所以我会详细说明一下 我正在玩弄这个使用gcc的自动依赖列表生成器的makefile 同时,我希望保持一个良好的分类目录结构,将源、头和资源分开 布局很好,很简单,就像这样 主要 src 包括 物体 依赖关系 现在,makefile依赖项列表生成器如下所示: $(DEP_PATH)%.d : $(SRC_PATH)%.c @${CC} $(CFLAGS) -MM -c $(INCLUDE) $< > $(DEP_PATH)$*.d inclu

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

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

同时,我希望保持一个良好的分类目录结构,将源、头和资源分开

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

  • 主要
    • src
    • 包括
    • 物体
    • 依赖关系
现在,makefile依赖项列表生成器如下所示:

$(DEP_PATH)%.d : $(SRC_PATH)%.c
    @${CC} $(CFLAGS) -MM -c $(INCLUDE) $< > $(DEP_PATH)$*.d
include $@
如果我将所有要在主目录中找到的对象都贴上标签,这将很好地工作。。。但是,由于它们位于/main/objects中,因此。。。make说它找不到/main/objects/foo1.o的规则

现在,我试着这样做:

@echo "$(OBJ_PATH)" > $(DEP_PATH)$*.d
@${CC} $(CFLAGS) -MM -c $(INCLUDE) $< >> $(DEP_PATH)$*.d
@echo“$(OBJ_路径)”>$(DEP_路径)$*.d
@${CC}$(CFLAGS)-MM-c$(INCLUDE)$<>>$(DEP_PATH)$*.d
>将对象路径提供给新的/覆盖的文件,然后将GCC自动依赖规则生成连接到该文件。。。但它在两个集合之间添加了换行符

我试着用上面提到的信息来分类两个不同的文件。。。但他们也有新线

是否有一种很好的方法可以在添加换行符的情况下预先结束依赖项文件

另外,如果你有关于makefile、cat和echo的非常好的教程,我会非常感激


谢谢您的回复。

您所问问题的答案是
sed

@${CC} blah blah blah | sed 's|^|$(OBJ_PATH)|' > $(DEP_PATH)$*.d
但这一部分会有不同的问题:

include $@
include
指令用于Make本身,它不是shell命令(如
$(CC)…
)。而
$@
是一个自动变量,在规则内定义,不可用于规则外的指令。相反,请尝试以下方法:

include $(DEP_PATH)/*.d

看一看。

我想还有其他选择,可能更好。。。我想我找到了解决问题的办法

我可以通过管道将回音输入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 $@
它将检查主可执行文件,然后包括依赖项文件(如果已创建)。(如果文件尚未生成,“-”将忽略错误…这是可以的,因为我的代码段将在之后运行。)


再次感谢您的建议和建设性批评。

Nice。在一行中完全符合我的要求。非常感谢你。不幸的是,我不知道sed是如何工作的。查看手册页,它显示了s/regex/replace,但这个s/^/$(OBJ_路径)实际上是在它前面加上了前缀。
^
表示行的开头,因此
s/^/foo/
是在它前面加上前缀的。另外,我使用了
|
而不是
/
作为可读性的分隔符,因为我是硬编码
/main/objects/
。当我切换到
$(OBJ_PATH)
时,我应该将
更改为
/
。再次感谢!顺便说一句,我想你的意思是$*,而不是*,不?@Code,不,Beta的意思是*,但我想他应该是包括$(对象文件:%=$(对象路径)/.d)@Pavel Shved,不,这不是我的意思。我同意如果
%.d
是一个单独的目标,则
$(对象文件:%%=%(DEP\u路径)/%.d)
工作得更好,但是如果生成
foo.d
的命令在
%.o
规则中,则可以使用
$(DEP\u路径)*.d
并避免一些不必要的修改。
$(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 $@
all: $(MAIN)
-include $(DEP)