Received: by 10.192.165.156 with SMTP id m28csp975281imm; Wed, 18 Apr 2018 01:34:36 -0700 (PDT) X-Google-Smtp-Source: AIpwx49cFEuu91MBaGp0D2NvSsfIwwoCxhzS5zUe+mmfJETV2Ro0SPR0howzMzA9pY43q5qDT2Hj X-Received: by 2002:a17:902:33a5:: with SMTP id b34-v6mr1240320plc.232.1524040476272; Wed, 18 Apr 2018 01:34:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524040476; cv=none; d=google.com; s=arc-20160816; b=IZahsPNwzqOI9nCYOvJY9jUYwYRRDsPswyn7WsYcjJC01XyyUITbVuFSKQw67AY1XX TEHjw3fKsikyDlHt+IiGoX5NinHNF3Aq0JljJEWesce/luin48YicVKRdTzUEOiVBk8Q qS8fSsf1ADLdYcenVARe9gaa2QFH2vb4cVNbQvJ4FzjsGC9zOutXqC1hXZPMyEDy3l/y zQNAF628arAfQAUevKqzuwcKY9oyDplii4Q9bkPcdb8A8thu27okxVKfG2hG2D/uaZ6p 0uxx7iJB6lEPz0fPNS86XCh4e9FeYfTRNrhmwAnjkT43nsMLSu/j18kHtxKmTYR/F3A0 Cncw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=hKn0zLRVkcNWzMHRXxnpJ8R+6WajEB39jQ3DIckAdPA=; b=tzq6gzXONXU+bU+3Lun1prPJyBCqH413Hz5Ci+SgtOgx8sz8LU3G/SwuO5wB+v1Mnx LkQqyGkwW6kcWOqoIZnH9W1xkIIMFC2SmC4gnYkCk0UdmKJv/aKju/4NMzTLjqBvIQwI NZPD+aoQ4a3LItO/DkPm9HjUfTTS7pbSw26EcL/KJ/wgmMIBvadkAR+NImSuFSKzAVI5 9szG7bXjPOoMbeaEQHcwkJ4JpKLZJL5bpg6FToPmrslDf072D/HLSx3Y1h7/0/+8Wy8Q uIv63aH/kvgpCumPycJGY/EU0qtHRynOpuQE6AsGRJCuhZ7hVLtzRSdlOatU5W+d8FRo nkww== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=sDbGkFyN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d2-v6si787999pln.533.2018.04.18.01.34.22; Wed, 18 Apr 2018 01:34:36 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=sDbGkFyN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753525AbeDRIdK (ORCPT + 99 others); Wed, 18 Apr 2018 04:33:10 -0400 Received: from mail-vk0-f42.google.com ([209.85.213.42]:41219 "EHLO mail-vk0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753202AbeDRIdI (ORCPT ); Wed, 18 Apr 2018 04:33:08 -0400 Received: by mail-vk0-f42.google.com with SMTP id i75so540281vke.8; Wed, 18 Apr 2018 01:33:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=hKn0zLRVkcNWzMHRXxnpJ8R+6WajEB39jQ3DIckAdPA=; b=sDbGkFyNqYeaH+ZTk5Vg6isRe48oJHyyH2N4kIBMag5/INsE0ikL8y5YK51Vbl1LH2 Bg1lwiVf17u5UnEzG2ih73Nu4FhQf8m0josx7PPqKBfEBqlFnFi0FuMrd96V2M3ABGRB rbDAKn8pCH6zORPAUPOP3f9RWj217UH/3qBAbEHZulxsOue31h4gnMCymcI+OSj++4aW p6w+d0fnICCdnVGjCPPQeKra2ndbFVK+atag4aZPw6ypPjja2oH4XoJJ10dKKy3Im1lW c2yYyee0q17XpPVi61eKC4J3AQ7p1WJkTmkGYP+bb6+hSj85fbaUYcB/NWkk4VP3Qb4n wCcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=hKn0zLRVkcNWzMHRXxnpJ8R+6WajEB39jQ3DIckAdPA=; b=FnFyObANRg8K6LIRCbh29AKxSZgn8imPMNb0WqQub9nzXfHRsPSu3aYMVfxRmOkpKn WMofNlVZqdb5lsmS6woKc4IxIpQrZGd52Jxie+kf6KM7Y4JxoTjzTaRj9lQS1vQKikUv o9pw+jhPHzRJVnN7Sq8vhVaEqxP7pRg7tZ8s2X9zKkaFzLJVKMCi2U0d9VLbm8qxOaiD uqBAreSf3wNas4TLw4UO9cA9dIrgNlDixvhJj2fbIABhqqCdW2ua8dHNwwcNjtNmZqLS ty4LwwTyo0/bsGrcLIfxy0jidTbmoY2LV9KUGvma+Zxb5wv+G8FkfffDm0punDRUydLq UxJA== X-Gm-Message-State: ALQs6tCo3+7GY3Cbu4k9qvWBLABZ7QjCw0VCI1Qo9BeRtOgT+Wz/WmWO aKMnM6i3M+DsXB7iYnI0F7RSmr8G3yXONFx9+g8= X-Received: by 10.31.199.65 with SMTP id x62mr669015vkf.189.1524040386985; Wed, 18 Apr 2018 01:33:06 -0700 (PDT) MIME-Version: 1.0 Received: by 10.103.222.15 with HTTP; Wed, 18 Apr 2018 01:33:06 -0700 (PDT) In-Reply-To: References: <1523595999-27433-1-git-send-email-yamada.masahiro@socionext.com> <1523595999-27433-18-git-send-email-yamada.masahiro@socionext.com> From: Ulf Magnusson Date: Wed, 18 Apr 2018 10:33:06 +0200 Message-ID: Subject: Re: [PATCH 17/30] Documentation: kconfig: document a new Kconfig macro language To: Masahiro Yamada Cc: Linux Kbuild mailing list , Linus Torvalds , Sam Ravnborg , Nicholas Piggin , Kees Cook , Emese Revfy , X86 ML , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Apr 17, 2018 at 5:07 PM, Masahiro Yamada wrote: > 2018-04-15 17:08 GMT+09:00 Ulf Magnusson : >> On Fri, Apr 13, 2018 at 7:06 AM, Masahiro Yamada >> wrote: >>> Add a document for the macro language introduced to Kconfig. >>> >>> The motivation of this work is to move the compiler option tests to >>> Kconfig from Makefile. A number of kernel features require the >>> compiler support. Enabling such features blindly in Kconfig ends up >>> with a lot of nasty build-time testing in Makefiles. If a chosen >>> feature turns out unsupported by the compiler, what the build system >>> can do is either to disable it (silently!) or to forcibly break the >>> build, despite Kconfig has let the user to enable it. >>> >>> This change was strongly prompted by Linus Torvalds. You can find >>> his suggestions [1] [2] in ML. The original idea was to add a new >>> 'option', but I found generalized text expansion would make Kconfig >>> more powerful and lovely. While polishing up the implementation, I >>> noticed sort of similarity between Make and Kconfig. This might be >>> too immature to be called 'language', but anyway here it is. All >>> ideas are from Make (you can even say it is addicted), so people >>> will easily understand how it works. >>> >>> [1]: https://lkml.org/lkml/2016/12/9/577 >>> [2]: https://lkml.org/lkml/2018/2/7/527 >>> >>> Signed-off-by: Masahiro Yamada >>> --- >>> >>> Changes in v3: None >>> Changes in v2: None >>> >>> Documentation/kbuild/kconfig-macro-language.txt | 179 ++++++++++++++++++++++++ >>> MAINTAINERS | 2 +- >>> 2 files changed, 180 insertions(+), 1 deletion(-) >>> create mode 100644 Documentation/kbuild/kconfig-macro-language.txt >>> >>> diff --git a/Documentation/kbuild/kconfig-macro-language.txt b/Documentation/kbuild/kconfig-macro-language.txt >>> new file mode 100644 >>> index 0000000..1f6281b >>> --- /dev/null >>> +++ b/Documentation/kbuild/kconfig-macro-language.txt >>> @@ -0,0 +1,179 @@ >>> +Concept >>> +------- >>> + >>> +The basic idea was inspired by Make. When we look at Make, we notice sort of >>> +two languages in one. One language describes dependency graphs consisting of >>> +targets and prerequisites. The other is a macro language for performing textual >>> +substitution. >>> + >>> +There is clear distinction between the two language stages. For example, you >>> +can write a makefile like follows: >>> + >>> + APP := foo >>> + SRC := foo.c >>> + CC := gcc >>> + >>> + $(APP): $(SRC) >>> + $(CC) -o $(APP) $(SRC) >>> + >>> +The macro language replaces the variable references with their expanded form, >>> +and handles as if the source file were input like follows: >>> + >>> + foo: foo.c >>> + gcc -o foo foo.c >>> + >>> +Then, Make analyzes the dependency graph and determines the targets to be >>> +updated. >>> + >>> +The idea is quite similar in Kconfig - it is possible to describe a Kconfig >>> +file like this: >>> + >>> + CC := gcc >>> + >>> + config CC_HAS_FOO >>> + def_bool $(shell $(srctree)/scripts/gcc-check-foo.sh $(CC)) >>> + >>> +The macro language in Kconfig processes the source file into the following >>> +intermediate: >>> + >>> + config CC_HAS_FOO >>> + def_bool y >>> + >>> +Then, Kconfig moves onto the evaluation stage to resolve inter-symbol >>> +dependency, which is explained in kconfig-language.txt. >>> + >>> + >>> +Variables >>> +--------- >>> + >>> +Like in Make, a variable in Kconfig works as a macro variable. A macro >>> +variable is expanded "in place" to yield a text string that may then expanded >>> +further. To get the value of a variable, enclose the variable name in $( ). >>> +As a special case, single-letter variable names can omit the parentheses and is >>> +simply referenced like $X. Unlike Make, Kconfig does not support curly braces >>> +as in ${CC}. >> >> Do we need single-letter variable names for anything? It looks like >> we're deviating >> a bit from Make behavior already. >> >> I suspect they're just a side effect of Make having automatic variables like $@. >> The Make manual discourages them otherwise: >> >> "A dollar sign followed by a character other than a dollar sign, >> open-parenthesis or >> open-brace treats that single character as the variable name. Thus, you could >> reference the variable x with `$x'. However, this practice is strongly >> discouraged, >> except in the case of the automatic variables (see section Automatic >> Variables)." >> > > OK. We do not need two ways to do the same thing. > > I will consider it > although supporting single-letter variable is not costly. > > > > -- > Best Regards > Masahiro Yamada Can you think of any cases where dynamic generation of Kconfig symbol names would be a good solution by the way? Personally, I'd make the semantics obvious by requiring quotes, so you could do e.g. bar := "bar value" baz := "baz value" foo := " $(bar) $(baz) " and get " bar value baz value " in 'foo'. That'd get rid of those $(empty) hacks and the like, and would make things super easy to understand. If expansion was then also limited to within "" (so that you always produce values), things would get absolutely ridiculously simple, both behavior- and implementation-wise. All the unput() shenanigans would disappear (shaving off code), and everyone would be able to tell at a glance how stuff works. I know that you're trying to create something that will be immediately familiar to people used to Make, and that allows things to be easily moved over, but I wonder if it's worthwhile to carry over the parts that people find the most confusing and subtle about Make. Simply and recursively expanded variables and functions are great and make sense, but the rest I'm not so sure about, especially in Kconfig context. When I see $(foo) outside of quotes, I assume a textual substitution, like in Make, because it sticks out like a sore thumb compared to the rest of the Kconfig syntax (I also think "Perl scalar"). It's actually a token substitution here. "$(foo)" makes it obvious. Cheers, Ulf