Boost logo

Boost-Build :

Subject: [Boost-build] Manipulating target names
From: Johan Larsson (hnefi.mail_at_[hidden])
Date: 2009-09-17 05:10:19


I need to add an IDL compiler to my bjam project. The invocation itself is
simple; a one-liner with the IDL file as input will produce five new files,
three headers and two sources. The sources are then to be used to compile a
library.

For this purpose, I created a generator (after finding some examples on this
mailing list):
# omniidl.jam

import generators ;
import type ;

type.register IDL : idl ;

generators.register-standard omniidl.omniidl
  : IDL
  : CPP(T%Caller) CPP(T%Dispatcher)
  ;

rule omniidl ( targets + : source : properties * : d * : e * )
{
}

actions omniidl
{
  <idl invocation command> -C ./ $(>)
}

# end of omniidl.jam

The problem:
The IDL files are named as interfaces, which means they have a filename
according to the pattern I*.idl. The generated files get the following
patterns:
I*.h
T*Caller.cpp
T*Caller.h
T*Dispatcher.cpp
T*Dispatcher.h

That I/T prefix is giving me problems. If I try to invoke the omniidl rule
above with the complete filename (IExample.idl), bjam expects the ORB to
output TIExampleCaller.cpp and TIExampleDispatcher.cpp, when it actually
generates TExampleCaller.cpp and TExampleDispatcher.cpp. If I try to adapt
the generator to accept target names without the prefix and generate them
after the fact, it complains about source files not existing.

Is there an elegant way to solve this? The best solution would be if I could
remove the first letter of the target name string when I register the
generator, but I have no idea how to do this.

Thank you for your time.



Boost-Build list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk