您的位置:

makefilefilter-out的详细解析

一、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在不同场景下的应用,这些例子可以作为学习和使用该函数的参考。