diff options
| author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2019-07-24 09:57:09 +0200 | 
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2019-07-24 09:57:09 +0200 | 
| commit | c7665433b2004d2b404d6fb9d6fd064998486f63 (patch) | |
| tree | 8525ef6d24f7c6ceb238945ebb2cc997c7afc905 /src/engine/SCons/Tool/applelink.py | |
| parent | e48d2727885efda8369c7edbc2e3929a59532adc (diff) | |
| parent | 6e228c305122f0564eda1e67d56651f8386d24d7 (diff) | |
Merge branch 'release/debian/3.1.0+repack-1'debian/3.1.0+repack-1
Diffstat (limited to 'src/engine/SCons/Tool/applelink.py')
| -rw-r--r-- | src/engine/SCons/Tool/applelink.py | 155 | 
1 files changed, 147 insertions, 8 deletions
diff --git a/src/engine/SCons/Tool/applelink.py b/src/engine/SCons/Tool/applelink.py index 45f524c..011b29d 100644 --- a/src/engine/SCons/Tool/applelink.py +++ b/src/engine/SCons/Tool/applelink.py @@ -1,6 +1,6 @@  """SCons.Tool.applelink -Tool-specific initialization for the Apple gnu-like linker. +Tool-specific initialization for Apple's gnu-like linker.  There normally shouldn't be any need to import this module directly.  It will usually be imported through the generic SCons.Tool.Tool() @@ -9,7 +9,7 @@ selection method.  """  # -# Copyright (c) 2001 - 2017 The SCons Foundation +# Copyright (c) 2001 - 2019 The SCons Foundation  #  # Permission is hereby granted, free of charge, to any person obtaining  # a copy of this software and associated documentation files (the @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/applelink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" +__revision__ = "src/engine/SCons/Tool/applelink.py e724ae812eb96f4858a132f5b8c769724744faf6 2019-07-21 00:04:47 bdeegan"  import SCons.Util @@ -39,25 +39,162 @@ import SCons.Util  # the -rpath option, so we use the "link" tool instead of "gnulink".  from . import link + +class AppleLinkInvalidCurrentVersionException(Exception): +    pass + +class AppleLinkInvalidCompatibilityVersionException(Exception): +    pass + + +def _applelib_versioned_lib_suffix(env, suffix, version): +    """For suffix='.dylib' and version='0.1.2' it returns '.0.1.2.dylib'""" +    Verbose = False +    if Verbose: +        print("_applelib_versioned_lib_suffix: suffix={!r}".format(suffix)) +        print("_applelib_versioned_lib_suffix: version={!r}".format(version)) +    if version not in suffix: +        suffix = "." + version + suffix +    if Verbose: +        print("_applelib_versioned_lib_suffix: return suffix={!r}".format(suffix)) +    return suffix + + +def _applelib_versioned_lib_soname(env, libnode, version, prefix, suffix, name_func): +    """For libnode='/optional/dir/libfoo.X.Y.Z.dylib' it returns 'libfoo.X.dylib'""" +    Verbose = False +    if Verbose: +        print("_applelib_versioned_lib_soname: version={!r}".format(version)) +    name = name_func(env, libnode, version, prefix, suffix) +    if Verbose: +        print("_applelib_versioned_lib_soname: name={!r}".format(name)) +    major = version.split('.')[0] +    (libname,_suffix) = name.split('.') +    soname = '.'.join([libname, major, _suffix]) +    if Verbose: +        print("_applelib_versioned_lib_soname: soname={!r}".format(soname)) +    return soname + +def _applelib_versioned_shlib_soname(env, libnode, version, prefix, suffix): +    return _applelib_versioned_lib_soname(env, libnode, version, prefix, suffix, link._versioned_shlib_name) + + +# User programmatically describes how SHLIBVERSION maps to values for compat/current. +_applelib_max_version_values = (65535, 255, 255) +def _applelib_check_valid_version(version_string): +    """ +    Check that the version # is valid. +    X[.Y[.Z]] +    where X 0-65535 +    where Y either not specified or 0-255 +    where Z either not specified or 0-255 +    :param version_string: +    :return: +    """ +    parts = version_string.split('.') +    if len(parts) > 3: +        return False, "Version string has too many periods [%s]"%version_string +    if len(parts) <= 0: +        return False, "Version string unspecified [%s]"%version_string + +    for (i, p) in enumerate(parts): +        try: +            p_i = int(p) +        except ValueError: +            return False, "Version component %s (from %s) is not a number"%(p, version_string) +        if p_i < 0 or p_i > _applelib_max_version_values[i]: +            return False, "Version component %s (from %s) is not valid value should be between 0 and %d"%(p, version_string, _applelib_max_version_values[i]) + +    return True, "" + + +def _applelib_currentVersionFromSoVersion(source, target, env, for_signature): +    """ +    A generator function to create the -Wl,-current_version flag if needed. +    If env['APPLELINK_NO_CURRENT_VERSION'] contains a true value no flag will be generated +    Otherwise if APPLELINK_CURRENT_VERSION is not specified, env['SHLIBVERSION'] +    will be used. + +    :param source: +    :param target: +    :param env: +    :param for_signature: +    :return: A string providing the flag to specify the current_version of the shared library +    """ +    if env.get('APPLELINK_NO_CURRENT_VERSION', False): +        return "" +    elif env.get('APPLELINK_CURRENT_VERSION', False): +        version_string = env['APPLELINK_CURRENT_VERSION'] +    elif env.get('SHLIBVERSION', False): +        version_string = env['SHLIBVERSION'] +    else: +        return "" + +    version_string = ".".join(version_string.split('.')[:3]) + +    valid, reason = _applelib_check_valid_version(version_string) +    if not valid: +        raise AppleLinkInvalidCurrentVersionException(reason) + +    return "-Wl,-current_version,%s" % version_string + + +def _applelib_compatVersionFromSoVersion(source, target, env, for_signature): +    """ +    A generator function to create the -Wl,-compatibility_version flag if needed. +    If env['APPLELINK_NO_COMPATIBILITY_VERSION'] contains a true value no flag will be generated +    Otherwise if APPLELINK_COMPATIBILITY_VERSION is not specified +    the first two parts of env['SHLIBVERSION'] will be used with a .0 appended. + +    :param source: +    :param target: +    :param env: +    :param for_signature: +    :return: A string providing the flag to specify the compatibility_version of the shared library +    """ +    if env.get('APPLELINK_NO_COMPATIBILITY_VERSION', False): +        return "" +    elif env.get('APPLELINK_COMPATIBILITY_VERSION', False): +        version_string = env['APPLELINK_COMPATIBILITY_VERSION'] +    elif env.get('SHLIBVERSION', False): +        version_string = ".".join(env['SHLIBVERSION'].split('.')[:2] + ['0']) +    else: +        return "" + +    if version_string is None: +        return "" + +    valid, reason = _applelib_check_valid_version(version_string) +    if not valid: +        raise AppleLinkInvalidCompatibilityVersionException(reason) + +    return "-Wl,-compatibility_version,%s" % version_string + +  def generate(env):      """Add Builders and construction variables for applelink to an      Environment."""      link.generate(env)      env['FRAMEWORKPATHPREFIX'] = '-F' -    env['_FRAMEWORKPATH'] = '${_concat(FRAMEWORKPATHPREFIX, FRAMEWORKPATH, "", __env__)}' +    env['_FRAMEWORKPATH'] = '${_concat(FRAMEWORKPATHPREFIX, FRAMEWORKPATH, "", __env__, RDirs)}' +      env['_FRAMEWORKS'] = '${_concat("-framework ", FRAMEWORKS, "", __env__)}'      env['LINKCOM'] = env['LINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'      env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -dynamiclib')      env['SHLINKCOM'] = env['SHLINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS' -    # TODO: Work needed to generate versioned shared libraries -    # Leaving this commented out, and also going to disable versioned library checking for now      # see: http://docstore.mik.ua/orelly/unix3/mac/ch05_04.htm  for proper naming -    #link._setup_versioned_lib_variables(env, tool = 'applelink')#, use_soname = use_soname) -    #env['LINKCALLBACKS'] = link._versioned_lib_callbacks() +    link._setup_versioned_lib_variables(env, tool = 'applelink')#, use_soname = use_soname) +    env['LINKCALLBACKS'] = link._versioned_lib_callbacks() +    env['LINKCALLBACKS']['VersionedShLibSuffix'] = _applelib_versioned_lib_suffix +    env['LINKCALLBACKS']['VersionedShLibSoname'] = _applelib_versioned_shlib_soname +    env['_APPLELINK_CURRENT_VERSION'] = _applelib_currentVersionFromSoVersion +    env['_APPLELINK_COMPATIBILITY_VERSION'] = _applelib_compatVersionFromSoVersion +    env['_SHLIBVERSIONFLAGS'] = '$_APPLELINK_CURRENT_VERSION $_APPLELINK_COMPATIBILITY_VERSION ' +    env['_LDMODULEVERSIONFLAGS'] = '$_APPLELINK_CURRENT_VERSION $_APPLELINK_COMPATIBILITY_VERSION '      # override the default for loadable modules, which are different      # on OS X than dynamic shared libs.  echoing what XCode does for @@ -67,6 +204,8 @@ def generate(env):      env['LDMODULEFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -bundle')      env['LDMODULECOM'] = '$LDMODULE -o ${TARGET} $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS' +    env['__SHLIBVERSIONFLAGS'] = '${__libversionflags(__env__,"SHLIBVERSION","_SHLIBVERSIONFLAGS")}' +  def exists(env):  | 
