Makefile:对来自变量的特定扩展名的文件执行操作

时间:2018-03-28 07:23:25

标签: makefile

我正在使用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"。 你能救我一下吗?

1 个答案:

答案 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