GNU Make 中的双重文本替换
double text substituion in GNU Make
假设我有这样的源文件列表。
SRCS = A/src/A1.c A/src/A2.c B/src/B1.c B/src/B2.c
我想要上面列表中的对象文件列表。
OBJS = A/obj/A1.o A/obj/A2.o B/obj/B1.o B/obj/B2.o
我想写这样的东西
OBJS = $(SRCS: %1/src/%2 = %1/obj/%2)
但是由于GNU make中没有提供这个功能,
我需要想出解决方法。目前我正在使用这个。
SRCS = $(foreach DIR, A B, $(wildcard $(DIR)/src/*.c))
OBJS = $(foreach DIR, A B,
$(addprefix $(DIR)/obj/,
$(patsubst %.c, %.o,
$(notdir $(wildcard $(DIR)/src/*.c))
)
)
)
- 删除旧目录名称
- 做替换
- 追加新的目录名称
但是这种方式显然很复杂,所以我想要一个更好的解决方案。
有人知道更好的解决方案吗?
我会用这个:
OBJS := $(subst /src/,/obj/,$(SRCS))
然后修正后缀:
OBJS := $(patsubst %.c,%.o, $(subst /src/,/obj/,$(SRCS)))
假设我有这样的源文件列表。
SRCS = A/src/A1.c A/src/A2.c B/src/B1.c B/src/B2.c
我想要上面列表中的对象文件列表。
OBJS = A/obj/A1.o A/obj/A2.o B/obj/B1.o B/obj/B2.o
我想写这样的东西
OBJS = $(SRCS: %1/src/%2 = %1/obj/%2)
但是由于GNU make中没有提供这个功能, 我需要想出解决方法。目前我正在使用这个。
SRCS = $(foreach DIR, A B, $(wildcard $(DIR)/src/*.c))
OBJS = $(foreach DIR, A B,
$(addprefix $(DIR)/obj/,
$(patsubst %.c, %.o,
$(notdir $(wildcard $(DIR)/src/*.c))
)
)
)
- 删除旧目录名称
- 做替换
- 追加新的目录名称
但是这种方式显然很复杂,所以我想要一个更好的解决方案。 有人知道更好的解决方案吗?
我会用这个:
OBJS := $(subst /src/,/obj/,$(SRCS))
然后修正后缀:
OBJS := $(patsubst %.c,%.o, $(subst /src/,/obj/,$(SRCS)))