我正在开发一个 Makefile,它需要能够执行以下操作:
从用户给定的变量 SRVS,包含文件名,例如,
SRVS=Test1.java,test2.c,test3.c,test4.java,test5.c
生成具有特定扩展名的所有文件的列表,供 foreach 循环使用。此列表不应再包含扩展名。目前,我可以解析所有文件并将其放入可用列表中,但无法为扩展名这样做。是)我有的:
$(foreach SRV, $(shell echo $(SRVS) | tr ',' ' '), \
CLASSPATH=$(SELF)/default_runtime javac $(UJ_DIR)/services/java/$(SRV).java && \
find $(UJ_DIR)/services/java/ -iname "$(SRV).class" -type f >> $(SELF)/files && \
) true
这将采用 SRVS 列表并生成可供 foreach 和其中的代码使用的列表。例如,上面的示例将导致 foreach 循环使用“test1 test2 test3 test4 test5”
我现在想指定扩展名,例如.c,这样上面的例子就会产生“test2 test3 test5”。你能帮我吗?
首先,您不需要调用shell
(这是无用的慢),因为有 make 内置函数可以执行您想要的操作。如果在变量的定义中SRVS
你真的不能用空格(标准的make word 分隔符)而不是逗号分隔你的文件名,subst
可以为你做。但是有一个小技巧,因为逗号本身就是 make 函数的参数分隔符:
comma := ,
SRVS1 := $(subst $(comma), ,$(SRVS))
接下来filter
是允许按扩展名选择文件的 make 函数:
SRVS2 := $(filter %.c,$(SRVS1))
最后,basename
删除后缀:
SRVS3 := $(basename $(SRVS2))
演示:
$ cat Makefile
SRVS=Test1.java,test2.c,test3.c,test4.java,test5.c
comma := ,
SRVS1 := $(subst $(comma), ,$(SRVS))
SRVS2 := $(filter %.c,$(SRVS1))
SRVS3 := $(basename $(SRVS2))
all:
$(info SRVS1 = $(SRVS1))
$(info SRVS2 = $(SRVS2))
$(info SRVS3 = $(SRVS3))
$ make -q
SRVS1 = Test1.java test2.c test3.c test4.java test5.c
SRVS2 = test2.c test3.c test5.c
SRVS3 = test2 test3 test5
或者,一下子:
$ cat Makefile
TAGS := $(basename $(filter %.c,$(subst $(comma), ,$(SRVS))))
all:
$(info TAGS = $(TAGS))
$ make -q
TAGS = test2 test3 test5
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句