如何知道makefile变量是否为char或数字字符串?

时间:2018-07-06 05:58:22

标签: makefile pattern-matching gnu-make

这听起来很基础,但是我找不到将makefile变量分类为文本或数字的方法。我的伪代码是这样的:

ifeq ($N, 'numeric')
CFLAGS+=-D$N
endif

如何执行此操作?我正在使用GNU Make(在cygwin / Windows中)。我阅读了随附的make.pdf,但找不到方法。

预先感谢

2 个答案:

答案 0 :(得分:2)

编辑:采用了 bobbogo 的建议,该建议不依赖于清除的字符数。

我假设您使用GNU make。这是一个仅生成解决方案,无需调用shell。出于性能原因,根据您的使用情况,它可能是更好的选择。而且,它不取决于使用哪个shell。最后但并非最不重要的一点是,它使用递归,我喜欢递归:

define PURGE
$(if $(2),$(call PURGE,$(subst $(firstword $(2)),,$(1)),$(filter-out $(firstword $(2)),$(2))),$(1))
endef

DIGITS := 0 1 2 3 4 5 6 7 8 9
define IS_NOT_A_NUMBER
$(call PURGE,$(1),$(DIGITS))
endef

CFLAGS += $(if $(call IS_NOT_A_NUMBER,$(N)),,-D$(N))
all:
    $(info N=$(N) => CFLAGS=$(CFLAGS))

演示:

host> make N=12345
N=12345 => CFLAGS=-D12345
make: 'all' is up to date.

host> make N=foobar
N=foobar => CFLAGS=
make: 'all' is up to date.

说明:PURGE是带有两个参数的递归宏。第一个($(1))是要测试的字符串,第二个($(2))是要匹配的单词列表。如果$(2)为空列表,则PURGE返回$(1)。否则,它使用两个新参数调用自身:

  • $(1)的第一个单词被空词代替的$(2)的值,
  • $(2)中第一个单词已被删除

并返回结果。因此,如果使用字符串和所有数字的列表调用PURGE,则当且仅当字符串仅包含数字时,它才会返回空字符串。

答案 1 :(得分:1)

所有make变量都是字符串。要确定字符串是否实际上是数字,您需要一些基本的文本分析功能。 GNU make本身在这方面没有提供任何便利,但是您可以运行一个shell命令来完成这项工作,也许像这样:

define is_number
$(shell test '$(1)' -eq '$(1)' 2>/dev/null && echo yes || echo no)
endef

ifeq ($(call is_number, $(N)),yes)
default:
    @echo N is a number
else
default:
    @echo N is not a number
endif

结果是:

$ make N=5
N is a number
$ make N=string
N is not a number

但是,如果字符串包含特殊字符,则这种字符串处理可能会非常不可靠。