【问题标题】:Join two lists of strings in a makefile在生成文件中加入两个字符串列表
【发布时间】:2020-06-18 14:53:56
【问题描述】:

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

SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))

我现在想创建一个DEPFILES,它包含与SOURCES 相同的文件,但有两个主要区别:

  1. 每个文件都以“.d”而不是“.c”结尾
  2. 每个文件都包含一个“.”在其基本名称之前,以便隐藏生成的文件。

我想出了这个表达方式,效果很好:

DEPFILES := $(foreach s,$(SOURCES:.$(SRCEXT)=.$(DEPSEXT)),$(shell echo $(s) | sed -e 's/^\(.*\/\)/\1./')))

最初,我将SOURCES 拆分为以下列表:

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

问题:如何将这两个列表加入到一个 makefile 中,以使结果等于 DEPFILES?换句话说:你如何成对地连接两个列表中的字符串?

【问题讨论】:

  • 你使用 GNUmake 吗? $(join list1,list2) 可以做到。

标签: sed makefile gnu


【解决方案1】:

这是一种仅使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多