[C++-sig] Re: bjam rules for building embedded applications
David Abrahams
dave at boost-consulting.com
Fri Apr 30 20:35:02 CEST 2004
Graeme Lufkin <gwl at u.washington.edu> writes:
> Looking at the new(ish) example/Jamfile, I've (I think) figured out the
> recommended way to build Boost.Python extensions. Extrapolating the
> idea, I've created a similar Jam template for embedding applications.
> Please critique it, to verify that I'm correctly understanding how bjam
> works in this instance. If members of the list agree with my
> understanding, I can update and submit diffs of the tutorial, which
> still uses old-style Jamfiles for both extensions and embedding.
> To build an extension, you use the extension rule and include the
> extension template (<template>@boost/libs/python/build/extension, where
> @boost is defined in the Jamrules file to point at the boost source
> tree) in the list of sources. This will build two shared libraries in
> the bin directory, libboost_python.so and your extension. The template
> checks for updates to the Boost.Python source and automatically
> rebuilds.
> To build an embedded application, we will use the exe rule and an
> embedding template defined below. This template should get added to
> libs/python/build/Jamfile in the Boost sources.
>
> template embedded
> : <lib>boost_python #embedded needs static library, not dynamic
Actually, using the dynamic library is fine, and probably neccessary
if you want to do the extending/embedding thing where some extension
modules you want to use are separately linked shared objects.
> : <sysinclude>../../.. #boost headers
this ties you to a particular relative location w.r.t Boost.
Much better to write:
<sysinclude>@boost
which puts the root path of the Boost project right there... oh, I see
later on that you seem to be putting this in python.jam, so a relative
path isn't so bad. I still think project-relative is better.
> $(BOOST_PYTHON_V2_PROPERTIES) #Python include/linking dirs
That's wrong; it includes, among other things,
<define>BOOST_PYTHON_DYNAMIC_LIB, which conflicts with the fact that
you happen to be using the static library. Looking at
libs/python/test/Jamfile I think $(PYTHON_PROPERTIES) is what you want
here. Why don't you just use that as your example?
> <find-library>$(PYTHON_EMBEDDED_LIBRARY) #libpython
OK.
> <find-library>pthread #needed for my system
OK, I guess. Ought to be handled by python.jam I think.
> ;
>
> This template is used exactly as the extension template, for example in
> the Jamfile:
> exe embedded_test
> : embedded_test.cpp
> <template>@boost/libs/python/build/embedded
> ;
> This will build libboost_python.a (a static library) and your
> executable, again checking for updates in the Boost.Python source tree.
>
> Okay, some notes: I needed to add the <find-library>pthread on my
> system (RH9, gcc 3.2.2, Python 2.2.2). If this isn't only observed on
> my system, it should probably be added to the definition of
> $(PYTHON_EMBEDDED_LIBRARY) in tools/build/v1/python.jam
Right.
> The tutorial (both the extending and embedding examples) uses Jamfiles
> with lots of other stuff that (at best) doesn't appear to be necessary
> and (at medium) is confusing to the reader and (at worst) doesn't work
> anymore. I volunteer to update the tutorial on this point.
Graciously accepted!
> Are diffs to the CVS version submitted to this list the appropriate
> way to do this?
Yep.
> Some questions: If I've got several separate programs (either
> extending, or embedding) using this technique, then each one has their
> own version of libboost_python.[a|so] which seems rather wasteful. Is
> there a recommended way to use a libboost_python.[a|so] in a fixed
> location? That is, please provide a Jamfile entry to do this.
I don't understand the question. You can link to the shared
boost_python by substituting <dll>boost_python for <lib>boost_python.
> When building all of boost (that is, running bjam in $(BOOST_ROOT) ) it
> makes several versions (compiler/threading/debug) of the libraries (not
> just Boost.Python) and (optionally) installs them to a given location.
> Could the extension and embedded templates be reworked to link against
> these versions of libboost_python
I think so, but then they won't update the Boost.Python library
automatically when its sources change.
> so that (as requested above) there is only one source of the library
> to link against?
I'm not sure what "there is only one source..." means
> How might this be done? Thanks very much for your
> patience reading this long message. -- - Graeme Lufkin
> gwl at u.washington.edu "This sentence contains exactly threee erors."
--
Dave Abrahams
Boost Consulting
http://www.boost-consulting.com
More information about the Cplusplus-sig
mailing list