All:
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 cxxtestgen.pl 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 cxxtestgen.pl
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 Boost.build 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
{
cxxtestgen.pl –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,
scott