【问题标题】:Make: detect platform with regexMake:使用正则表达式检测平台
【发布时间】:2019-09-24 20:09:45
【问题描述】:

我正在编写一个查看 uname 输出的 makefile,但由于某种原因,uname 系统名称过于具体,例如它是 CYGWIN-NT-1.2.3。我需要将其与正则表达式进行比较。

目前我只能检测特定的字符串,例如

ifeq (${value},CYGWIN-NT-4.5)
   do something
elif

如何与正则表达式进行比较,例如CYGWIN*?

【问题讨论】:

    标签: regex makefile


    【解决方案1】:

    您不能在 GNU make 中使用正则表达式(不使用 shell 或类似方法来调用处理正则表达式的 shell 脚本)。

    但是你不需要正则表达式来进行你正在寻找的比较,这只是为了查看值是否以给定的字符串开头。你可以使用filter function:

    ifneq (,$(filter CYGWIN%,$(value)))
      ...on cygwin...
    endif
    

    【讨论】:

      【解决方案2】:

      对于简单的情况,人们经常使用 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 将它们转换回)但大多数情况下它是相当简单的编程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-16
        • 2015-01-14
        相关资源
        最近更新 更多