Un poco más corta es:
RH_GT_5_3 := $(shell echo -e "5.4\n$(RH_VER_NUM)"|sort -ct. -k1,1n -k2,2n && echo YES)
Esto establecerá RH_GT_5_3 a "SÍ" si RH_VER_NUM es mayor que o igual a 5,4 (de modo mayor que 5,3). De lo contrario, RH_GT_5_3 se configurará como vacío.
Si hay varios números de versión deben ser verificados podemos definir una función:
IF_VER_GE = $(shell echo -e "$2\n$1"|sort -ct. -k1,1n -k2,2n && echo YES)
GLIBC := $(word 2,$(shell getconf GNU_LIBC_VERSION))
...
all:
ifeq "$(call IF_VER_GE, $(GLIBC), 2.5)" "YES"
echo "GE"
else
echo "LT"
endif
he utilizado la palabra "($ 2, ..." en lugar de "$ (LastWord, ...", porque la tarde no funciona en hacer 3.8. Y más corto ...
... algunos eones más tarde
me trataron de resolver la comparación de versiones con funciones internas makefile. he encontrado un proyecto (GNU Make Standard Library (GMSL)), que agrega una inclusión a el archivo MAKE que implementa la aritmética de enteros. Desafortunadamente con el unary numeral system común. Pero comparar números de versión es más complejo. Como trabajé con versiones que tenían números mayores que 100_000, decidí implementar una solución más general. Funciona con un número arbitrario de números de subversión, cada uno con dígitos arbitrarios.Algunas ideas fueron tomadas del proyecto GMSL
Implementa la función ver.lt. Devuelve 'T' si el primer número de versión es menor que el segundo. Devuelve una cadena vacía de lo contrario. Por supuesto, los números de subversión se comparan numéricamente, no lexicográficamente. Entonces 1.20 es mayor que 1.3. Hay algunos problemas. 1.2 < 1.2.0, 1.0.1 < 1.00.1, 1.9.1 < 1.01.1 (ya que se espera que un número comience con un dígito distinto de cero. Excepto el 0 en sí). No quiero resolverlos ahora.
La solución
Se testAed bajo los términos de hacer 3.82.90. Hay algunas líneas muy largas como makefile add espacios si se usa '\'. Dejé algunas funciones implementadas, pero no usadas en el código. Tal vez usaría mejores nombres temporales de variables (como GMSL usa _ gmsl). A veces, las variables temporales pueden dejarse, pero el código sería más críptico.
.SILENT:
S :=
SP := $S $S
# For non empty strings
#not = $(if $1,$S,T)
#str.ne = $(if $(subst $1,,$2),T,$S)
str.eq = $(if $(subst $1,,$2),$S,T)
str.le = $(call str.eq,$(word 1,$(sort $1 $2)),$1)
#str.ge = $(call str.eq,$(word 1,$(sort $1 $2)),$2)
# Creates a list of digits from a number
mklist = $(eval __tmp := $1)$(foreach i,0 1 2 3 4 5 6 7 8 9,$(eval __tmp := $$(subst $$i,$$i ,$(__tmp))))$(__tmp)
# reverse: $(subst $(SP),,$(list))
#pop = $(wordlist 2, $(words $1), x $1)
#push = $1 $2
shift = $(wordlist 2, $(words $1), $1)
#unshift = $2 $1
num.le = $(eval __tmp1 := $(call mklist,$1))$(eval __tmp2 := $(call mklist,$2))$(if $(call str.eq,$(words $(__tmp1)),$(words $(__tmp2))),$(call str.le,$1,$2),$(call str.le,$(words $(__tmp1)),$(words $(__tmp2))))
#num.ge = $(eval __tmp1 := $(call mklist,$1))$(eval __tmp2 := $(call mklist,$2))$(if $(call str.eq,$(words $(__tmp1)),$(words $(__tmp2))),$(call str.ge,$1,$2),$(call str.ge,$(words $(__tmp1)),$(words $(__tmp2))))
#Strip zeroes from the beginning of a list
list.strip = $(eval __flag := 1)$(foreach d,$1,$(if $(__flag),$(if $(subst 0,,$d),$(eval __flag :=)$d,$S),$d))
#Strip zeroes from the beginning of a number
#num.strip = $(subst $(SP),,$(call list.strip,$(call mklist,$1)))
# temp string: 0 - two number equals, L first LT, G first GT or second is short,
gen.cmpstr = $(eval __Tmp1 := $(subst ., ,$1))$(eval __Tmp2 := $(subst ., ,$2))$(foreach i,$(__Tmp1),$(eval j := $(word 1,$(__Tmp2)))$(if $j,$(if $(call str.eq,$i,$j),0,$(if $(call num.le,$i,$j),L,G)),G)$(eval __Tmp2 := $$(call shift,$(__Tmp2))))$(if $(__Tmp2), L)
ver.lt = $(call str.eq,$(word 1,$(call list.strip,$(call gen.cmpstr,$1,$2))),L)
all:
echo ver.lt,1.20,1.3:$(call ver.lt,1.20,1.3)%
echo ver.lt,1.5.9,1.5:$(call ver.lt,1.5.9,1.5)%
echo ver.lt,1.4.9,1.5:$(call ver.lt,1.4.9,1.5)%
echo ver.lt,1.2,1.2.0:$(call ver.lt,1.2,1.2.0)%
echo ver.lt,1.20.3.4.5,1.10.5:$(call ver.lt,1.20.3.4.5,1.10.5)%
echo ver.lt,1.20.3.4.5,1.0.5:$(call ver.lt,1.20.3.4.5,1.0.5)%
echo ver.lt,1.0,1.0.5:$(call ver.lt,1.0,1.0.5)%
echo ver.lt,1.20,1.10.3:$(call ver.lt,1.20,1.10.3)%
echo ver.lt,1.20,1.30.3::$(call ver.lt,1.20,1.30.3)%
echo ver.lt,1.10.3,1.10.3:$(call ver.lt,1.10.3,1.10.3)%
Y la salida
ver.lt,1.20,1.3:%
ver.lt,1.5.9,1.5:%
ver.lt,1.4.9,1.5:T%
ver.lt,1.2,1.2.0:T%
ver.lt,1.20.3.4.5,1.10.5:%
ver.lt,1.20.3.4.5,1.0.5:%
ver.lt,1.0,1.0.5:T%
ver.lt,1.20,1.10.3:%
ver.lt,1.20,1.30.3::T%
ver.lt,1.10.3,1.10.3:%
Más música
he encontrado otro interesante proyecto llamado makepp (makepp.sourceforge.net). Permite implementar nuevas funciones en perl dentro del archivo MAKE.
PS No solo es feo, sino que volverá a hacer la verificación de la versión cada vez que ejecute 'make'. Una solución más limpia sería usar 'autoconf' para generar su' Makefile' y/o algún encabezado como 'config.h'. –