一、makefilefilter-out的概述
makefilefilter-out是GNU Makefile中的一个函数,可以用来过滤掉指定的字符串。
该函数的基本语法如下:
$(filter-out pattern...,text)
其中,pattern为需要过滤掉的模式,可以是单个字符串或者模式匹配规则;text则是需要被过滤的字符串。
下面我们通过多个方面来详细了解该函数。
二、使用makefilefilter-out实现排除指定文件
对于一个项目,可能会有多个相关的文件,但是我们在进行编译时,并不需要编译所有的文件。此时可以使用makefilefilter-out函数来排除不需要编译的文件。
下面展示一个很简单的示例:
FILES = foo.c bar.c baz.c SRCS = $(filter-out bar.c,$(FILES)) OBJS = $(SRCS:.c=.o) program: $(OBJS) $(CC) $(LDFLAGS) -o $@ $^
以上代码会编译除bar.c之外的所有c文件,将其链接成可执行文件。
三、使用makefilefilter-out实现根据CPU类型编译不同的源代码
在不同的CPU环境下,可能需要编译不同的源代码,这时可以使用makefilefilter-out函数来进行判断和处理。
下面展示一个简单的例子:
ifeq ($(CPU_TYPE),arm) SOURCES := $(wildcard src/*.c) SOURCES := $(filter-out src/x86/*.c,$(SOURCES)) else SOURCES := $(wildcard src/*.c) SOURCES := $(filter-out src/arm/*.c,$(SOURCES)) endif all: $(SOURCES) $(CC) $(CFLAGS) -o program $^
以上代码在CPU_TYPE等于arm时,就会排除掉src/x86目录下的所有c文件;否则,就排除掉src/arm目录下的所有c文件。
四、使用makefilefilter-out实现在指定平台下使用指定编译器
在多个平台环境下,可能需要使用不同的编译器进行编译,这时可以使用makefilefilter-out函数进行处理。
下面是一个例子:
ifeq ($(TARGET_OS),Windows) CC := gcc CFLAGS := -Wall -O2 LDFLAGS := -lws2_32 else CC := clang CFLAGS := -Wall -O2 LDFLAGS := -lpthread endif SOURCES := $(wildcard src/*.c) SOURCES := $(filter-out src/utils.c,$(SOURCES)) all: $(SOURCES) $(CC) $(CFLAGS) -o program $^ $(LDFLAGS)
以上代码在TARGET_OS为Windows时,会使用gcc编译器进行编译,并且链接ws2_32库;否则会使用clang编译器进行编译,并且链接pthread库。
另外,该代码中使用了makefilefilter-out函数,将src/utils.c从SOURCES中排除。
五、使用makefilefilter-out实现在编译时排除指定的头文件
在编译时,可能需要排除指定的头文件,这时候可以使用makefilefilter-out函数来处理。
下面是一个例子:
HEADERS = main.h foo.h bar.h baz.h SOURCES = main.c foo.c bar.c baz.c all: $(SOURCES) $(CC) $(CFLAGS) -o program $^ ifdef NO_BAZ SOURCES := $(filter-out baz.c,$(SOURCES)) else ifdef NO_FOO SOURCES := $(filter-out foo.c,$(SOURCES)) endif endif .PHONY: clean clean: rm -f program
以上代码排除指定的头文件,是通过指定NO_BAZ或者NO_FOO来实现的。
六、小结
makefilefilter-out函数是GNU Makefile中非常实用的函数之一,可以用于过滤指定的字符串,应用场景十分广泛。通过具体的例子,我们了解了makefilefilter-out在不同场景下的应用,这些例子可以作为学习和使用该函数的参考。