首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Makefile中实现前提条件

如何在Makefile中实现前提条件
EN

Stack Overflow用户
提问于 2020-06-30 11:32:35
回答 1查看 213关注 0票数 0

在Makefile中,假设是在列表中找到匹配的

代码语言:javascript
复制
#to find the $VER_X which is latest to $MY_VERSION but not greater than $MY_VERSION
VER_1 := 50.0.56.8
VER_2 := 50.0.56.17
VER_3 := 50.0.90.0

#in this case, VER_2 should be the match one
MY_VERSION := 50.0.56.19

我编写了一个用于比较版本字符串(如a.b.c.d )的函数。

代码语言:javascript
复制
# function - compare version such as a.b.c.d
version_greater_equal = $(shell if printf '%s\n%s\n' '$(2)' '$(1)' | sort -Ct. -k1,1n -k2,2n -k3,3n -k4,4n ; then echo YES; else echo NO; fi) 

该假设是查找最新的${MY_VERSION}匹配。

解决方案-A和它的工作。

代码语言:javascript
复制
#solution-A: enumerate via ifeq
#this works, but it is not good idea for a larget number of VER_X
ifeq (YES,$(call version_greater_equal,${MY_VERSION},${VER_1}))
MATCH_ENU=${VER_1}
endif
ifeq (YES,$(call version_greater_equal,${MY_VERSION},${VER_2}))
MATCH_ENU=${VER_2}
endif
ifeq (YES,$(call version_greater_equal,${MY_VERSION},${VER_3}))
MATCH_ENU=${VER_3}
endif

Soluton-B,它不起作用.我怎样才能修好它?

代码语言:javascript
复制
#solution-2: loop (foreach)
VER_LIST := 50.0.56.8  50.0.56.17  50.0.90.0  50.1.42.3
MATCH_2 := $(foreach each, $(VER_LIST), $(if $(call version_greater_equal,${MY_VERSION},${each})=YES , ${each}))

原木

代码语言:javascript
复制
-->enumerate
MATCH_ENU   = 50.0.56.17
-->enumerate
MATCH_2     =   50.0.56.8   50.0.56.17   50.0.90.0   50.1.42.3
EN

回答 1

Stack Overflow用户

发布于 2020-06-30 12:09:23

定义一个新函数,它返回第二个参数,如果它大于或等于,或者什么都没有。

代码语言:javascript
复制
version_greater_equal = $(shell if printf '%s\n%s\n' '$(2)' '$(1)' | sort -Ct.   -k1,1n -k2,2n -k3,3n -k4,4n ; then echo $(2); fi)

列出(排序)版本列表:

代码语言:javascript
复制
VERS := $(VER_1) $(VER_2) $(VER_3) ...

筛选出大于$(MY_VERSION)

代码语言:javascript
复制
LOW_VERS := $(foreach X,$(VERS),$(call version_greater_equal,${MY_VERSION},$(X)))

以最后(因此也是最伟大的)为例:

代码语言:javascript
复制
MATCH_ENU := $(lastword $(LOW_VERS))

编辑:您的问题似乎意味着版本将按顺序列出(解决方案A依赖于它)。但是,如果你想要一个没有这个假设的解决方案,这里就这样。

我不会给出一个只返回最大值的递归函数,因为递归函数会让我眩晕。此外,“疯狂科学家”给我的建议通常包含一些可怕的陷阱。因此,这里有一个纯粹的迭代解决方案:

代码语言:javascript
复制
greater = ... function that returns the greater of the two arguments, you write it.

define reduce
X := $(call greater, $(wordlist 1,2,$(X))) $(wordlist 3,$(words $(X)), $(X))
endef

X := $(LOW_VERS)

$(foreach z, $(LOW_VERS), $(eval $(call reduce)))

现在,X将包含您想要的版本。

P.S.开始考虑这个问题,如果我们调用shell sort,那么这样对版本列表进行排序可能更容易。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62656481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档