2018-03-27 14:29 GMT+09:00 Masahiro Yamada <yamada.masahiro@xxxxxxxxxxxxx>: > > Here is v2 to start to move compiler capability tests to Kconfig. > > V1: > https://lkml.org/lkml/2018/2/16/610 > > I brushed up the implementation even more. > > Major changes for v2: > [1] Environments and functions are expanded in the lexer (zconf.l) > The parser (zconf.y) receives expanded tokens. This simplifies > the implementation. > > [2] Implement only one built-in function 'shell'. This returns > stdout from the command. We need something to return 'y' or 'n'. > This is now implemented as a macro 'success'. > > [3] Macros (user-defined function) are defined by 'macro' keyword > instead of string type symbol. > > ex1) macro success $(shell ($(1) && echo y) || echo n) > ex2) macro cc-option $(success $CC -Werror $(1) -c -x c /dev/null -o /dev/null) > > My plan for v3 > -------------- > > The MW is approaching, but I'd like to make it more lovely if > I have some time. > > While I was writing these patches, I noticed a kind of similarity > between Makefile and Kconfig. > > Makefile can define variables and functions to do text processing > during the parse phase. After parsing, it builds up dependency > graph, and moves on to the execution phase. Then, it generates > objects as needed by checking time-stamps. > > [Makefile] > > OBJ := foo.o > SRC := foo.c > CC := gcc > > $(OBJ): $(SRC) > $(CC) -c -o $(OBJ) $(SRC) > > [Makefile after text processing] > > foo.o: foo.c > gcc -c -o foo.o foo.c > > Now, we are adding tools for text processing to Kconfig. Functions > are statically expanded by the lexer. After all source files are > parsed, Kconfig moves on to the evaluation phase. Then, users can > tweak symbol values from menus. > > So, we should be able to describe Kconfig like follows: > > [Kconfig] > > MY_SYMBOL := CC_STACKPROTECTOR > MY_PROMPT := "Stackprotector" > success = $(shell ($(1) && echo y) || echo n) > cc-option = $(success $CC -Werror $(1) -c -x c /dev/null -o /dev/null) > > config $(MY_SYMBOL) > bool $(MY_PROMPT) > depends on $(cc-option -fstack-protector) > > [Kconfig after text processing] > > config CC_STACKPROTECTOR > bool "Stackptector" > depends on y > > So, I think it is better to use '=' assignment for defining functions. > I will remove the 'macro' keyword. > Also, support variables. A variable is a function with no argument. > So, it will be easy to implement it as a sub-set of function feature. > It is better to support two flavors of assignments, '=' and ':=' as well. > > Masahiro Yamada (21): > kbuild: remove kbuild cache > kbuild: remove CONFIG_CROSS_COMPILE support > kconfig: move and rename sym_expand_string_value() > kconfig: reference environments directly and remove 'option env=' > syntax > kconfig: remove string expansion in file_lookup() > kconfig: remove string expansion for mainmenu after yyparse() > kconfig: add function support and implement 'shell' function > kconfig: replace $UNAME_RELEASE with function call > kconfig: add 'macro' keyword to support user-defined function > kconfig: add 'success' and 'cc-option' macros > stack-protector: test compiler capability in Kconfig and drop AUTO > mode > kconfig: show compiler version text in the top comment > kconfig: add CC_IS_GCC and GCC_VERSION > kconfig: add CC_IS_CLANG and CLANG_VERSION > gcov: remove CONFIG_GCOV_FORMAT_AUTODETECT > kcov: imply GCC_PLUGINS and GCC_PLUGIN_SANCOV instead of select'ing > them > gcc-plugins: always build plugins with C++ > gcc-plugins: move GCC version check for PowerPC to Kconfig > gcc-plugins: test GCC plugin support in Kconfig > gcc-plugins: enable GCC_PLUGINS for COMPILE_TEST > arm64: move GCC version check for ARCH_SUPPORTS_INT128 to Kconfig > > Documentation/kbuild/kconfig-language.txt | 8 -- > Kconfig | 4 +- > Makefile | 103 ++------------ > arch/Kconfig | 37 ++--- > arch/arm64/Kconfig | 1 + > arch/arm64/Makefile | 2 - > arch/powerpc/Kconfig | 2 +- > arch/sh/Kconfig | 4 +- > arch/sparc/Kconfig | 4 +- > arch/tile/Kconfig | 2 +- > arch/um/Kconfig.common | 4 - > arch/x86/Kconfig | 12 +- > arch/x86/um/Kconfig | 4 +- > init/Kconfig | 44 +++--- > kernel/gcov/Kconfig | 17 +-- > kernel/gcov/Makefile | 2 - > lib/Kconfig.debug | 7 +- > scripts/Kbuild.include | 101 ++------------ > scripts/Makefile.gcc-plugins | 95 ++++--------- > scripts/clang-version.sh | 24 ++-- > scripts/gcc-plugin.sh | 37 +---- > scripts/gcc-plugins/Makefile | 15 +- > scripts/gcc-x86_32-has-stack-protector.sh | 7 +- > scripts/gcc-x86_64-has-stack-protector.sh | 5 - > scripts/kconfig/confdata.c | 31 +--- > scripts/kconfig/env.c | 95 +++++++++++++ > scripts/kconfig/function.c | 225 ++++++++++++++++++++++++++++++ > scripts/kconfig/kconf_id.c | 1 - > scripts/kconfig/lkc.h | 9 +- > scripts/kconfig/lkc_proto.h | 7 +- > scripts/kconfig/menu.c | 3 - > scripts/kconfig/symbol.c | 109 --------------- > scripts/kconfig/util.c | 96 ++++++++++--- > scripts/kconfig/zconf.l | 51 ++++++- > scripts/kconfig/zconf.y | 35 ++--- > 35 files changed, 608 insertions(+), 595 deletions(-) > create mode 100644 scripts/kconfig/env.c > create mode 100644 scripts/kconfig/function.c > > -- > 2.7.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html For convenience, the whole of this series is available at the following branch. git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git kconfig-shell-v2 -- Best Regards Masahiro Yamada -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html