这听起来很基础,但是我找不到将makefile变量分类为文本或数字的方法。我的伪代码是这样的:
ifeq ($N, 'numeric')
CFLAGS+=-D$N
endif
如何执行此操作?我正在使用GNU Make(在cygwin / Windows中)。我阅读了随附的make.pdf,但找不到方法。
预先感谢
答案 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
但是,如果字符串包含特殊字符,则这种字符串处理可能会非常不可靠。