如何删除makefile中的扩展名

时间:2018-05-31 14:28:46

标签: makefile substitution

我有以下makefile:

CC=gcc
CFLAGS=-c ---
LDFLAGS = ---

SRCFILES := $(shell find ../ -name '*.c')
OBJFILES := $(patsubst %.c,%.o,$(SRCFILES))
TESTFILE := $(patsubst %_test.c,%,$(SRCFILES))

all: $(TESTFILE)
$(TESTFILE): $(OBJFILES)
    $(CC) $(LDFLAGS) $(OBJFILES) -o $@

all: $(OBJFILES)
%.o: %.c
    $(CC) $(CFLAGS) $< -o $@

对于所有人:$(OBJFILES)及以下,完美无缺。它会创建我需要的所有目标文件,但是我在创建文件测试文件时遇到了问题。其中一个SRC文件是ABC_test.c,我要输出的文件是ABC_test(没有扩展名)。

ABC_test将具有所有OBJfiles的依赖关系。我认为我设置的方式是正确的,但如果不是,请告诉我。我很擅长制作文件。

我尝试使用替换,如您在TESTFILE名称中看到的那样。我相信我的问题太具体了,无法通过谷歌搜索找到帮助。知道我能做什么吗?

1 个答案:

答案 0 :(得分:1)

了解patsubst不会忽略结果中的字词非常重要。如果单词与模式匹配则将其替换。如果单词与模式不匹配,那么它只是按原样发出。

所以,如果你有:

FOO = foo_1 foo_2 bar_1 bar_2

$(info $(patsubst foo%,FOO%,$(FOO))

然后输出将是:

FOO_1 FOO_2 bar_1 bar_2

它不会像你似乎期待的那样:

FOO_1 FOO_2

遗漏了不匹配的值。如果您要从输出中删除字词,则需要使用filterfilter-out函数。例如:

TESTFILE = $(patsubst %_file.c,%,$(filter %_test.c,$(SRCFILES)))