Re: [PATCH 1/6] kbuild: add test-{le,ge,lt,gt} macros

From: Masahiro Yamada
Date: Fri Nov 18 2022 - 16:09:01 EST


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