[Scons-users] SCons is only installing .lib part of SharedLibrary on Windows when target is specified
Dan Pidcock
dan.pidcock at googlemail.com
Wed Feb 6 12:21:20 EST 2013
On 6 February 2013 16:59, Dan Pidcock <dan.pidcock at googlemail.com> wrote:
> On 1 February 2013 17:58, Gary Oberbrunner <garyo at oberbrunner.com> wrote:
>> On Fri, Feb 1, 2013 at 11:28 AM, Dan Pidcock <dan.pidcock at googlemail.com>
>> wrote:
>>> On 1 February 2013 15:33, Gary Oberbrunner <garyo at oberbrunner.com> wrote:
>>> > On Fri, Feb 1, 2013 at 10:24 AM, Dan Pidcock
>>> > <dan.pidcock at googlemail.com>
>>> > wrote:
>>> >>
>>> >> However, looking through the --taskmastertrace output did show that
>>> >> the DLL wasn't even being considered when just the application was
>>> >> being built, but the .lib was being considered.
>>> >
>>> >
>>> > This is correct behavior -- you don't need the .dll to link the .exe.
>>> > Your
>>> > Install should pick up both, however, and I think it is.
>>> > You're using Default(), which tells SCons what to build if you don't
>>> > specify
>>> > any targets on the cmd line. In your run 1, though, you do specify a
>>> > target
>>> > (your exe) -- so it builds only what's needed to build that target.
>>> >
>>> > Maybe what you want is Alias('all', ...) instead of Default(), and then
>>> > say
>>> > Default(Alias('all')) to build all by default?
>>>
>>> I think I understand: Currently what I have tells SCons to install the
>>> library when no target is specified, but when I specify a target I
>>> still need to tell it to install the library?
>>
>>
>> Correct. SCons will only build what it's told to. Default() is only used
>> when no command-line targets are specified. And further, if there's no
>> Default(), everything under the current dir is built.
>>>
>>>
>>> How do I do the latter?
>>>
>>> I tried:
>>> Alias('all', sampleApplicationEnv.Install(binDir, sampleApplication))
>>> Default(Alias('all'))
>>> in the application SConscript
>>> and:
>>> Alias('all', sampleLibraryEnv.Install(binDir, sampleLibrary))
>>> Default(Alias('all'))
>>> in the library SConscript
>>> but that also only installed the .lib and not the .dll
>>
>>
>> That should have worked. Print out sampleLibraryEnv.Install(binDir,
>> sampleLibrary)) and see if it's a list containing your dll.
>> Do the printing like this:
>> stuff=sampleLibraryEnv.Install(binDir, sampleLibrary))
>> print [str(x) for x in stuff]
>> because the elements of the list are Nodes, and you need to print their
>> string representations. If your DLL is in that list, then it should get
>> into the alias, and thence into the default (which of course is only used if
>> you don't specify a target).
>
> Gary,
>
> Thanks for the input. The DLL is in the list but it doesn't get into
> the list of targets.
>
> When I run SCons with default target, the list of targets passed to
> the taskmaster includes the dll and the lib, in both the build and the
> bin areas. When I run with the application as a target, that is the
> only target (as expected), the taskmaster foes down the targets and
> resolves:
> build/app/app.exe is a child of the app target
> bin/lib.lib is a child of build/app/app.exe
> (bin/lib.lib is therefore built in build and installed in bin)
> build/lib/lib.lib is a child of bin/lib.lib
> build/lib/lib.dll is a child of build/lib/lib.lib
> (build/lib.lib and build/lib.dll are therfore built)
> However, nowhere does it decide that bin/lib.dll is a child of
> anything so it never installs it.
>
> I am now wondering if we are trying to push scons in a direction it
> was never intended to be used. We have a build directory and a binary
> directory.
> Applications are set up with a LIBPATH pointing at the binary
> directory (because the build directory includes the library name so
> cannot be used for this).
> Each library/application installs itself from the build directory to
> the binary directory so there need only be one directory on the path.
> (one concern that strikes me with this approach is controlling build
> order may be problematic as it is critical to install libraries before
> building anything that depends on those libraries)
>
> I think we need to use some of the approaches in
> http://stackoverflow.com/questions/11571577/scons-libraries-and-sub-libraries
> instead of the above to allow SCons to find the libraries that it
> needs to build from so will give that a try...
Worth emphasising is that our variant_directory is different for each
library/app to avoid name clashes. It seems that is not the mindset
behind SCons.
More information about the Scons-users
mailing list