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

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/182307.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2024-11-24 06:19
下一篇 2024-11-24 06:19

相关推荐

  • index.html怎么打开 – 详细解析

    一、index.html怎么打开看 1、如果你已经拥有了index.html文件,那么你可以直接使用任何一个现代浏览器打开index.html文件,比如Google Chrome、…

    编程 2025-04-25
  • Resetful API的详细阐述

    一、Resetful API简介 Resetful(REpresentational State Transfer)是一种基于HTTP协议的Web API设计风格,它是一种轻量级的…

    编程 2025-04-25
  • neo4j菜鸟教程详细阐述

    一、neo4j介绍 neo4j是一种图形数据库,以实现高效的图操作为设计目标。neo4j使用图形模型来存储数据,数据的表述方式类似于实际世界中的网络。neo4j具有高效的读和写操作…

    编程 2025-04-25
  • 关键路径的详细阐述

    关键路径是项目管理中非常重要的一个概念,它通常指的是项目中最长的一条路径,它决定了整个项目的完成时间。在这篇文章中,我们将从多个方面对关键路径做详细的阐述。 一、概念 关键路径是指…

    编程 2025-04-25
  • AXI DMA的详细阐述

    一、AXI DMA概述 AXI DMA是指Advanced eXtensible Interface Direct Memory Access,是Xilinx公司提供的基于AMBA…

    编程 2025-04-25
  • c++ explicit的详细阐述

    一、explicit的作用 在C++中,explicit关键字可以在构造函数声明前加上,防止编译器进行自动类型转换,强制要求调用者必须强制类型转换才能调用该函数,避免了将一个参数类…

    编程 2025-04-25
  • HTMLButton属性及其详细阐述

    一、button属性介绍 button属性是HTML5新增的属性,表示指定文本框拥有可供点击的按钮。该属性包括以下几个取值: 按钮文本 提交 重置 其中,type属性表示按钮类型,…

    编程 2025-04-25
  • crontab测试的详细阐述

    一、crontab的概念 1、crontab是什么:crontab是linux操作系统中实现定时任务的程序,它能够定时执行与系统预设时间相符的指定任务。 2、crontab的使用场…

    编程 2025-04-25
  • Vim使用教程详细指南

    一、Vim使用教程 Vim是一个高度可定制的文本编辑器,可以在Linux,Mac和Windows等不同的平台上运行。它具有快速移动,复制,粘贴,查找和替换等强大功能,尤其在面对大型…

    编程 2025-04-25
  • 网站测试工具的详细阐述

    一、测试工具的概述 在软件开发的过程中,测试工具是一个非常重要的环节。测试工具可以快速、有效地检测软件中的缺陷,提高软件的质量和稳定性。与此同时,测试工具还可以提高软件开发的效率,…

    编程 2025-04-25

发表回复

登录后才能评论