diff options
author | Russel Winder <russel@winder.org.uk> | 2014-04-24 11:16:44 (GMT) |
---|---|---|
committer | Russel Winder <russel@winder.org.uk> | 2014-04-24 11:16:44 (GMT) |
commit | 39ef5817b09766f7381cfa19d6775d05fbb5902f (patch) | |
tree | 93a4cf92d73f6ea9f40f961ddb77e1064664426c | |
parent | 1da3ba42c01c41d85c33a5025068e09c4e97219c (diff) | |
download | SCons-39ef5817b09766f7381cfa19d6775d05fbb5902f.zip SCons-39ef5817b09766f7381cfa19d6775d05fbb5902f.tar.gz SCons-39ef5817b09766f7381cfa19d6775d05fbb5902f.tar.bz2 |
Fix Issue 2940, generating the wrong rpath flags for DMD and LDC.
18 files changed, 276 insertions, 11 deletions
diff --git a/src/engine/SCons/Platform/posix.py b/src/engine/SCons/Platform/posix.py index 2e21e5a..7e69a7c 100644 --- a/src/engine/SCons/Platform/posix.py +++ b/src/engine/SCons/Platform/posix.py @@ -113,6 +113,10 @@ def generate(env): # This platform supports RPATH specifications. env['__RPATH'] = '$_RPATH' + # GDC is GCC family, but DMD and LDC have different options. + # Must be able to have GCC and DMD work in the same build, so: + env['__DRPATH'] = '$_DRPATH' + # Local Variables: # tab-width:4 # indent-tabs-mode:nil diff --git a/src/engine/SCons/Tool/dmd.py b/src/engine/SCons/Tool/dmd.py index 4279184..f1afc79 100644 --- a/src/engine/SCons/Tool/dmd.py +++ b/src/engine/SCons/Tool/dmd.py @@ -112,15 +112,14 @@ def generate(env): env['DLINK'] = '$DC' env['DLINKFLAGS'] = SCons.Util.CLVar('') - env['DLINKCOM'] = '$DLINK -of$TARGET $DLINKFLAGS $__RPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS' + env['DLINKCOM'] = '$DLINK -of$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS' env['DSHLINK'] = '$DC' env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=libphobos2.so') - env['SHDLINKCOM'] = '$DLINK -of$TARGET $DSHLINKFLAGS $__RPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS' + env['SHDLINKCOM'] = '$DLINK -of$TARGET $DSHLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS' env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l' env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else '' - #env['_DLIBFLAGS'] = '$( ${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' env['_DLIBFLAGS'] = '${_stripixes(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}' env['DLIBDIRPREFIX'] = '-L-L' @@ -136,6 +135,12 @@ def generate(env): env['DLIBFLAGPREFIX'] = '-' env['DLIBFLAGSUFFIX'] = '' + # __RPATH is set to $_RPATH in the platform specification if that + # platform supports it. + env['DRPATHPREFIX'] = '-L-rpath=' + env['DRPATHSUFFIX'] = '' + env['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}' + SCons.Tool.createStaticLibBuilder(env) diff --git a/src/engine/SCons/Tool/dmd.xml b/src/engine/SCons/Tool/dmd.xml index b42791e..65ef75c 100644 --- a/src/engine/SCons/Tool/dmd.xml +++ b/src/engine/SCons/Tool/dmd.xml @@ -21,7 +21,7 @@ See its __doc__ string for a discussion of the format. <sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd"> + xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0/scons.xsd"> <tool name="dmd"> <summary> @@ -51,7 +51,7 @@ Sets construction variables for D language compiler DMD. <item>DDEBUGSUFFIX</item> <item>DFLAGPREFIX</item> <item>DFLAGSUFFIX</item> -<item>DFLESUFFIX</item> +<item>DFILESUFFIX</item> <item>DLINK</item> <item>DLINKFLAGS</item> <item>DLINKCOM</item> @@ -66,8 +66,12 @@ Sets construction variables for D language compiler DMD. <item>_DLIBDIRFLAGS</item> <item>DLIB</item> <item>DLIBCOM</item> +<item>_DLIBFLAGS</item> <item>DLIBFLAGPREFIX</item> <item>DLIBFLAGSUFFIX</item> +<item>RPATHPREFIX</item> +<item>RPATHSUFFIX</item> +<item>_RPATH</item> </sets> <uses> </uses> diff --git a/src/engine/SCons/Tool/gdc.xml b/src/engine/SCons/Tool/gdc.xml index 818c7d2..df568b4 100644 --- a/src/engine/SCons/Tool/gdc.xml +++ b/src/engine/SCons/Tool/gdc.xml @@ -21,7 +21,7 @@ See its __doc__ string for a discussion of the format. <sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0/scons.xsd scons.xsd"> + xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0/scons.xsd"> <tool name="gdc"> <summary> @@ -51,7 +51,7 @@ Sets construction variables for the D language compiler GDC. <item>DDEBUGSUFFIX</item> <item>DFLAGPREFIX</item> <item>DFLAGSUFFIX</item> -<item>DFLESUFFIX</item> +<item>DFILESUFFIX</item> <item>DLINK</item> <item>DLINKFLAGS</item> <item>DLINKCOM</item> @@ -72,3 +72,5 @@ Sets construction variables for the D language compiler GDC. <uses> </uses> </tool> + +</sconsdoc> diff --git a/src/engine/SCons/Tool/ldc.py b/src/engine/SCons/Tool/ldc.py index 2531064..ca873b5 100644 --- a/src/engine/SCons/Tool/ldc.py +++ b/src/engine/SCons/Tool/ldc.py @@ -100,11 +100,11 @@ def generate(env): env['DLINK'] = '$DC' env['DLINKFLAGS'] = SCons.Util.CLVar('') - env['DLINKCOM'] = '$DLINK -of=$TARGET $DLINKFLAGS $__RPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS' + env['DLINKCOM'] = '$DLINK -of=$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS' env['DSHLINK'] = '$DC' env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared') - env['SHDLINKCOM'] = '$DLINK -of=$TARGET $DSHLINKFLAGS $__RPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS' + env['SHDLINKCOM'] = '$DLINK -of=$TARGET $DSHLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS' env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l' env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else '' @@ -124,6 +124,12 @@ def generate(env): env['DLIBFLAGPREFIX'] = '-' env['DLIBFLAGSUFFIX'] = '' + # __RPATH is set to $_RPATH in the platform specification if that + # platform supports it. + env['DRPATHPREFIX'] = '-L-rpath=' + env['DRPATHSUFFIX'] = '' + env['_RPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}' + SCons.Tool.createStaticLibBuilder(env) diff --git a/src/engine/SCons/Tool/ldc.xml b/src/engine/SCons/Tool/ldc.xml index cfa38a9..18f676d 100644 --- a/src/engine/SCons/Tool/ldc.xml +++ b/src/engine/SCons/Tool/ldc.xml @@ -21,7 +21,7 @@ See its __doc__ string for a discussion of the format. <sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd"> + xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0/scons.xsd"> <tool name="ldc"> <summary> @@ -51,7 +51,7 @@ Sets construction variables for the D language compiler LDC2. <item>DDEBUGSUFFIX</item> <item>DFLAGPREFIX</item> <item>DFLAGSUFFIX</item> -<item>DFLESUFFIX</item> +<item>DFILESUFFIX</item> <item>DLINK</item> <item>DLINKFLAGS</item> <item>DLINKCOM</item> @@ -66,8 +66,14 @@ Sets construction variables for the D language compiler LDC2. <item>_DLIBDIRFLAGS</item> <item>DLIB</item> <item>DLIBCOM</item> +<item>_DLIBFLAGS</item> <item>DLIBFLAGPREFIX</item> <item>DLIBFLAGSUFFIX</item> +<item>DLINKFLAGPREFIX</item> +<item>DLINKFLAGSUFFIX</item> +<item>RPATHPREFIX</item> +<item>RPATHSUFFIX</item> +<item>_RPATH</item> </sets> <uses> </uses> diff --git a/test/D/Issues/2940_Ariovistus/Common/__init__.py b/test/D/Issues/2940_Ariovistus/Common/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/D/Issues/2940_Ariovistus/Common/__init__.py diff --git a/test/D/Issues/2940_Ariovistus/Common/correctLinkOptions.py b/test/D/Issues/2940_Ariovistus/Common/correctLinkOptions.py new file mode 100644 index 0000000..3b178b9 --- /dev/null +++ b/test/D/Issues/2940_Ariovistus/Common/correctLinkOptions.py @@ -0,0 +1,62 @@ +""" +These tests check a problem with the linker options setting. +""" + +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +import TestSCons + +from SCons.Environment import Base + +from os.path import abspath, dirname, join + +import sys +sys.path.insert(1, abspath(dirname(__file__) + '/../../../Support')) + +from executablesSearch import isExecutableOfToolAvailable + +def testForTool(tool): + + test = TestSCons.TestSCons() + + if not isExecutableOfToolAvailable(test, tool) : + test.skip_test("Required executable for tool '{}' not found, skipping test.\n".format(tool)) + + test.dir_fixture('Project') + test.write('SConstruct', open('SConstruct_template', 'r').read().format('tools=["{}", "link"]'.format(tool))) + + test.run() + + for f in ('libstuff.so', 'stuff.os', 'test1', 'test1.o', 'test2', 'test2.o'): + test.must_exist(test.workpath(join('test', 'test1', f))) + + test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/D/Issues/2940_Ariovistus/Common/sconstest.skip b/test/D/Issues/2940_Ariovistus/Common/sconstest.skip new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/D/Issues/2940_Ariovistus/Common/sconstest.skip diff --git a/test/D/Issues/2940_Ariovistus/Project/SConstruct_template b/test/D/Issues/2940_Ariovistus/Project/SConstruct_template new file mode 100644 index 0000000..55f02aa --- /dev/null +++ b/test/D/Issues/2940_Ariovistus/Project/SConstruct_template @@ -0,0 +1,9 @@ +from os.path import join + +environment = Environment({}) + +Export('environment') + +environment.SConscript([ + join("test","test1", "SConscript"), +]); diff --git a/test/D/Issues/2940_Ariovistus/Project/test/test1/SConscript b/test/D/Issues/2940_Ariovistus/Project/test/test1/SConscript new file mode 100644 index 0000000..45e517a --- /dev/null +++ b/test/D/Issues/2940_Ariovistus/Project/test/test1/SConscript @@ -0,0 +1,16 @@ +Import('environment') + +env = Environment() +env.SharedLibrary(target='stuff', source=['stuff.cpp']) + +env = Environment() +env.Append(LIBPATH=['.']) +env.Append(LIBS=['stuff']) +env.Append(RPATH=['.']) +env.Program(target='test1', source=['test1.cpp']) + +env = environment.Clone() +env.Append(LIBPATH=['.']) +env.Append(LIBS=['stuff']) +env.Append(RPATH=['.']) +env.Program(target='test2', source=['test2.d']) diff --git a/test/D/Issues/2940_Ariovistus/Project/test/test1/stuff.cpp b/test/D/Issues/2940_Ariovistus/Project/test/test1/stuff.cpp new file mode 100644 index 0000000..2970549 --- /dev/null +++ b/test/D/Issues/2940_Ariovistus/Project/test/test1/stuff.cpp @@ -0,0 +1,12 @@ +#include "stuff.h" + +X::X() { + this->i = 1; +} +int X::y(){ + return this->i; +} + +X *SomeX() { + return new X(); +} diff --git a/test/D/Issues/2940_Ariovistus/Project/test/test1/stuff.h b/test/D/Issues/2940_Ariovistus/Project/test/test1/stuff.h new file mode 100644 index 0000000..863c330 --- /dev/null +++ b/test/D/Issues/2940_Ariovistus/Project/test/test1/stuff.h @@ -0,0 +1,10 @@ + +class X { + public: + int i; + + X(); + int y(); +}; + +X *SomeX(); diff --git a/test/D/Issues/2940_Ariovistus/Project/test/test1/test1.cpp b/test/D/Issues/2940_Ariovistus/Project/test/test1/test1.cpp new file mode 100644 index 0000000..f4d7208 --- /dev/null +++ b/test/D/Issues/2940_Ariovistus/Project/test/test1/test1.cpp @@ -0,0 +1,5 @@ +#include "stuff.h" + +int main() { + X *x = SomeX(); +} diff --git a/test/D/Issues/2940_Ariovistus/Project/test/test1/test2.d b/test/D/Issues/2940_Ariovistus/Project/test/test1/test2.d new file mode 100644 index 0000000..4fbfa4d --- /dev/null +++ b/test/D/Issues/2940_Ariovistus/Project/test/test1/test2.d @@ -0,0 +1,13 @@ +import std.stdio; + +struct X { +} + +extern(C) int _ZN1X1yEv(X* _this); +extern(C) X* _Z5SomeXv(); + +void main() { + X *x = _Z5SomeXv(); + int i = _ZN1X1yEv(x); + writeln("i: ", i); +} diff --git a/test/D/Issues/2940_Ariovistus/sconstest-correctLinkOptions_dmd.py b/test/D/Issues/2940_Ariovistus/sconstest-correctLinkOptions_dmd.py new file mode 100644 index 0000000..2446a28 --- /dev/null +++ b/test/D/Issues/2940_Ariovistus/sconstest-correctLinkOptions_dmd.py @@ -0,0 +1,37 @@ +""" +Test compiling and executing using the gdc tool. +""" + +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +from Common.correctLinkOptions import testForTool +testForTool('dmd') + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/D/Issues/2940_Ariovistus/sconstest-correctLinkOptions_gdc.py b/test/D/Issues/2940_Ariovistus/sconstest-correctLinkOptions_gdc.py new file mode 100644 index 0000000..baf2921 --- /dev/null +++ b/test/D/Issues/2940_Ariovistus/sconstest-correctLinkOptions_gdc.py @@ -0,0 +1,37 @@ +""" +Test compiling and executing using the gdc tool. +""" + +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +from Common.correctLinkOptions import testForTool +testForTool('gdc') + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/test/D/Issues/2940_Ariovistus/sconstest-correctLinkOptions_ldc.py b/test/D/Issues/2940_Ariovistus/sconstest-correctLinkOptions_ldc.py new file mode 100644 index 0000000..a61a94b --- /dev/null +++ b/test/D/Issues/2940_Ariovistus/sconstest-correctLinkOptions_ldc.py @@ -0,0 +1,37 @@ +""" +Test compiling and executing using the gdc tool. +""" + +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +from Common.correctLinkOptions import testForTool +testForTool('ldc') + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: |