[Toybox] getconf NPROCESSORS_ONLN broken
Rob Landley
rob at landley.net
Thu Oct 4 13:23:55 PDT 2018
On 09/28/2018 10:05 PM, enh wrote:
> As someone who has a vested interest in having less generated code (because I'd
> like to stop checking in generated files and use toybox in the AOSP build[1])...
> do we even need to do this? How many of these defines are missing on
> glibc/musl/bionic? If it's only one or two as I assume, could we just have the
> #ifdefs instead?
>
> Or are there actually a large number of these missing?
Years ago the linux kernel had clever config_enabled(CONFIG_BLAH) macros that
did a trick with commas and varargs to turn undefined symbols into a default
argument, and I've been meaning to try to extend that into CFG(THINGY) and
USE(THINGY, xxx) macros that don't require a preprocessed #include file.
Unfortunately they seem to have renamed it (broke my "apply DEVTMPFS_MOUNT to
initramfs" patch, that did), lemme see if I can dig that up... it's in
include/linux/kconfig.h, and consists of the following 5 macros plus explanation
comment:
#define __ARG_PLACEHOLDER_1 0,
#define __take_second_arg(__ignored, val, ...) val
/*
* 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 __is_defined(x) ___is_defined(x)
#define ___is_defined(val) ____is_defined(__ARG_PLACEHOLDER_##val)
#define ____is_defined(arg1_or_junk) __take_second_arg(arg1_or_junk 1, 0)
So __is_defined(BLAH) resolves to 0 or 1 depending on whether BLAH is defined to
1 or not, using just macro expansion...
(The "need for multiple macros that call each other" is a thing I hit long ago
and described at https://landley.net/notes-2007.html#05-12-2007 .)
The problem is, we can't guarantee the macro is defined to 1, so I need to
invert the logic and have it be "does not resolve exactly to the macro name".
And ideally, we want:
ISDEFAULT(MACRONAME,default value)
Where it resolves to whatever the macro is defined to, else resolves to the
second argument...
Rob
More information about the Toybox
mailing list