下面的代码中的子集功能实际上是在做什么

时间:2014-04-25 06:50:27

标签: gnu-make

bj_dir = $(addprefix $(OBJDIR),$(subst $(ROOTDIR),,$(CURDIR)))/
target  = $(obj_dir)libnovds_delivery.a

sources = \
          novds_my_delivery_service_timer.c \
          novds_my_delivery.c \
          novds_dcmd.c \
          novds_my_delivery_reply_service.c \
          novds_my_delivery_reply.c \
          novds_serial.c

objects = $(addprefix $(obj_dir),$(patsubst %.c,%.o,$(sources)))
deps    = $(addprefix $(obj_dir),$(patsubst %.c,%.d,$(sources)))

我知道makefile中的subst的功能,但在使用ROOTDIR两个逗号之后的这段代码中,我不知道它会做什么。

1 个答案:

答案 0 :(得分:0)

为了清楚起见,subst不是子集的缩写,它是替换的缩写。

$(subst $(ROOTDIR),,$(CURDIR)))替换$(ROOTDIR)展开的值中$(CURDIR)扩展为的任何值的所有内容(没有任何内容(无文本))。逗号分隔参数,因此第一个逗号将$(ROOTDIR)与下一个参数分开,第二个逗号将第二个参数(空白)与$(CURDIR)分开。

这是对subst的一种不好的用法,因为它会在每次出现(甚至多次)值时(即使在中间或末尾)取代$(ROOTDIR)

对于类似这样的内容,您只想删除前缀,最好使用patsubst,例如$(patsubst $(ROOTDIR)%,%,$(CURDIR))