在Makefile中,假设是在列表中找到匹配的
#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 )的函数。
# 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和它的工作。
#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}
endifSoluton-B,它不起作用.我怎样才能修好它?
#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}))原木
-->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发布于 2020-06-30 12:09:23
定义一个新函数,它返回第二个参数,如果它大于或等于,或者什么都没有。
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)列出(排序)版本列表:
VERS := $(VER_1) $(VER_2) $(VER_3) ...筛选出大于$(MY_VERSION)的
LOW_VERS := $(foreach X,$(VERS),$(call version_greater_equal,${MY_VERSION},$(X)))以最后(因此也是最伟大的)为例:
MATCH_ENU := $(lastword $(LOW_VERS))编辑:您的问题似乎意味着版本将按顺序列出(解决方案A依赖于它)。但是,如果你想要一个没有这个假设的解决方案,这里就这样。
我不会给出一个只返回最大值的递归函数,因为递归函数会让我眩晕。此外,“疯狂科学家”给我的建议通常包含一些可怕的陷阱。因此,这里有一个纯粹的迭代解决方案:
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,那么这样对版本列表进行排序可能更容易。
https://stackoverflow.com/questions/62656481
复制相似问题