scons_gd/scons/test/LINK/applelink.py

159 lines
7.6 KiB
Python
Raw Normal View History

2022-10-15 16:06:26 +02:00
#!/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: