我正在使用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可用的列表及其中的代码。例如,上面的例子将导致" test1 test2 test3 test4 test5"由foreach循环使用
我现在想要指定扩展名,例如.c,以便上面的示例将导致" test2 test3 test5"。 你能救我一下吗?
答案 0 :(得分:1)
首先,您不需要调用shell
(这是无用的慢)因为有内置函数可以执行您想要的操作。如果在变量SRVS
的定义中,您实际上无法将文件名与空格(标准制词分隔符)而不是逗号分开,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