Sed 在makefile中连接两个字符串列表

Sed 在makefile中连接两个字符串列表,sed,makefile,gnu,Sed,Makefile,Gnu,在mymakefile中有一个包含所有源文件的变量: SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT)) 现在我想创建一个DEPFILES,它包含与源文件相同的文件,但有两个主要区别: 每个文件以“.d”而不是“.c”结尾 每个文件的basename前都包含一个“.”,因此生成的文件是隐藏的 我想出了一个很好的表达方式: DEPFILES := $(foreach s,$(SOURCES:.$(SRCEXT)=.$(DEPS

在my
makefile
中有一个包含所有源文件的变量:

SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
现在我想创建一个
DEPFILES
,它包含与
源文件相同的文件,但有两个主要区别:

  • 每个文件以“.d”而不是“.c”结尾
  • 每个文件的basename前都包含一个“.”,因此生成的文件是隐藏的
  • 我想出了一个很好的表达方式:

    DEPFILES := $(foreach s,$(SOURCES:.$(SRCEXT)=.$(DEPSEXT)),$(shell echo $(s) | sed -e 's/^\(.*\/\)/\1./')))
    
    最初,我将
    源划分为以下列表:

    PRE := $(dir $(SOURCES))
    SUF := $(addprefix ".", $(notdir $(SOURCES)))
    

    问题:如何在makefile中连接这两个列表,使结果等于
    DEPFILES
    ?换句话说:如何成对地从两个列表中提取字符串?

    这里有一个更简单的方法,只使用makefile而不使用shell-如果我理解您的要求,好的:

    SRCS += bob/src1.c fred/src2.c src3.c
    DEPS=$(join $(addsuffix ., $(dir $(SRCS))), $(notdir $(SRCS:.c=.d)))
    
    # Some debug:
    $(info 1. $(SRCS))
    $(info 2. $(SRCS:.c=.d))
    $(info 3. $(notdir $(SRCS:.c=.d)))
    $(info 4. $(dir $(SRCS)))
    
    .PHONY: all
    all:
        @echo SRCS: $(SRCS)
        @echo DEPS: $(DEPS)
    
    
    
    我将输出分解为多个步骤,这样您就可以看到每个部分都做了什么-省去了我的解释

    产出:

    1. bob/src1.c fred/src2.c src3.c
    2. bob/src1.d fred/src2.d src3.d
    3. src1.d src2.d src3.d
    4. bob/ fred/ ./
    SRCS: bob/src1.c fred/src2.c src3.c
    DEPS: bob/.src1.d fred/.src2.d ./.src3.d
    
    你用GNUmake吗<代码>$(加入列表1、列表2)
    可以做到这一点。