I have been banging my head against Boost Build V2 to do a seemingly simple task (at least in the Make world it was).


Some background on CxxTest unit test framework: 


In CxxTest you subclass from CxxTest base class to define a test suite class (e.g., call it FooTS) and you preprocess the header file (FooTS.h) using the Perl script to generate a C++ source file with main() defined that will run the test (lets call this runner.cpp).  You then compile and link FooTS.cpp and runner.cpp into a runner executable.


If you have more than one test suite class (e.g. FooTS and BarTS) you may want to create a single runner that runs both suites so you have to pass FooTS.h and BarTS.h as inputs to a single invocation of to generate a single runner.cpp.  Then you compile and link FooTS.cpp, BarTS.cpp, and runner.cpp into a runner executable.


I’ve tried to use generators (with minimal success if I am willing to rename my header files and limit myself to a single test suite), custom generators (no success), even brute force use of the “make” rule did not work.  Now I am trying to create a new main target rule with no success and some guidance would be greatly appreciated because there seems to be some fundamental concepts about that I don’t understand.


In Jam-speak I would like at least to be able to say the following in my Jamfile and have it do the right thing:


cxxtest-exe runner : FooTS.h BarTS.h : FooTS.cpp BarTS.cpp <other sources> ;



So I have created an action that calls the perl script and am trying to write the cxxtest-exe rule to wrap the exe rule as follows:


# Creates a cpp source file by processing a bunch of C++ header files

actions gen-cxxtest-runner-cpp

{ –o $(<) $(>)



rule cxxtest-exe ( target-name :

                   cxxtest-headers + :

                   sources + :

                   requirements * :

                   default-build * :

                   usage-requirements * )


   # I have tried invoking the implicit gen-cxxtest-runner-cpp rule here as well


   exe $(target-name) :

       $(sources) [ gen-cxxtest-runner-cpp $(target-name).cpp : $(cxxtest-headers) ]:

       $(requirements) :

       $(default-build) :

       $(usage-requirements) ;



I have tried MANY variations on this theme but I encounter many different problems:


-        I can’t seem to get the rule to understand that runner.cpp will be generated by the action

-        in many cases I can’t get the runner.cpp to be created in the correct bin/... subdirectory (this point is important since we do simultaneous cross-platform builds and each must generate its own runner.cpp).

-        I have tried to write a gen-cxxtest-runner-cpp RULE to help without success.


I think my problem is that I don’t know how to tell the build system that I need to generate a CPP type target with a specific name from the cxxtest headers.  I have been reading all of the documentation I can find, and reading through the last 6 months of posting, but there seems to be fundamental concepts I am just not able to grasp.  I would be grateful if someone would help not only with this specific problem but also by explaining how the solution works.


Thanks in advance for your help,