【发布时间】:2019-09-24 20:09:45
【问题描述】:
我正在编写一个查看 uname 输出的 makefile,但由于某种原因,uname 系统名称过于具体,例如它是 CYGWIN-NT-1.2.3。我需要将其与正则表达式进行比较。
目前我只能检测特定的字符串,例如
ifeq (${value},CYGWIN-NT-4.5)
do something
elif
如何与正则表达式进行比较,例如CYGWIN*?
【问题讨论】:
我正在编写一个查看 uname 输出的 makefile,但由于某种原因,uname 系统名称过于具体,例如它是 CYGWIN-NT-1.2.3。我需要将其与正则表达式进行比较。
目前我只能检测特定的字符串,例如
ifeq (${value},CYGWIN-NT-4.5)
do something
elif
如何与正则表达式进行比较,例如CYGWIN*?
【问题讨论】:
您不能在 GNU make 中使用正则表达式(不使用 shell 或类似方法来调用处理正则表达式的 shell 脚本)。
但是你不需要正则表达式来进行你正在寻找的比较,这只是为了查看值是否以给定的字符串开头。你可以使用filter function:
ifneq (,$(filter CYGWIN%,$(value)))
...on cygwin...
endif
【讨论】:
对于简单的情况,人们经常使用 glob 而不是完整的正则表达式。 gmtt 是一个实现它们的 GNUmake 库。您的示例可能如下所示:
include gmtt/gmtt.mk
PLATFORM := CYGWIN-NT-3.5
ifneq ($(call glob-match,$(PLATFORM),CYGWIN-*-4.?),)
$(info We are on Cygwin 4.x)
endif
ifneq ($(call glob-match,$(PLATFORM),CYGWIN-*-3.?),)
$(info We are on Cygwin 3.x)
endif
ifneq ($(call glob-match,$(PLATFORM),Ubuntu*),)
$(info We are on Ubuntu)
endif
输出:
$ make
We are on Cygwin 3.x
为了简化和精简此类选择,gmtt 具有表格数据和选择功能,这通常可以使正在发生的事情更加清晰:
include gmtt/gmtt.mk
PLATFORM := CYGWIN-NT-3.5
define AVAILABLE-PLATFORMS :=
2
CYGWIN-*-4.? toolX
CYGWIN-*-3.? toolY
Ubuntu* toolZ
endef
# select column 2 from the table line(s) which glob-match the current platform:
USED-TOOL := $(call select,2,$(AVAILABLE-PLATFORMS),$$(call glob-match,$(PLATFORM),$$1))
$(info We are using $(USED-TOOL))
输出:
We are using toolY
在使用包含空格的表格单元格时需要注意(您必须使用spc-mask 转义空格,并在使用该值时使用spc-unmask 将它们转换回)但大多数情况下它是相当简单的编程。
【讨论】: