从多个方面深入理解findstring函数

发布时间:2023-05-20

一、findstring函数怎么用

findstring <string>,<text>

findstring函数在makefile中用于查找一个字符串是否包含在另一个字符串中。它返回值为字符串stringtext中第一次出现的位置,如果string没有出现在text中,则返回空串。 下面举个例子,展示如何使用findstring函数:

# 假设当前操作系统为macOS
ifeq ($(findstring macOS,$(shell uname)),macOS)
    $(info current OS is macOS)
endif

上面的代码段中,如果当前操作系统是macOS,则打印一条信息表明当前操作系统为macOS。首先使用shell函数获取当前操作系统的名称,然后使用findstring函数将字符串"macOS"与获取到的操作系统名称进行查找判断。

二、findstring $(PRODUCT)

findstring函数还可以与$符号搭配使用,如findstring $(PRODUCT)。在makefile中,$符号表示调用变量的值,即变量展开。 下面看一个使用findstring $(PRODUCT)的例子:

PRODUCT := onyx
# 判断PRODUCT是否为onyx
ifeq ($(findstring onyx,$(PRODUCT)),onyx)
    $(info product is onyx)
endif

上面的代码段中,定义了一个变量PRODUCT,然后使用findstring函数判断$(PRODUCT)是否为字符串"onyx",如果是,则打印一条信息表明PRODUCT的值为"onyx"。

三、findstring函数

可以将findstring函数单独使用,如:

$(findstring ab, abc)     # 返回非空字符串"ab"
$(findstring bc, abc)     # 返回空字符串""

注意:这里$(findstring ab, abc)的返回值为非空字符串"ab",而不是"1",因为findstring函数返回的是字符串而不是数值。

四、findstring makefile

makefile文件中的findstring函数可以用于判断当前操作系统的类型、目标文件的后缀名、项目名称等其他用途。下面举几个例子:

  • 判断当前操作系统的类型:
ifeq ($(findstring Linux,$(shell uname)),Linux)
# Linux下使用的一些指令
endif
ifeq ($(findstring Darwin,$(shell uname)),Darwin)
# macOS下使用的一些指令
endif
ifeq ($(findstring CYGWIN,$(shell uname)),CYGWIN)
# Windows下使用的一些指令
endif
  • 判断目标文件的后缀名:
# 给所有的目标文件加上".o"后缀名
OBJ_FILES := $(addsuffix .o,$(BASE_FILES))
# 仅将".c"文件编译成".o"文件
OBJ_FILES := $(patsubst %.c,%.o,$(BASE_FILES))
# 如果是".cpp"文件,则将其编译成".o"文件
OBJ_FILES := $(filter %.o,$(patsubst %.cpp,%.o,$(BASE_FILES)))
# 如果是"$(PROJ_NAME).c"文件,则将其编译成"$(PROJ_NAME).o"文件
OBJ_FILES := $(filter-out $(PROJ_NAME).o,$(patsubst %.c,%.o,$(BASE_FILES))) $(PROJ_NAME).o
# 给所有的目标文件加上后缀名
OBJ_FILES := $(foreach file,$(BASE_FILES),$(file).o)
  • 判断项目名称:
include common.mk
# 项目名为"myproj"
ifeq ($(findstring myproj,$(PROJ_NAME)),myproj)
# 进行相关操作
endif

五、findstring shell

findstring函数还可以与shell函数结合使用,进行更为灵活的处理。在makefile中,shell函数用于执行系统命令,并返回执行结果。下面举个例子:

# 获取当前时间,并将其传递给findstring函数进行处理
ifeq ($(findstring afternoon,$(shell date "+%P")),afternoon)
    $(info Good Afternoon)
else
    $(info Good Morning)
endif

上面的代码段中,使用shell函数调用系统命令date "+%P"获取当前时间是上午还是下午,并将其作为参数传递给findstring函数进行处理,最终输出相应的问候语。

六、总结

本文从findstring函数的不同用法进行了详细的阐述。findstring函数在makefile文件中有着广泛的应用场景,掌握好这个函数,能够让我们更加熟练地操作makefile文件。