On Sat, Nov 19, 2022 at 4:53 AM Masahiro Yamada <masahiroy@xxxxxxxxxx> wrote: > > Because GNU Make is only able to handle strings, it is very hard to > perform arighmetic in Makefiles. arighmetic -> arithmetic > > When we compare two integers, we invokes shell. One example is in the invokes -> invoke > top Makefile: > > ifeq ($(shell test $(CONFIG_LLD_VERSION) -lt 130000; echo $$?),0) > > This is more expensive than using built-in functions since it forks a > process. > > If we know the two have the same number of digits, we can do better. > > This commit adds four macros, test-le, test-ge, test-lt, test-gt. > > $(call test-lt, A, B) is evaluated to 'y' if A is less than B, or > empty otherwise. This will replace $(call shell test A -lt B). > > Again, the limitation is that A and B must have the same number of > digits because these macros are based on $(sort ) function. > > $(call test-lt, 1, 9) --> y (Works!) > $(call test-lt, 10, 9) --> y (Not work...) > > To make the latter work, you need to add '0' prefix to align the number > of digits: > > $(call test-lt, 10, 09) --> empty (Works!) > > Actually, we can live with this limitation in many places. As for the > example above, we know $(CONFIG_LLD_VERSION) is 6-digits because the > minimal supported version of LLVM is 11.0.0. > > So, the shell invocation can be replaced with more efficient code: > > ifeq ($(call test-lt, $(CONFIG_LLD_VERSION), 130000),y) > > Of course, this assumption will break when LLVM 100 is released, but it > will be far in the future. > > Signed-off-by: Masahiro Yamada <masahiroy@xxxxxxxxxx> > --- -- Best Regards Masahiro Yamada