---
name: "preprocess"
section: "1"
platform: "linux"
package: "preprocess"
version: "1.1.0+ds-1"
release: "Debian 10 (Buster)"
platforms: ["linux"]
url: "https://new.carta.tech/preprocess"
---

# preprocess(1)

Preprocess a file.

## NAME

preprocess - Preprocess a file.

## SYNOPSIS

**preprocess** \[*options*...\] *infile*

## DESCRIPTION

Preprocess is like a typical C preprocessor, but it extends to multiple languages. Languages for which it works include: C++, Python, Perl, Tcl, XML, JavaScript, CSS, IDL, TeX, Fortran, PHP, Java, Shell scripts (Bash, CSH, etc.) and C#. Preprocess is usable both as a command line app and as a Python module.

## OPTIONS

- **-h**, **--help**

  Print help text and exit.

- **-V**, **--version**

  Print the version info and exit.

- **-v**, **--verbose**

  Give verbose output for errors.

- **-o** *outfile*

  Write output to the given file instead of to stdout.

- **-f**, **--force**

  Overwrite given output file. Otherwise an IOError will be raised if *outfile* already exists.

- **-D** *define*

  Define a variable for preprocessing. *define* can simply be a variable name (in which case it will be true) or it can be of the form *var*=*val*. An attempt will be made to convert *val* to an integer so "**-D FOO=0**" will create a false value.

- **-I** *dir*

  Add a directory to the include path for #include directives.

- **-k**, **--keep-lines**

  Emit empty lines for preprocessor statement lines and skipped output lines. This allows line numbers to stay constant.

- **-s**, **--substitute**

  Substitute defines into emitted lines. By default substitution is NOT done because it currently will substitute into program strings.

## MODULE USAGE

-

   from preprocess import preprocess\
    preprocess(infile, outfile=sys.stdout, defines={}, force=0,\
               keepLines=0, includePath=\[\], substitute=0)

The \<infile\> can be marked up with special preprocessor statement lines of the form:

-

   \<comment-prefix\> \<preprocessor-statement\> \<comment-suffix\>

where the \<comment-prefix/suffix\> are the native comment delimiters for that file type.

## EXAMPLES

HTML (\*.htm, \*.html) or XML (\*.xml, \*.kpf, \*.xul) files:

-

   \<!-- #if FOO --\>\
    ...\
    \<!-- #endif --\>

Python (\*.py), Perl (\*.pl), Tcl (\*.tcl), Ruby (\*.rb), Bash (\*.sh), or make (\[Mm\]akefile\*) files:

-

   \# #if defined('FAV\_COLOR') and FAV\_COLOR == "blue"\
    ...\
    \# #elif FAV\_COLOR == "red"\
    ...\
    \# #else\
    ...\
    \# #endif

C (\*.c, \*.h), C++ (\*.cpp, \*.cxx, \*.cc, \*.h, \*.hpp, \*.hxx, \*.hh), Java (\*.java), PHP (\*.php) or C# (\*.cs) files:

-

   // #define FAV\_COLOR 'blue'\
    ...\
    /\* #ifndef FAV\_COLOR \*/\
    ...\
    // #endif

Fortran 77 (\*.f) or 90/95 (\*.f90) files:

-

   C     #if COEFF == 'var'\
          ...\
    C     #endif

## PREPROCESSOR SYNTAX

Valid statements:

-

   \#define \<var\> \[\<value\>\]\
    \#undef \<var\>\
    \#ifdef \<var\>\
    \#ifndef \<var\>\
    \#if \<expr\>\
    \#elif \<expr\>\
    \#else\
    \#endif\
    \#error \<error string\>\
    \#include "\<file\>"

where \<expr\> is any valid Python expression.

The expression after #if/elif may be a Python statement. It is an error to refer to a variable that has not been defined by a **-D** option or by an in-content #define.

Special built-in methods for expressions:

-

   defined(varName)    Return true if given variable is defined.

## TIPS

A suggested file naming convention is to let input files to preprocess be of the form \<basename\>.p.\<ext\> and direct the output of preprocess to \<basename\>.\<ext\>, e.g.:

-

   **preprocess** -o foo.py foo.p.py

The advantage is that other tools (esp. editors) will still recognize the unpreprocessed file as the original language.

## AUTHORS

Trent Mick \<trentm@gmail.com\>

This manual page was written by Johannes Ring \<johannr@simula.no\> for the Debian GNU/Linux system (but may be used by others).
