Boost logo

Boost-Build :

Subject: [Boost-build] Bug in searched libraries / target-os dependend names for searched libraries
From: Moritz Hassert (mhassert_at_[hidden])
Date: 2011-09-14 06:45:54


Hi all,

I'm facing a problem with external/searched libraries and conditional
properties, which I think is a bug. I'm using newest boost-build from svn
trunk.

I have a project with opengl on linux. So I need to link my binary against
libGL.so and libGLU.so on linux. I defined two lib targets and used them in my
exe target:

lib libGL : : <name>GL ;
lib libGLU : libGL : <name>GLU ;
exe foo : libGL libGLU ...

Now I want to build the project on windows too, where the dlls are called
opengl32.dll and glu32.dll. My straight-forward approach was to make the
<name> property conditional on <target-os> :

lib libGL : :
  <target-os>linux:<name>GL
  <target-os>windows:<name>opengl32 ;

lib libGLU : libGL :
  <target-os>linux:<name>GLU
  <target-os>windows:<name>glu32 ;

exe foo : libGL libGLU ...

However, this results in an error:

[...]/boost-build/kernel/class.jam:88: in new
*** argument error
* rule object(searched-lib-target)@667.__init__ ( name : project : shared ? :
search * : action )
* called with: ( GL libGL : object(project-target)@112 : true : :
object(null-action)@666 : : : : )
* extra argument libGL
[...]/boost-build/tools/builtin.jam:406:see definition of rule '__init__' being
called
[...]/boost-build/tools/builtin.jam:574: in searched-lib-generator.run
[...]/boost-build/tools/unix.jam:113: in object(unix-searched-lib-
generator)@24.run
[...]/boost-build/build/generators.jam:1004: in try-one-generator-really
[...]/boost-build/build/generators.jam:1066: in try-one-generator
[...]/boost-build/build/generators.jam:1282: in construct-really
[...]/boost-build/build/generators.jam:1366: in generators.construct
[...]/boost-build/tools/builtin.jam:477: in object(lib-generator)@5.run
[...]/boost-build/build/generators.jam:1004: in try-one-generator-really
[...]/boost-build/build/generators.jam:1066: in try-one-generator
[...]/boost-build/build/generators.jam:1282: in construct-really
[...]/boost-build/build/generators.jam:1366: in generators.construct
[...]/boost-build/build/targets.jam:1495: in construct
[...]/boost-build/build/targets.jam:1297: in object(typed-target)@116.generate
[...]/boost-build/build/targets.jam:732: in generate-really
[...]/boost-build/build/targets.jam:704: in object(main-target)@653.generate
[...]/boost-build/build/targets.jam:258: in object(project-
target)@112.generate
[...]/boost-build/build-system.jam:736: in load
[...]/boost-build/kernel/modules.jam:283: in import
[...]/boost-build/kernel/bootstrap.jam:142: in boost-build
[...]/boost-build/boost-build.jam:8: in module scope

It seems like both the value of <name> and the lib target name are used.
Perhaps the piece of code, that uses the target name as default when no <name>
is given gets somehow confused by the conditional property.

As a workaround I now use this:

lib libGLLinux : : <name>GL ;
lib libGLWindows : : <name>opengl32 ;
alias libGL : :
  <target-os>linux:<library>libGLLinux
  <target-os>windows:<library>libGLWindows ;
lib libGLU
    : libGL # depends on libGL
    : <target-os>linux:<name>GLU
      <target-os>windows:<name>glu32 ;

Suprisingly, I get no error for libGLU. But if I remove the dependency on
libGL, I get the above error for libGLU target, too.

Could someone please tell me whether I'm doing something wrong here or confirm
this is a bug? In the latter case I will file an separate bug report.

Thanks,
Moritz

-- 
--
AB+M GmbH 
Haid-und-Neu-Straße 7
76131 Karlsruhe
Telefon: (0721) 66488-0
Telefax: (0721) 66488-18
Geschaeftsfuehrer: Dipl.-Inform. Christopher Asp
Amtsgericht Mannheim HRB 105845
Geschaeftsfuehrer: Dipl.-Inform. Christopher Asp
Amtsgericht Mannheim HRB 105845

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