求助:Makefile中正则表达式的正确使用方法
解决Makefile中正则匹配分支的问题
嘿,我一眼就看出问题出在哪了——你误解了Makefile里ifeq的工作方式!它做的是精确字符串相等比较,根本不支持正则表达式语法。你写的ifeq ($(bar),^ver[0-9]+)其实是在判断$(bar)是不是完全等于字符串^ver[0-9]+,而不是检查它是否符合这个正则模式,这就是为啥你的规则不生效~
另外你还犯了一个语法错误:else后面不能直接跟条件判断,要实现多分支得用else ifeq。
下面给你两种可行的解决方案:
方案一:用Make内置模式匹配(适合简单场景)
Make的$(filter)函数支持通配符模式匹配(%匹配任意长度字符,[]匹配字符集),刚好能满足你匹配ver开头+数字的需求。修正后的代码:
foo: ifeq ($(filter ver[0-9]%,$(bar)),$(bar)) @echo "do something" else ifeq ($(baz),word) @echo "do something else" endif
测试命令及结果:
- 执行
make foo bar=ver1.1.0,会输出do something - 执行
make foo baz=word,会输出do something else
方案二:用Shell正则匹配(适合复杂正则场景)
如果需要更严谨的正则校验(比如严格匹配ver开头+数字段+点分隔的版本号格式),可以调用Shell的grep命令做扩展正则检查:
foo: ifeq ($(shell echo "$(bar)" | grep -qE '^ver[0-9]+(\.[0-9]+)*$'; echo $$?),0) @echo "do something" else ifeq ($(baz),word) @echo "do something else" endif
这里的逻辑是:
grep -qE静默检查输入是否符合指定的扩展正则,匹配成功返回0,失败返回非0echo $$?输出上一条命令的返回值,Make通过比较这个值是否为0来判断是否匹配
⚠️ 注意:Makefile里的缩进必须是Tab键,不能用空格,否则会报错!
内容的提问来源于stack exchange,提问作者Alexey Nikulin
相关产品推荐
相关产品推荐

