• Masahiro Yamada's avatar
    kconfig: support user-defined function and recursively expanded variable · 9ced3bdd
    Masahiro Yamada authored
    Now, we got a basic ability to test compiler capability in Kconfig.
    
    config CC_HAS_STACKPROTECTOR
            def_bool $(shell,($(CC) -Werror -fstack-protector -E -x c /dev/null -o /dev/null 2>/dev/null) && echo y || echo n)
    
    This works, but it is ugly to repeat this long boilerplate.
    
    We want to describe like this:
    
    config CC_HAS_STACKPROTECTOR
            bool
            default $(cc-option,-fstack-protector)
    
    It is straight-forward to add a new function, but I do not like to
    hard-code specialized functions like that.  Hence, here is another
    feature, user-defined function.  This works as a textual shorthand
    with parameterization.
    
    A user-defined function is defined by using the = operator, and can
    be referenced in the same way as built-in functions.  A user-defined
    function in Make is referenced like $(call my-func,arg1,arg2), but I
    omitted the 'call' to make the syntax shorter.
    
    The definition of a user-defined function contains $(1), $(2), etc.
    in its body to reference the parameters.  It is grammatically valid
    to pass more or fewer arguments when calling it.  We already exploit
    this feature in our makefiles; scripts/Kbuild.include defines cc-option
    which takes two arguments at most, but most of the callers pass only
    one argument.
    
    By the way, a variable is supported as a subset of this feature since
    a variable is "a user-defined function with zero argument".  In this
    context, I mean "variable" as recursively expanded variable.  I will
    add a different flavored variable in the next commit.
    
    The code above can be written as follows:
    
    [Example Code]
    
      success = $(shell,($(1)) >/dev/null 2>&1 && echo y || echo n)
      cc-option = $(success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null)
    
      config CC_HAS_STACKPROTECTOR
              def_bool $(cc-option,-fstack-protector)
    
    [Result]
      $ make -s alldefconfig && tail -n 1 .config
      CONFIG_CC_HAS_STACKPROTECTOR=y
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    9ced3bdd
lkc_proto.h 2.36 KB