mirror of
https://github.com/Relintai/scons_gd.git
synced 2025-03-14 18:48:58 +01:00
159 lines
7.6 KiB
Python
159 lines
7.6 KiB
Python
|
#!/usr/bin/env python
|
||
|
#
|
||
|
# __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 sys
|
||
|
import re
|
||
|
|
||
|
import TestSCons
|
||
|
|
||
|
_python_ = TestSCons._python_
|
||
|
_exe = TestSCons._exe
|
||
|
|
||
|
test = TestSCons.TestSCons()
|
||
|
|
||
|
# Test issue # 2580
|
||
|
test.dir_fixture('applelink_image')
|
||
|
test.run(arguments='-f SConstruct_gh2580 -Q -n', stdout='gcc -o foo.o -c -Fframeworks foo.c\n')
|
||
|
|
||
|
# Now test combinations of SHLIBVERSION, APPLELINK_CURRENT_VERSION, APPLELINK_COMPATIBILITY_VERSION
|
||
|
|
||
|
if sys.platform == 'darwin':
|
||
|
extra_flags = ''
|
||
|
else:
|
||
|
extra_flags = ' -n '
|
||
|
|
||
|
for SHLIBVERSION, APPLELINK_CURRENT_VERSION, APPLELINK_COMPATIBILITY_VERSION, should_error in [
|
||
|
('1.2.3', '', '', False),
|
||
|
('1.2.3', '9.9.9', '9.9.0', False),
|
||
|
('99999.2.3', '', '', 'AppleLinkInvalidCurrentVersionException'),
|
||
|
('1.2.3', '9.9.999', '9.9.0', 'AppleLinkInvalidCurrentVersionException'),
|
||
|
('1.2.3', '9.9.9', '9.999.0', 'AppleLinkInvalidCompatibilityVersionException'),
|
||
|
('1.2.3', '9.9.9', '99999.99.0', 'AppleLinkInvalidCompatibilityVersionException'),
|
||
|
]:
|
||
|
if not APPLELINK_CURRENT_VERSION:
|
||
|
APPLELINK_CURRENT_VERSION = SHLIBVERSION
|
||
|
if not APPLELINK_COMPATIBILITY_VERSION:
|
||
|
APPLELINK_COMPATIBILITY_VERSION = '.'.join(APPLELINK_CURRENT_VERSION.split('.', 2)[:2] + ['0'])
|
||
|
|
||
|
if not should_error:
|
||
|
expected_stdout = r"^.+ -dynamiclib -Wl,-current_version,{APPLELINK_CURRENT_VERSION} -Wl,-compatibility_version,{APPLELINK_COMPATIBILITY_VERSION}.+".format(
|
||
|
**locals())
|
||
|
expected_stderr = None
|
||
|
expected_status = 0
|
||
|
else:
|
||
|
expected_stdout = None
|
||
|
expected_stderr = r"^.+{should_error}.+".format(**locals())
|
||
|
expected_status = 2
|
||
|
|
||
|
test.run(
|
||
|
arguments='{extra_flags} -f SConstruct_CurVers_CompatVers SHLIBVERSION={SHLIBVERSION} APPLELINK_CURRENT_VERSION={APPLELINK_CURRENT_VERSION} APPLELINK_COMPATIBILITY_VERSION={APPLELINK_COMPATIBILITY_VERSION}'.format(
|
||
|
**locals()),
|
||
|
stdout=expected_stdout,
|
||
|
stderr=expected_stderr,
|
||
|
match=TestSCons.match_re_dotall,
|
||
|
status=expected_status)
|
||
|
|
||
|
if not (should_error or extra_flags):
|
||
|
# Now run otool -L to get the compat and current version info and verify it's correct in the library.
|
||
|
# We expect output such as this
|
||
|
# libfoo.1.2.3.dylib:
|
||
|
# > libfoo.1.2.3.dylib (compatibility version 1.1.99, current version 9.9.9)
|
||
|
# > /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)
|
||
|
# otool_output = "libfoo.{SHLIBVERSION}.dylib:\n\tlibfoo.{SHLIBVERSION}.dylib (compatibility version {APPLELINK_COMPATIBILITY_VERSION}, current version {APPLELINK_CURRENT_VERSION})\n\t/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)\n".format(
|
||
|
# **locals())
|
||
|
otool_output = "libfoo.{SHLIBVERSION}.dylib:\n\tlibfoo.{SHLIBVERSION}.dylib (compatibility version {APPLELINK_COMPATIBILITY_VERSION}, current version {APPLELINK_CURRENT_VERSION})\n\t/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version REPLACEME)\n".format(**locals())
|
||
|
otool_output = re.escape(otool_output)
|
||
|
otool_output = otool_output.replace('REPLACEME',r'\d+\.\d+\.\d+')
|
||
|
|
||
|
|
||
|
test.run(program='/usr/bin/otool', arguments='-L libfoo.%s.dylib' % SHLIBVERSION, stdout=otool_output, match=TestSCons.match_re_dotall)
|
||
|
|
||
|
# Now test that None in APPLELINK_CURRENT_VERSION or APPLELINK_COMPATIBILITY_VERSION will skip
|
||
|
# generating their relevant linker command line flag.
|
||
|
for SHLIBVERSION, \
|
||
|
APPLELINK_CURRENT_VERSION, APPLELINK_COMPATIBILITY_VERSION, \
|
||
|
APPLELINK_NO_CURRENT_VERSION, APPLELINK_NO_COMPATIBILITY_VERSION in [
|
||
|
('1.2.3', 0, 0, 0, 1),
|
||
|
('1.2.3', 0, 0, 1, 0),
|
||
|
('1.2.3', 0, 0, 1, 1),
|
||
|
|
||
|
]:
|
||
|
|
||
|
if not APPLELINK_CURRENT_VERSION:
|
||
|
APPLELINK_CURRENT_VERSION = SHLIBVERSION
|
||
|
if not APPLELINK_COMPATIBILITY_VERSION:
|
||
|
APPLELINK_COMPATIBILITY_VERSION = '.'.join(APPLELINK_CURRENT_VERSION.split('.', 2)[:2] + ['0'])
|
||
|
|
||
|
test.run(
|
||
|
arguments='{extra_flags} -f SConstruct_CurVers_CompatVers SHLIBVERSION={SHLIBVERSION} '
|
||
|
'APPLELINK_CURRENT_VERSION={APPLELINK_CURRENT_VERSION} '
|
||
|
'APPLELINK_COMPATIBILITY_VERSION={APPLELINK_COMPATIBILITY_VERSION} '
|
||
|
'APPLELINK_NO_CURRENT_VERSION={APPLELINK_NO_CURRENT_VERSION} '
|
||
|
'APPLELINK_NO_COMPATIBILITY_VERSION={APPLELINK_NO_COMPATIBILITY_VERSION} '.format(
|
||
|
**locals()))
|
||
|
|
||
|
if APPLELINK_NO_CURRENT_VERSION:
|
||
|
# Should not contain -Wl,-current_version
|
||
|
test.must_not_contain_lines(test.stdout(),
|
||
|
['-Wl,-current_version'])
|
||
|
else:
|
||
|
# Should contain -Wl,-current_version,{APPLELINK_CURRENT_VERSION}
|
||
|
test.must_contain_all_lines(test.stdout(),
|
||
|
['-Wl,-current_version,{APPLELINK_CURRENT_VERSION}'.format(**locals()), 'libfoo.4.dynlib'])
|
||
|
|
||
|
if APPLELINK_NO_COMPATIBILITY_VERSION:
|
||
|
# Should not contain -Wl,-compatibility_version
|
||
|
test.must_not_contain_lines(test.stdout(),
|
||
|
['-Wl,-compatibility_version'])
|
||
|
else:
|
||
|
# Should contain -Wl,-compatibility_version,{APPLELINK_COMPATIBILITY_VERSION}
|
||
|
test.must_contain_all_lines(test.stdout(),
|
||
|
['-Wl,-compatibility_version,{APPLELINK_COMPATIBILITY_VERSION}'.format(**locals()), 'libfoo.4.dynlib'])
|
||
|
|
||
|
if not extra_flags:
|
||
|
# Now run otool -L to get the compat and current version info and verify it's correct in the library.
|
||
|
# We expect output such as this
|
||
|
# libfoo.1.2.3.dylib:
|
||
|
# > libfoo.1.2.3.dylib (compatibility version 1.1.99, current version 9.9.9)
|
||
|
# > /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version #.#.#)
|
||
|
if APPLELINK_NO_CURRENT_VERSION:
|
||
|
APPLELINK_CURRENT_VERSION = '0.0.0'
|
||
|
if APPLELINK_NO_COMPATIBILITY_VERSION:
|
||
|
APPLELINK_COMPATIBILITY_VERSION = '0.0.0'
|
||
|
otool_output = "libfoo.{SHLIBVERSION}.dylib:\n\tlibfoo.{SHLIBVERSION}.dylib (compatibility version {APPLELINK_COMPATIBILITY_VERSION}, current version {APPLELINK_CURRENT_VERSION})\n\t/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version REPLACEME)\n".format(
|
||
|
**locals())
|
||
|
otool_output = re.escape(otool_output).replace('REPLACEME',r'\d+\.\d+\.\d+')
|
||
|
|
||
|
test.run(program='/usr/bin/otool', arguments='-L libfoo.%s.dylib' % SHLIBVERSION, stdout=otool_output, match=TestSCons.match_re_dotall)
|
||
|
|
||
|
test.pass_test()
|
||
|
|
||
|
# Local Variables:
|
||
|
# tab-width:4
|
||
|
# indent-tabs-mode:nil
|
||
|
# End:
|
||
|
# vim: set expandtab tabstop=4 shiftwidth=4:
|