makefile 的strip,filter,ifeq,ifneq基础使用

news/2025/2/8 14:01:10 标签: linux

目录

  • 一、strip
    • 1.1 语法
    • 1.2 示例
    • 1.3 使用场景
  • 二、filter
    • 2.1 语法
    • 2.2 示例
    • 2.3 使用 * 和 ? 通配符
    • 2.4 结合使用
    • 2.5 使用场景
  • 三、ifeq 和 ifneq
    • 3.1 ifeq
      • 3.1.1 语法
      • 3.1.2 示例
    • 3.2 ifneq
      • 3.2.1 语法
      • 3.2.2 示例
    • 3.3 典型使用场景
      • 3.3.1 根据版本控制编译选项:
      • 3.3.2 选择不同的源文件:
    • 3.4 逻辑运算符
    • 3.5 具体注意事项
  • 四、参考链接


一、strip

strip 函数是一个用于处理字符串的函数。它主要用于去除字符串的空格或特定字符,常用于构建或定义变量时进行字符串清理。

1.1 语法

strip(STR)
  • 参数: STR 表示要处理的输入字符串。

  • 返回值: 返回去除字符串两端空白字符后的字符串。

  • 功能
    strip 函数删除输入字符串开头和结尾的空格(包括制表符和换行符),并保留中间的空格。
    这个函数通常用于确保字符串在使用前没有多余的空格,避免在构建过程中出现意外的格式问题。

1.2 示例

MY_VAR :=    Hello, World!   
STRIPPED_VAR := $(strip $(MY_VAR))

在这个例子中:

MY_VAR 的值是   Hello, World! (包围在空格中的字符串)。
使用 strip 函数,STRIPPED_VAR 的值将变成 Hello, World!,即前后的空格被移除。

1.3 使用场景

  • 清理输入变量:
    在定义变量时,确保其值干净整洁(无多余空格)。

  • 组合字符串:
    当动态生成字符串时,例如根据其他变量组合多个部分,可以使用 strip 来清除多余的空格,确保最终生成的字符串格式正确。

  • 避免构建错误:
    在自动化构建过程中,残留的空格可能导致依赖或文件路径错误,使用 strip 可以帮助避免这些问题。

  • 注意事项
    strip 只移除字符串两端的空白字符,不会改变中间字符之间的空格。
    在使用 strip 时,要确保理解变量的作用和期望输出,有时候保留中间的空格是必要的。


二、filter

filter 函数用于从一组字符串中筛选出符合特定模式的字符串。这对于处理和管理编译文件或目标文件非常有用。

2.1 语法

filter(PATTERN1 PATTERN2 ... , STRING1 STRING2 ...)
  • 参数:
    PATTERN1 PATTERN2 …:一系列模式,可以使用通配符(如 * 和 ?)。
    STRING1 STRING2 …:要筛选的字符串列表。
  • 返回值: 返回与所有模式匹配的字符串。
  • 功能
    filter 函数遍历指定的字符串列表,并返回所有匹配提供模式的字符串。
    如果没有任何字符串与模式匹配,返回空字符串。

2.2 示例

FILES := file1.o file2.o file3.o fileA.o fileB.o  
# 筛选出以 file1 和 fileA 开头的文件  
FILTERED_FILES := $(filter file1.o fileA.o, $(FILES))

在这个例子中:

变量 FILES 包含多个文件名。
FILTERED_FILES 将仅包含 file1.o 和 fileA.o,因为这些字符串符合提供的模式。

2.3 使用 * 和 ? 通配符

filter 函数支持通配符,以便更灵活地筛选文件。例如:

FILES := src/file1.cpp src/file1.h src/file2.cpp src/fileA.java  
# 筛选出以 file1 结尾的文件  
FILTERED_FILES := $(filter %file1.*, $(FILES))

在这里:
%file1.* 表示八个字符串中任何以 file1 结尾的文件(扩展名可以是 .cpp, .h 等)。

2.4 结合使用

filter 函数可以与其他函数结合使用,以实现更复杂的逻辑。例如,您可以先使用 wildcard 函数获取某目录下的所有文件,随后使用 filter 来筛选出特定文件:

# 获取所有的 .cpp 和 .h 文件  
SOURCE_FILES := $(wildcard src/*.cpp) $(wildcard include/*.h)  
# 筛选出只包含 .cpp 的文件  
CPP_FILES := $(filter %.cpp, $(SOURCE_FILES))

2.5 使用场景

常用于处理文件名,尤其在构建过程中自动管理源文件和目标文件的列表。


三、ifeq 和 ifneq

ifeq 和 ifneq 是在 Makefile 中用于条件判断的指令,它们允许根据给定条件执行不同的代码块。这两个指令主要用于根据变量的值执行不同的操作。

3.1 ifeq

3.1.1 语法

ifeq (条件1, 条件2)  
    # 条件成立时执行的代码  
endif

作用: 如果 条件1 等于 条件2,则执行代码块。

3.1.2 示例

VERSION := 1.0  
ifeq ($(VERSION), 1.0)  
    $(info Version is 1.0)  
endif

在这个例子中,如果 VERSION 的值是 1.0,则会输出信息“Version is 1.0”。

3.2 ifneq

3.2.1 语法

ifneq (条件1, 条件2)  
    # 条件不成立时执行的代码  
endif

作用: 如果 条件1 不等于 条件2,则执行代码块。

3.2.2 示例

VERSION := 1.0  
ifneq ($(VERSION), 2.0)  
    $(info Version is not 2.0)  
endif

在这个例子中,如果 VERSION 的值不是 2.0,则会输出信息“Version is not 2.0”。

3.3 典型使用场景

3.3.1 根据版本控制编译选项:

TARGET_PLATFORM := android  
ifeq ($(TARGET_PLATFORM), android)  
    CFLAGS += -DPLATFORM_ANDROID  
else  
    CFLAGS += -DPLATFORM_OTHER  
endif

3.3.2 选择不同的源文件:

CONFIG := debug  
ifeq ($(CONFIG), debug)  
    SOURCES := main_debug.cpp  
else  
    SOURCES := main_release.cpp  
endif

3.4 逻辑运算符

ifeq 和 ifneq 可以与 else 和 else if 结合使用以处理更复杂的逻辑。

PLATFORM := windows  
ifeq ($(PLATFORM), windows)  
    OS := Windows OS  
else ifeq ($(PLATFORM), linux)  
    OS := Linux OS  
else  
    OS := Unknown OS  
endif

3.5 具体注意事项

  • 空值比较: 使用 ifeq 或 ifneq 检查空值时,确保传递的参数格式正确。例如,如果你想检查变量是否为空,可以使用:
ifeq ($(VAR),)  
    $(info VAR is empty)  
endif
  • 调用与空格: 使用 ifeq 和 ifneq 时,如果比较的字符串中有空格,确保在引用变量时使用括号或适当的引用(使用 $(VAR))。

  • 字符串感知: ifeq 和 ifneq 是基于字符串的比较,意味着它们不考虑数字类型的比较。如果需要进行数字比较,则需要使用 ifeq 结合数值计算。


四、参考链接

makefile 的ifeq,filter,strip 简单使用。
Android mk文件ifeq、ifneq和filter语句学习
Makefile 中 ifeq ifneq 等用法


http://www.niftyadmin.cn/n/5844927.html

相关文章

关于 SQL 内连接、外连接(左连接、右连接)的面试题

一、概念理解类 1. 请详细解释内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)在 SQL 中的概念和区别,并分别举例说明它们在实际查询场景中的应用。 在SQL中,内连接&a…

Vue:Table合并行于列

<template><div><el-table:data"tableData":span-method"mergeCells"style"width: 100%"><el-table-columnprop"date"label"日期"width"180"></el-table-column><el-table-colu…

Flutter List 的 every 如果回调函数抛出异常 应该如何处理

在使用 List 的 every 方法时&#xff0c;如果回调函数抛出异常&#xff0c;可以通过以下几种方式进行处理&#xff1a; 1. 在回调函数内部捕获异常 在回调函数内部使用 try-catch 语句捕获可能抛出的异常&#xff0c;并根据具体情况进行处理。这样可以避免异常直接导致 ever…

DeepSeek和ChatGPT的优劣或者区别(答案来DeepSeek和ChatGPT)

DeepSeek的答案 DeepSeek与ChatGPT作为当前两大主流AI模型&#xff0c;在架构设计、性能表现、应用场景等方面存在显著差异&#xff0c;以下从多个维度进行对比分析&#xff1a; 一、架构与训练效率 架构设计 DeepSeek&#xff1a;采用混合专家&#xff08;MoE&#xff09;框架…

SpringBoot中的多环境配置管理

SpringBoot中的多环境配置管理 文章目录 SpringBoot中的多环境配置管理SpringBoot中的多环境配置管理 多环境配置的概述1. 为什么需要多环境配置&#xff1f;2. Spring Boot 中如何实现多环境配置&#xff1f;3. 多环境配置的应用场景4. 如何实现配置隔离&#xff1f; Spring B…

CEF132 编译指南 Windows 篇 - 拉取 CEF 源码 (五)

1. 引言 获取 CEF 132 源码是开始编译工作的前提和关键步骤。在完成 depot_tools 的安装和配置后&#xff0c;我们需要通过正确的方式下载和同步 CEF 的源代码。由于 CEF 项目依赖于 Chromium 的大量组件&#xff0c;因此源码的获取过程需要特别注意同步策略和版本管理&#x…

MySQL数据库(五)索引

一 索引概述 1 介绍&#xff1a;MySQL索引是一种有序数据结构&#xff0c;它能够高效帮助数据库系统快速定位到表中的特定记录&#xff0c;从而显著提高查询效率。索引可以被看作是书的目录&#xff0c;通过它可以迅速找到所需的信息而不需要逐页翻阅整本书。 2 优缺点 二 索…

【从零开始的LeetCode-算法】59. 螺旋矩阵 II

给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&#xff1a;n 1 输出&…