深度解析makefile filter-out

一、filter-out:什么是filter-out

在makefile中,filter-out函数是过滤掉一个列表中的某些元素。

filter-out函数的语法为:

$(filter-out pattern…,text)

其中,pattern为要过滤掉的模式,text为要过滤的文本。filter-out函数返回的是从text中过滤掉了包含pattern的元素之后得到的结果。

二、filter-out:如何使用filter-out

filter-out函数可以配合其他函数使用,比如wildcard函数、patsubst函数等。以下是一个例子:

SOURCES := $(wildcard src/*.cpp)
OBJECTS := $(patsubst src/%.cpp,obj/%.o,$(SOURCES))
TARGET := main

$(TARGET): $(filter-out obj/main.o,$(OBJECTS))
    $(CC) $^ -o $@

在这个例子中,SOURCES表示所有src目录下的.cpp文件,OBJECTS表示把所有SOURCES的.cpp文件生成对应的.o文件,TARGET表示最终的可执行文件。$(filter-out obj/main.o,$(OBJECTS))表示从OBJECTS中排除obj/main.o文件。

三、filter-out:常见用途

1. 同时编译多个可执行文件

在一个项目中,可能会有多个可执行文件,那么我们就需要构建多个目标,使用filter-out可以方便的过滤掉指定的目标文件。

EXECUTABLES := foo bar baz main
TARGETS := $(filter-out main,$(EXECUTABLES))

all: $(TARGETS) # 编译 targets

$(TARGETS): %: %.c
    $(CC) $^ -o $@

在这个例子中,我们有四个可执行文件,分别是foo、bar、baz和main。我们使用TARGETS变量来存储需要编译的目标,使用filter-out函数来过滤掉main目标。最终使用all来编译TARGETS目标。

2. 排除依赖文件

在makefile中,TARGET: prerequisites规则表示TARGET目标依赖于prerequisites中的文件。使用filter-out函数可以方便的排除某些依赖文件。

TARGET := main
PREREQUISITES := foo.o bar.o main.o
OBJECTS := $(filter-out main.o,$(PREREQUISITES))

$(TARGET): $(OBJECTS)
    $(CC) $^ -o $@

在这个例子中,我们定义了TARGET和PREREQUISITES两个变量,表示目标和所有依赖项,OBJECTS表示从所有依赖项中排除main.o的目标物件。最终使用$(CC)命令把OBJECTS链接成可执行文件。

3. 过滤掉系统环境变量

有时候在makefile中需要过滤掉系统环境变量,这时候,可以使用filter-out函数。

SYSTEM_ENV := HOME PATH TERM
VARS := $(filter-out $(SYSTEM_ENV),$(.VARIABLES))

$(info $(VARS))

在这个例子中,我们使用$(.VARIABLES)来获取makefile中的所有变量,使用filter-out函数过滤掉SYSTEM_ENV中的变量。最终使用$(info)函数把过滤结果输出到终端。

四、filter-out:小结

filter-out函数是makefile的一个重要函数,可以配合其他函数使用,比如wildcard函数、patsubst函数等。它的常见用途包括同时编译多个可执行文件、排除依赖文件和过滤掉系统环境变量等。学会使用filter-out函数,可以更加方便的进行makefile的编写。

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
VYPXNVYPXN
上一篇 2025-04-12 01:13
下一篇 2025-04-12 01:13

相关推荐

  • 深度查询宴会的文化起源

    深度查询宴会,是指通过对一种文化或主题的深度挖掘和探究,为参与者提供一次全方位的、深度体验式的文化品尝和交流活动。本文将从多个方面探讨深度查询宴会的文化起源。 一、宴会文化的起源 …

    编程 2025-04-29
  • Python下载深度解析

    Python作为一种强大的编程语言,在各种应用场景中都得到了广泛的应用。Python的安装和下载是使用Python的第一步,对这个过程的深入了解和掌握能够为使用Python提供更加…

    编程 2025-04-28
  • 如何使用integratecustomerdata.stream().filter(c->{ if (collectionutil.isnotempty(

    本文将详细介绍如何在Java编程中使用integratecustomerdata.stream().filter(c->{ if (collectionutil.isnote…

    编程 2025-04-28
  • Python递归深度用法介绍

    Python中的递归函数是一个函数调用自身的过程。在进行递归调用时,程序需要为每个函数调用开辟一定的内存空间,这就是递归深度的概念。本文将从多个方面对Python递归深度进行详细阐…

    编程 2025-04-27
  • Spring Boot本地类和Jar包类加载顺序深度剖析

    本文将从多个方面对Spring Boot本地类和Jar包类加载顺序做详细的阐述,并给出相应的代码示例。 一、类加载机制概述 在介绍Spring Boot本地类和Jar包类加载顺序之…

    编程 2025-04-27
  • 深度解析Unity InjectFix

    Unity InjectFix是一个非常强大的工具,可以用于在Unity中修复各种类型的程序中的问题。 一、安装和使用Unity InjectFix 您可以通过Unity Asse…

    编程 2025-04-27
  • 深度剖析:cmd pip不是内部或外部命令

    一、问题背景 使用Python开发时,我们经常需要使用pip安装第三方库来实现项目需求。然而,在执行pip install命令时,有时会遇到“pip不是内部或外部命令”的错误提示,…

    编程 2025-04-25
  • 动手学深度学习 PyTorch

    一、基本介绍 深度学习是对人工神经网络的发展与应用。在人工神经网络中,神经元通过接受输入来生成输出。深度学习通常使用很多层神经元来构建模型,这样可以处理更加复杂的问题。PyTorc…

    编程 2025-04-25
  • 深度解析Ant Design中Table组件的使用

    一、Antd表格兼容 Antd是一个基于React的UI框架,Table组件是其重要的组成部分之一。该组件可在各种浏览器和设备上进行良好的兼容。同时,它还提供了多个版本的Antd框…

    编程 2025-04-25
  • Spring Boot Filter过滤器

    Spring Boot是当前非常流行的Java Web开发框架,它提供了一个非常方便的方式来创建和运行Web应用程序。相比于传统的Java EE应用程序,它更加简单易用、依赖性更少…

    编程 2025-04-25

发表回复

登录后才能评论