makefile - 如何删除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 $@
对于 all:$(OBJFILES) 及以下,工作得很好。它创建了我需要的所有目标文件但是,我在创建文件测试文件时遇到了麻烦。其中一个 SRC 文件是 ABC_test.c,我要输出的文件是 ABC_test(没有扩展名)。
ABC_test 将具有所有 OBJfiles 的依赖项。我认为我设置它的方式是正确的,但如果不是,请告诉我。我对makefile很陌生。
正如您在 TESTFILE 名称中看到的那样,我尝试使用替换。我相信我的问题太具体了,无法通过谷歌搜索找到帮助。知道我能做什么吗?
解决方案
重要的是要理解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
不匹配的值被忽略。如果要从输出中删除单词,则需要使用filter
andfilter-out
函数。例如:
TESTFILE = $(patsubst %_file.c,%,$(filter %_test.c,$(SRCFILES)))
推荐阅读
- python-3.x - Python 类型提示和标准库的问题
- python - 如果共享点列类型为“Person”,则无法获取该值 - Python
- mysql - PHPMyAdmin - 备份 - 如何确保准确获取所有表格行?
- django - 在 django rest 框架中优化返回大量记录的 API 的最佳方法
- asynchronous - Angular Reactive 表单异步操作
- python - 无法从列表中删除项目,但它显然存在
- javascript - PHP 中的 Javascript 正则表达式 exec 等效项
- sql - Rails find_by_sql 不会从关联的表/模型中返回请求的列
- shell - ZSH 函数行为?(运行 C++)
- c# - 获取 SignalR 连接启动错误堆栈