[Scons-users] InstallVersionedLibrary sometimes fails when symlinking

Bill Deegan bill at baddogconsulting.com
Fri May 24 16:04:47 EDT 2013


What platform are you on?

-Bill


On Fri, May 24, 2013 at 7:16 AM, Andrew C. Morrow <andrew.c.morrow at gmail.com

> wrote:



>

> Here is a complete example demonstrating the problem

>

> SConstruct:

>

> EnsureSConsVersion(2, 3, 0)

>

> AddOption('--prefix',

> dest='prefix',

> type='string',

> nargs=1,

> action='store',

> metavar='DIR',

> help='installation prefix')

>

> env = Environment(

> tools = ["default"],

> PREFIX = GetOption('prefix'))

>

> env.SConscript('src/SConscript', variant_dir='build', exports=['env'])

>

>

>

> src/SConscript:

>

> Import('env')

>

> sources = [

> 'foo.cpp',

> ]

>

> headers = [

> 'foo.hpp'

> ]

>

> sharedLibEnv = env.Clone(SHLIBVERSION='0.1.2')

> sharedLib = sharedLibEnv.SharedLibrary(

> target='foo',

> source=sources,

> )

>

> sharedLibEnv.InstallVersionedLib("$PREFIX/lib", sharedLib)

> sharedLibEnv.Install("$PREFIX/include", headers)

>

>

> src/foo.hpp:

>

> #include <iosfwd>

>

> namespace foo {

>

> void say_hello(std::ostream& stream);

>

> } // namespace foo

>

>

> src/foo.cpp:

>

> #include "foo.hpp"

>

> #include <ostream>

>

> namespace foo {

>

> void say_hello(std::ostream& stream) {

> stream << "Hello, World!\n";

> }

>

> } // namespace foo

>

>

>

> OK, so now build the 'install' target, specifying some prefix:

>

> scons --prefix=$(pwd)/install install

> scons: Reading SConscript files ...

> scons: done reading SConscript files.

> scons: Building targets ...

> Install file: "build/foo.hpp" as "install/include/foo.hpp"

> g++ -o build/foo.os -c -fPIC build/foo.cpp

> g++ -o build/libfoo.0.1.2.dylib -dynamiclib -current_version 0.1.2

> -compatibility_version 0.1.2 -undefined dynamic_lookup build/foo.os

> Install file: "build/libfoo.0.1.2.dylib" as

> "install/lib/libfoo.0.1.2.dylib"

> scons: done building targets.

>

> Now, make a trivial change to foo.cpp to force a relink (like change the

> string), and rebuild:

>

> scons --prefix=$(pwd)/install install

> scons: Reading SConscript files ...

> scons: done reading SConscript files.

> scons: Building targets ...

> g++ -o build/foo.os -c -fPIC build/foo.cpp

> g++ -o build/libfoo.0.1.2.dylib -dynamiclib -current_version 0.1.2

> -compatibility_version 0.1.2 -undefined dynamic_lookup build/foo.os

> Install file: "build/libfoo.0.1.2.dylib" as

> "install/lib/libfoo.0.1.2.dylib"

> scons: *** [install/lib/libfoo.0.1.2.dylib] File exists

> scons: building terminated because of errors.

>

> The build fails while trying to symlink.

>

> Thanks,

> Andrew

>

>

>

> On Thu, May 23, 2013 at 1:30 PM, Andrew C. Morrow <

> andrew.c.morrow at gmail.com> wrote:

>

>>

>> Hi -

>>

>> I've recently been experimenting with the new versioned shared library

>> support in SCons 2.3.0, which so far looks really nice, so thanks for that.

>>

>> I have, I think, found one issue, which is that it appears that if you

>>

>> - have used InstallVersionedLibrary and produced a target and symlink

>> chain in your install directory

>> - update a dependency such that the library is rebuilt

>> - reinstall

>>

>> The build fails while attempting to write the symlinks. For my build this

>> looks like:

>>

>> scons: done reading SConscript files.

>> scons: Building targets ...

>> Install file: "client_build/libfoo.so.2.3.4" as

>> "/dev/opt/lib/libfoo.so.2.3.4"

>> scons: *** [/dev/opt/lib/libfoo.so.2.3.4] File exists

>>

>> Running under strace, it is clear that the attempt to create the symlink

>> is failing because it already exists in the install directory.

>>

>> pid 22278] stat("client_build/libfoo.so.2.3.4", {st_mode=S_IFREG|0755,

>> st_size=20255704, ...}) = 0

>> [pid 22278] utimes("/dev/opt/lib/libfoo.so.2.3.4", {{1369328366, 0},

>> {1369328365, 0}}) = 0

>> [pid 22278] chmod("/dev/opt/lib/libfoo.so.2.3.4", 0755) = 0

>> [pid 22278] stat("client_build/libfoo.so.2.3.4", {st_mode=S_IFREG|0755,

>> st_size=20255704, ...}) = 0

>> [pid 22278] chmod("/dev/opt/lib/libfoo.so.2.3.4", 0755) = 0

>> [pid 22278] symlink("libfoo.so.2.3.4", "/dev/opt/lib/libfoo.so") = -1

>> EEXIST (File exists)

>>

>> I think the same thing can occur in the build directory as well. If I

>> remove client_build/libfoo.so.2.3.4 and rebuild, I get a similar error and

>> strace:

>>

>> scons: Building targets ...

>> generate_buildinfo(["build/buildinfo.cpp"], ['\n#include

>> <string>\n#include <boost/version.hpp>\n\n#include

>> "mongo/util/version.h"\n\nnamespace mongo {\n const char * gitVersion()

>> { return "%(git_version)s"; }\n const char * compiledJSEngine() { return

>> "%(js_engine)s"; }\n const char * allocator() { return "%(allocator)s";

>> }\n const char * loaderFlags() { return "%(loader_flags)s"; }\n const

>> char * compilerFlags() { return "%(compiler_flags)s"; }\n std::string

>> sysInfo() { return "%(sys_info)s BOOST_LIB_VERSION=" BOOST_LIB_VERSION ;

>> }\n} // namespace mongo\n'])

>> g++ <library-rebuild>

>> scons: *** [client_build/libfoo.so.2.3.4] File exists

>>

>> strace shows a similar EEXIST error in a call to symlink.

>>

>> Thanks,

>> Andrew

>>

>>

>

> _______________________________________________

> Scons-users mailing list

> Scons-users at scons.org

> http://four.pairlist.net/mailman/listinfo/scons-users

>

>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://four.pairlist.net/pipermail/scons-users/attachments/20130524/41e9dcd5/attachment.html


More information about the Scons-users mailing list