NAME
App::unifdef+ - simplify pre-conditionals in C, Makefile and Kconfig files
SYNOPSIS
unifdef+ [-D define=val] [-U undifined] ... file
Run unifdef --help for more options.
DESCRIPTION
unifdef+ is a script to simplify conditional parts of source files based
on passed in defines and undefined values. It simplifies conditions and,
if resolved will remove any inapplicable parts of the file. It does not
simplify any portions of code which do not use any of the passed in macros
(so it will not simplify an #if TRUE ... #endif clause)
For C++/C files, it operates on preprocessor conditionals. For Makefiles
it operates on ifeq, ifdef statements, and in Kconfig file, it operates on
dependson and if clauses.
For C/C++, it is fully functional, and will simplify multiline statements,
with whitespace, and comments, and honors the C operator precidence.
For Kconfig files it handles multi-variable, and tristate conditionals,
and honors the Kconfig operator precidence. (It also handles comments
properly)
For Makefile, support is limited to the functions, catination, the
$(or ...) $(and ...) and $(strip ...) functions.
EXAMPLE
C / C++
if you had source file foo.c:
/* FOO.c */
#if ( defined(UNDEF1) && defined(UNKNOWN1) ) || \
!defined DEF1 // resolves to false
/* block will NOT appear */
#elif DEF1 <= 3 && UNKNOWN1 > (3 + 2) // (condition simplifies)
/* block will appear */
#elif DEF1 > 3 // condition resolves to false (1 < 3...)
/* block will NOT appear */
#else
/* block will appear, as an else to the unknown */
#endif
and you ran:
unifdef+ -D DEF1=1 -D DEF2=2 -U UNDEF1 foo.c
it would modify foo.c in place to read:
/* FOO.c */
#if UNKNOWN1 > (3 + 2) // (condition simplifies)
/* block will appear */
#else
/* block will appear, as an else to the unknown */
#endif
MAKEFILE
If you had a makefile foo.mak:
/* FOO.mak */
ifeq ( $(and $(CONFIG_DEF_Y),$(CONFIG_UNKNOWN)), y )
# block will will appear, and above
# conditional will be simplified
else ifeq "$(CONFIG_UNDEF)" "y"
# block will not appear
else ifdef CONFIG_DEF_Y
# block will appear
else
# block will NOT appear
endif
and you ran:
unifdef+ -D CONFIG_DEF_Y=y -U CONFIG_UNDEF -I foo.mak
it would read in foo.mak, and output to stdout:
/* FOO.mak */
ifeq ($(CONFIG_UNKNOWN),y)
# block will will appear, and above
# conditional will be simplified
else
# block will appear
endif
KCONFIG
If you had a kconfig file Kconfig.foo:
#Kconfig.foo
config FOOBAR
tristate "Some feature"
depends on DEF1 && DEF2
default m if DEF1
default y if UNDEF1
help
supports multiline help
including blank lines between help entries
config FOOBARED2
tristate "Some feature"
depends on UNDEF1 && DEF2
if UNDEF1
# block removed
endif
and you ran
unifdef+ -D DEF1=y -D DEF2=m -U UNDEF1 Kconfig.foo
It would modify Kconfig.foo in place, and output:
#Kconfig.foo
config FOOBAR
tristate "Some feature"
depends on DEF2
default m
help
supports multiline help
including blank lines between help entries
INSTALLATION
You should install unifdef+ using cpan tools: cpan code::UnifdefPlus
DEPENDENCIES
perl 5.10 or later.
QUESTIONS
COPYRIGHT
Copyright 2017 - John Ulvr
LICENSE
This software is licensed under the same terms as Perl.
CREDITS
CONTRIBUTORS
Many thanks to Joel Peshkin for helping write this module
ACKNOWLEDGEMENTS
COMMUNITY
NO WARRANTY
This software is provided "as-is," without any express or implied
warranty. In no event shall the author be held liable for any damages
arising from the use of the software.