From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753566Ab1GMNWw (ORCPT ); Wed, 13 Jul 2011 09:22:52 -0400 Received: from cantor2.suse.de ([195.135.220.15]:51430 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752244Ab1GMNWv (ORCPT ); Wed, 13 Jul 2011 09:22:51 -0400 Message-ID: <4E1D9C25.8080300@suse.cz> Date: Wed, 13 Jul 2011 15:22:45 +0200 From: Michal Marek User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.17) Gecko/20110414 SUSE/3.1.10 Thunderbird/3.1.10 MIME-Version: 1.0 To: Arnaud Lacombe Cc: Sam Ravnborg , linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org, Jean-Christophe PLAGNIOL-VILLARD , Valdis.Kletnieks@vt.edu Subject: Re: [PATCH] kconfig: Only generate config_is_xxx for bool and tristate options References: <1305646532-29114-1-git-send-email-mmarek@suse.cz> <20110517195310.GA17003@merkur.ravnborg.org> In-Reply-To: Content-Type: multipart/mixed; boundary="------------070700060301060108060305" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is a multi-part message in MIME format. --------------070700060301060108060305 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 18.5.2011 08:23, Arnaud Lacombe wrote: > Hi, > > [added Valdis.Kletnieks@vt.edu to CC:] > > On Tue, May 17, 2011 at 3:53 PM, Sam Ravnborg wrote: >> On Tue, May 17, 2011 at 05:35:32PM +0200, Michal Marek wrote: >>> For strings and integers, the config_is_xxx macros are useless and >>> sometimes misleading: >>> >>> #define CONFIG_INITRAMFS_SOURCE "" >>> #define config_is_initramfs_source() 1 >> >> I'm late with this comment.... >> Could we introduce "config_is_foo" using a syntax that >> does not break grepability? >> >> Maybe a syntax like this? >> >> #ifdef CONFIG_FOO >> >> and >> >> if (KCONFIG_FOO()) >> >> Grepping for the use of a symbol is a very typical thing, >> so we should try to keep this. >> And with the suggested syntax above I expect fixdep to >> catch up both usage types. >> > Actually, there is already an issue, on a much smaller scale, in the > current tree with NUMA_BUILD and COMPACTION_BUILD. The real way to fix > this would be to always defines CONFIG_FOO, its value being 1 or 0 > depending on whether or not the symbol is selected. This is a > +35k/-35k change. > > Also, I find KCONFIG_FOO() is too specific to be in the kernel source, > and redundant with CONFIG_FOO. > > I've been playing a bit with the preprocessor, and reached that point: > > #define EXPAND(x) __ ## x > #define CONFIGURED(x) \ > ({ int __1 __maybe_unused = 1; \ > int __ ## x __maybe_unused = 0; \ > EXPAND(x); }) > > I am not specifically proud of that, use case would be: > > extern func(void); > int fn() > { > if(CONFIGURED(CONFIG_FOO)) > func(); > } I finally got round to revisit this. Your approach inspired me to a much simpler scheme: Instead of generating the config_is_xxx macros for direct use in the code, name them __enabled_CONFIG_XXX or similar and have a macro that expands given CONFIG_XXX symbol to the other form: /* * Usage: ENABLED(CONFIG_FOO) * Please do not use the __enabled_CONFIG_FOO defines directly to not break * grepability of the code. */ #define ENABLED(x) __enabled_ ## x plus a checkpatch.pl check so that people do not use the __enabled_CONFIG_FOO macros in their code. git grep -w CONFIG_FOO continues to work, fixdep continues to work, it works with -O0 because it expands to a if(1) or if(0). Am I missing some obvious problem? Attached is my test program: $ gcc -Wall -O0 test.c $ ./a.out Foo1.0 Foo1.1 $ strings ./a.out | grep Foo Foo1.0 Foo1.1 Michal --------------070700060301060108060305 Content-Type: text/plain; name="test.c" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="test.c" #include #define CONFIG_FOO1 1 #undef CONFIG_FOO2 #define __enabled_CONFIG_FOO1 1 #define __enabled_CONFIG_FOO2 0 /* * Usage: ENABLED(CONFIG_FOO) * Please do not use the __enabled_CONFIG_FOO defines directly to not break * grepability of the code. */ #define ENABLED(x) __enabled_ ## x int main(void) { #ifdef CONFIG_FOO1 puts("Foo1.0"); #endif #ifdef CONFIG_FOO2 puts("Foo2.0"); #endif if (ENABLED(CONFIG_FOO1)) { puts("Foo1.1"); } if (ENABLED(CONFIG_FOO2)) { puts("Foo2.1"); } return 0; } --------------070700060301060108060305--