mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Sascha Hauer <s.hauer@pengutronix.de>
To: barebox@lists.infradead.org
Subject: [PATCH 15/30] kconfig: fix IS_ENABLED to not require all options to be defined
Date: Thu,  5 Jul 2012 21:36:45 +0200	[thread overview]
Message-ID: <1341517020-5581-15-git-send-email-s.hauer@pengutronix.de> (raw)
In-Reply-To: <1341517020-5581-1-git-send-email-s.hauer@pengutronix.de>

From Linux commit 69349c2dc01c489eccaa4c472542c08e370c6d7e:

    Using IS_ENABLED() within C (vs.  within CPP #if statements) in its
    current form requires us to actually define every possible bool/tristate
    Kconfig option twice (__enabled_* and __enabled_*_MODULE variants).

    This results in a huge autoconf.h file, on the order of 16k lines for a
    x86_64 defconfig.

    Fixing IS_ENABLED to be able to work on the smaller subset of just
    things that we really have defined is step one to fixing this.  Which
    means it has to not choke when fed non-enabled options, such as:

      include/linux/netdevice.h:964:1: warning: "__enabled_CONFIG_FCOE_MODULE" is not defined [-Wundef]

    The original prototype of how to implement a C and preprocessor
    compatible way of doing this came from the Google+ user "comex ." in
    response to Linus' crowdsourcing challenge for a possible improvement on
    his earlier C specific solution:

    	#define config_enabled(x)       (__stringify(x)[0] == '1')

    In this implementation, I've chosen variable names that hopefully make
    how it works more understandable.

    Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 include/linux/kconfig.h |   20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/include/linux/kconfig.h b/include/linux/kconfig.h
index 067eda0..cb17ee2 100644
--- a/include/linux/kconfig.h
+++ b/include/linux/kconfig.h
@@ -9,24 +9,38 @@
  */
 
 /*
+ * Getting something that works in C and CPP for an arg that may or may
+ * not be defined is tricky.  Here, if we have "#define CONFIG_BOOGER 1"
+ * we match on the placeholder define, insert the "0," for arg1 and generate
+ * the triplet (0, 1, 0).  Then the last step cherry picks the 2nd arg (a one).
+ * When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when
+ * the last step cherry picks the 2nd arg, we get a zero.
+ */
+#define __ARG_PLACEHOLDER_1 0,
+#define config_enabled(cfg) _config_enabled(cfg)
+#define _config_enabled(value) __config_enabled(__ARG_PLACEHOLDER_##value)
+#define __config_enabled(arg1_or_junk) ___config_enabled(arg1_or_junk 1, 0)
+#define ___config_enabled(__ignored, val, ...) val
+
+/*
  * IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm',
  * 0 otherwise.
  *
  */
 #define IS_ENABLED(option) \
-	(__enabled_ ## option || __enabled_ ## option ## _MODULE)
+	(config_enabled(option) || config_enabled(option##_MODULE))
 
 /*
  * IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0
  * otherwise. For boolean options, this is equivalent to
  * IS_ENABLED(CONFIG_FOO).
  */
-#define IS_BUILTIN(option) __enabled_ ## option
+#define IS_BUILTIN(option) config_enabled(option)
 
 /*
  * IS_MODULE(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'm', 0
  * otherwise.
  */
-#define IS_MODULE(option) __enabled_ ## option ## _MODULE
+#define IS_MODULE(option) config_enabled(option##_MODULE)
 
 #endif /* __LINUX_KCONFIG_H */
-- 
1.7.10


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

  parent reply	other threads:[~2012-07-05 19:37 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-05 19:36 [PATCH 01/30] USB: Fix typo tranceiver -> transceiver Sascha Hauer
2012-07-05 19:36 ` [PATCH 02/30] ARM: let armlinux_set_* depend on the correct option Sascha Hauer
2012-07-05 19:36 ` [PATCH 03/30] bootm: Fix undefined reference to of_fix_tree Sascha Hauer
2012-07-05 19:36 ` [PATCH 04/30] uimage: introduce UIMAGE Kconfig symbol Sascha Hauer
2012-07-05 19:36 ` [PATCH 05/30] ARM at91rm9200: Add missing include Sascha Hauer
2012-07-05 19:36 ` [PATCH 06/30] Add missing semicolons at end of EXPORT_SYMBOL Sascha Hauer
2012-07-05 19:36 ` [PATCH 07/30] exec command: Fix compilation Sascha Hauer
2012-07-05 19:36 ` [PATCH 08/30] input gpio buttons: needs poller API Sascha Hauer
2012-07-05 19:36 ` [PATCH 09/30] loadb: fix compilation Sascha Hauer
2012-07-05 19:36 ` [PATCH 10/30] mfd TWL4030: Fix Kconfig dependencies Sascha Hauer
2012-07-05 19:36 ` [PATCH 11/30] pwm PXA: Compile only on PXA Sascha Hauer
2012-07-05 19:36 ` [PATCH 12/30] fs nfs: depend on net Sascha Hauer
2012-07-05 19:36 ` [PATCH 13/30] mtd nand: Fix compilation without bbt support Sascha Hauer
2012-07-05 19:36 ` [PATCH 14/30] led: remove gpio include Sascha Hauer
2012-07-05 19:36 ` Sascha Hauer [this message]
2012-07-05 19:36 ` [PATCH 16/30] ARM Samsung S5P: Disable support until we have a board Sascha Hauer
2012-07-05 19:36 ` [PATCH 17/30] gpio: add static inlines for gpio_request/gpio_free Sascha Hauer
2012-07-05 19:36 ` [PATCH 18/30] ARM: remove mx1ads leftovers Sascha Hauer
2012-07-05 19:36 ` [PATCH 19/30] usb gadget at91: Use correct include Sascha Hauer
2012-07-05 19:36 ` [PATCH 20/30] usb gadget: Enable gadget support only when a driver is available Sascha Hauer
2012-07-05 19:36 ` [PATCH 21/30] ARM i.MX: rename internal-nand-boot.c to external-nand-boot.c Sascha Hauer
2012-07-05 19:36 ` [PATCH 22/30] ARM i.MX: No external NAND boot on i.MX1 Sascha Hauer
2012-07-05 19:36 ` [PATCH 23/30] mtd: remove dead disk-on-chip support Sascha Hauer
2012-07-05 19:36 ` [PATCH 24/30] mtd omap: add prefix to omap specific decode_bch function Sascha Hauer
2012-07-05 19:36 ` [PATCH 25/30] ARM at91: remove const Sascha Hauer
2012-07-05 19:36 ` [PATCH 26/30] ARM at91: fix typo in define Sascha Hauer
2012-07-05 19:36 ` [PATCH 27/30] uimage: select uncompress and crc32 support Sascha Hauer
2012-07-05 19:36 ` [PATCH 28/30] I2C i.MX: disable driver for i.MX1 Sascha Hauer
2012-07-05 19:36 ` [PATCH 29/30] mtd: scan_write_bbt is only needed with mtd write support Sascha Hauer
2012-07-05 19:37 ` [PATCH 30/30] UBI: select crc32 support Sascha Hauer
2012-07-06  7:37 ` [PATCH 01/30] USB: Fix typo tranceiver -> transceiver Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1341517020-5581-15-git-send-email-s.hauer@pengutronix.de \
    --to=s.hauer@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox