[Scons-users] InstallVersionedLibrary sometimes fails when symlinking
Andrew C. Morrow
andrew.c.morrow at gmail.com
Fri May 24 16:36:23 EDT 2013
Well, the complete example I posted above was on OS X Mountain Lion. But
I'm experiencing the same problem on Linux. My first email with the strace
output was from Ubuntu 13.04.
On Fri, May 24, 2013 at 4:04 PM, Bill Deegan <bill at baddogconsulting.com>wrote:
> 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
>>
>>
>
> _______________________________________________
> 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/5112b8a4/attachment.htm
More information about the Scons-users
mailing list