[Scons-users] Shared library in bin subdirectory
William Deegan
bill at baddogconsulting.com
Fri Dec 28 11:31:25 EST 2012
On 12/28/2012 12:04 AM, LRN wrote:
> -----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?
Builders always return a list. Sometimes the list has only one element,
but always a list.
You could define your Environment differently for each platform and
specify SHLIBSUFFIX and LIBSUFFIX appropriately.
Any reason you don't use the default .lib instead of .dll.a ?
>
>> (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.
Not sure why it's not obvious what the build dir is.
You specify it in the first argument of the builder...
>
> I i would prefer to stick with the explicit extension check.
>
>
Either way is fine.
-Bill
More information about the Scons-users
mailing list