[Scons-users] Shared library in bin subdirectory

LRN lrn1986 at gmail.com
Fri Dec 28 03:04:12 EST 2012


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 28.12.2012 11:32, William Deegan wrote:

> On 12/27/2012 11:26 PM, LRN wrote:

>>

>>>>>> Here's what i do:

>>>>>>

>>>>>> prefix = ARGUMENTS.get ('prefix', None) destdir =

>>>>>> ARGUMENTS.get ('destdir', None) if prefix == None: prefix

>>>>>> = '/usr/local'

>>>>>>

>>>>>> foo = env.SharedLibrary (target = "foo", source =

>>>>>> ["foo.c"], SHLIBPREFIX = 'lib', LIBSUFFIX='.dll.a') if

>>>>>> destdir is not None: destprefix = destdir + prefix

>>>>>> env.Install (os.path.join (destprefix, 'bin'), [foo])

>>>>>> env.Alias('install', destprefix)

>>>>>>

>>>>>> And when i do `scons prefix=/ destdir=c:/bar install', i

>>>>>> end up having libfoo.dll.a import library in c:/bar/bin/

>>>>>> directory instead of c:/bar/lib. How do i make

>>>>>> SharedLibrary or Install put the import library into /lib

>>>>>> subdirectory?

>>>>>>

>>>>> Here's your problem: env.Install (os.path.join

>>>>> (destprefix, 'bin'), [foo])

>>>>>

>>>>> Change 'bin' to 'lib'...

>>>> Thank you for your quick response.

>>>>

>>>> I've tried that, and it works - libfoo.dll.a is installed

>>>> into /lib subdir!

>>>>

>>>> However, a completely unrelated problem has cropped up: Now

>>>> when i do `scons prefix=/ destdir=c:/bar install', i end up

>>>> having libfoo.dll shared library in c:/bar/lib/ directory

>>>> instead of c:/bar/bin. How do i make SharedLibrary or Install

>>>> put the shared library into /bin subdirectory?

>>>>

>>> Any builder only specifies 1 target dir. If you want to have

>>> the output(s) go to more than one, then you'll have to use

>>> env.Install() to do so.

>>>

>> And how do i do that? According to the man,

>>> Installs one or more source files or directories in the

>>> specified target, which must be a directory. The names of the

>>> specified source files or directories remain the same within

>>> the destination directory. env.Install('/usr/local/bin', source

>>> = ['foo', 'bar'])

>> only one directory is passed to Install. And even if it accepted

>> two directories, i wouldn't want to have .dll and .dll.a in BOTH

>> /bin and /lib subdirs. So, how do i put .dll in /bin and .dll.a.

>> in /lib?

>

> All env.BLAH's return a list of Node's. so:

> libs=env.SharedLibrary('blah',[sources]) On windows will return a

> list with more than one Nodes. Now you could iterate through that

> list and get the file names and install the .dll one place and the

> .dll.a another place

Yeah, that worked! Thanks! I did:

foo = env.SharedLibrary (target = "foo", source = ["foo.c"],
SHLIBPREFIX = 'lib', LIBSUFFIX='.dll.a')
str_foo = {}
for x in foo:
str_foo[str(x)] = x

if destdir is not None:
destprefix = destdir + prefix
for s_x, x in str_foo.items ():
if s_x[-2:] == '.a':
env.Install (os.path.join (destprefix, 'lib'), x)
else:
env.Install (os.path.join (destprefix, 'bin'), x)

env.Alias('install', destprefix)


Now, the library is not supposed to build on anything that does not
provide W32API, and so, it not being portable, i don't have to worry
about SharedLibrary NOT returning a list, but i'm just curious: what
does SharedLibrary return when it builds only one .so file? Single
node? Or a list with one item? And how would i have to deal with that,
if the library was portable, and SConstruct would have had to work on
different OSes?


> (UGH.. you snipped the meat of the message.. please don't do

> that).

Uh, what?


> , or you could just tell SCons to install the .dll from the target

> dir of the SharedLibrary() to /bin and the .dll.a to /lib as such:

>

> foo = env.SharedLibrary (target = "foo", source = ["foo.c"],

> SHLIBPREFIX = 'lib', LIBSUFFIX='.dll.a')

> env.Install('/bin','libfoo.dll')

> env.Install('/lib','libfoo.dll.a')

>

> SCons will then connect the dots. (change the second arguments of

> the installs to match the directory you're building them into via

> your SharedLibrary().

...and for that i need to somehow know where the builddir is, and
where the .dll and .dll.a files end up, and how they are named. Ok,
the naming part should be obvious, since i did provide prefix and
suffix. But the rest is not so obvious.

I i would prefer to stick with the explicit extension check.

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (MingW32)
Comment: Using GnuPG with undefined - http://www.enigmail.net/

iQEcBAEBAgAGBQJQ3VJ8AAoJEOs4Jb6SI2CwmiMH/27mgaZLTOxdd9o4ucn1SBU5
Zkxb8RZBTuulLCoO6s7uoTNHhONHjU/nMi86ZTnPlwtQZClaUxj6x1OZko1BTm/Y
jphNGtNmyDSeoY5XkkDEL8BVBBVrIY9TSrcvbd3i1R6oHiP+OP5We7fN2WpOfYZJ
dZaJUSWHrm8QwCGpoSJdfLZZkbumd0mGVwB4zkp288aF4VjPqRVawmFwROk8cIIx
x1KU/NKqKATWTjFxrDEprahBtqYVkGibNUx6DIt5jMbOL89fDNJdaQ0GChCGQt0n
pQs0zvxwzeAN0S/rbyui0ca68T7yLULzN8LvwMIZInO0hfA3177TH1o1RmEbuXc=
=wwGn
-----END PGP SIGNATURE-----


More information about the Scons-users mailing list