Boost logo

Boost :

Subject: Re: [boost] Partial preprocessing for Fusion, et.al. (was: [netlib] Update: 0.9 will not be header-only)
From: Hartmut Kaiser (hartmut.kaiser_at_[hidden])
Date: 2010-12-06 07:34:57


> On Sun, Dec 5, 2010 at 2:02 AM, joel falcou <joel.falcou_at_[hidden]> wrote:
> > In my own experience, problem lies in Proto/MPL/Fusion preprocessor
> > time more than anything else.
> > MPL became managable thansk to the preprocessed headers, maybe
> > Fusion,Proto and maybe Spirit should do the same
>
> +1
>
> Does anybody have an idea on how this can be done? I seem to recall that
> GCC only had options for preprocessing when compiling an object file --
> that would mean for making a .cpp file for each of the headers that need
> to be pre-processed independently, running it through the compiler's
> preprocessor (or wave) to get the appropriate output.
>
> Maybe someone already has a script to do that which can be adapted?

What everybody is looking for is partial preprocessing, i.e. expansion of
only some of the macros. Wave does not directly support this (does any
preprocessor?), but you can do is to use #pragmas to enable/disable output
generation. This creates the effect of partially expanding only a subset of
the input. Here is an example:

File: example.hpp:

// stuff here will be preprocessed but not be output

#if defined(__WAVE__) && defined(CREATE_PREPROCESSED_FILES)
#pragma wave option(preserve: 2, line: 1, output:
"preprocessed/example.hpp")
#endif

// stuff here will be preprocessed and written to the file
// preprocessed/example.hpp (here: relative to example.hpp)

#if defined(__WAVE__) && defined(CREATE_PREPROCESSED_FILES)
#pragma wave option(output: null)
#endif

// stuff here will be preprocessed but not be output

File: example.cpp

// stuff here will be preprocessed but not be output
#include "example.hpp"

The crucial trick is to invoke the wave driver with the --output=- (short
option: -o-) command line option, which starts off with the output
suppressed. Having to add -DCREATE_PREPROCESSED_FILES is obvious.

Regards Hartmut
---------------
http://boost-spirit.com


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk