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 catination, and the $(or ...) $(and ...) $(if ...) 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.