diff options
author | William Deegan <bill@baddogconsulting.com> | 2020-08-31 18:51:55 (GMT) |
---|---|---|
committer | William Deegan <bill@baddogconsulting.com> | 2020-08-31 18:51:55 (GMT) |
commit | e1604ea37594031fa5440bd9ba8d33d712ee63a0 (patch) | |
tree | 41bcef1ae22c69a1c043b21a258cb8f0f8edcc3a | |
parent | b366af5f4518839fc03809c1d0ac5a3e470562ca (diff) | |
download | SCons-e1604ea37594031fa5440bd9ba8d33d712ee63a0.zip SCons-e1604ea37594031fa5440bd9ba8d33d712ee63a0.tar.gz SCons-e1604ea37594031fa5440bd9ba8d33d712ee63a0.tar.bz2 |
refactor cleanup. circular import issues resolved by moving isolated imports into the few functions they are used in rather than globally in the module
-rw-r--r-- | SCons/Defaults.py | 3 | ||||
-rw-r--r-- | SCons/Tool/FortranCommon.py | 6 | ||||
-rw-r--r-- | SCons/Tool/aixlink.py | 9 | ||||
-rw-r--r-- | SCons/Tool/applelink.py | 4 | ||||
-rw-r--r-- | SCons/Tool/cxx.py | 5 | ||||
-rw-r--r-- | SCons/Tool/cyglink.py | 9 | ||||
-rw-r--r-- | SCons/Tool/gnulink.py | 11 | ||||
-rw-r--r-- | SCons/Tool/hplink.py | 5 | ||||
-rw-r--r-- | SCons/Tool/ilink.py | 4 | ||||
-rw-r--r-- | SCons/Tool/linkCommon/README.md | 56 | ||||
-rw-r--r-- | SCons/Tool/linkCommon/__init__.py | 9 | ||||
-rw-r--r-- | SCons/Tool/mslink.py | 3 | ||||
-rw-r--r-- | SCons/Tool/sgilink.py | 3 | ||||
-rw-r--r-- | SCons/Tool/sunlink.py | 6 |
14 files changed, 76 insertions, 57 deletions
diff --git a/SCons/Defaults.py b/SCons/Defaults.py index b3f6d1d..c23d564 100644 --- a/SCons/Defaults.py +++ b/SCons/Defaults.py @@ -10,8 +10,6 @@ from distutils.msvccompiler. """ # -# __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 @@ -31,7 +29,6 @@ from distutils.msvccompiler. # 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 os diff --git a/SCons/Tool/FortranCommon.py b/SCons/Tool/FortranCommon.py index bfa1c1c..f8d9fdc 100644 --- a/SCons/Tool/FortranCommon.py +++ b/SCons/Tool/FortranCommon.py @@ -5,8 +5,6 @@ Stuff for processing Fortran, common to all fortran dialects. """ # -# __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 @@ -26,13 +24,11 @@ Stuff for processing Fortran, common to all fortran dialects. # 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 re import os.path import SCons.Action -import SCons.Defaults import SCons.Scanner.Fortran import SCons.Tool import SCons.Util @@ -78,10 +74,12 @@ def _fortranEmitter(target, source, env): return (target, source) def FortranEmitter(target, source, env): + import SCons.Defaults target, source = _fortranEmitter(target, source, env) return SCons.Defaults.StaticObjectEmitter(target, source, env) def ShFortranEmitter(target, source, env): + import SCons.Defaults target, source = _fortranEmitter(target, source, env) return SCons.Defaults.SharedObjectEmitter(target, source, env) diff --git a/SCons/Tool/aixlink.py b/SCons/Tool/aixlink.py index fed4342..dc0de2a 100644 --- a/SCons/Tool/aixlink.py +++ b/SCons/Tool/aixlink.py @@ -8,8 +8,6 @@ selection method. """ # -# __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 @@ -30,8 +28,6 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" - import os import os.path @@ -42,7 +38,6 @@ from . import link import SCons.Tool.cxx cplusplus = SCons.Tool.cxx -#cplusplus = __import__('cxx', globals(), locals(), []) def smart_linkflags(source, target, env, for_signature): @@ -52,6 +47,7 @@ def smart_linkflags(source, target, env, for_signature): return '-qtempinc=' + os.path.join(build_dir, 'tempinc') return '' + def generate(env): """ Add Builders and construction variables for Visual Age linker to @@ -64,12 +60,13 @@ def generate(env): env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -qmkshrobj -qsuppress=1501-218') env['SHLIBSUFFIX'] = '.a' + def exists(env): # TODO: sync with link.smart_link() to choose a linker linkers = { 'CXX': ['aixc++'], 'CC': ['aixcc'] } alltools = [] for langvar, linktools in linkers.items(): - if langvar in env: # use CC over CXX when user specified CC but not CXX + if langvar in env: # use CC over CXX when user specified CC but not CXX return SCons.Tool.FindTool(linktools, env) alltools.extend(linktools) return SCons.Tool.FindTool(alltools, env) diff --git a/SCons/Tool/applelink.py b/SCons/Tool/applelink.py index 9463308..f51a6af 100644 --- a/SCons/Tool/applelink.py +++ b/SCons/Tool/applelink.py @@ -9,8 +9,6 @@ selection method. """ # -# __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 @@ -31,8 +29,6 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" - import SCons.Tool.linkCommon import SCons.Util diff --git a/SCons/Tool/cxx.py b/SCons/Tool/cxx.py index 430851c..128cdc4 100644 --- a/SCons/Tool/cxx.py +++ b/SCons/Tool/cxx.py @@ -8,8 +8,6 @@ selection method. """ # -# __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 @@ -30,11 +28,8 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" - import os.path -import SCons.Tool import SCons.Defaults import SCons.Util diff --git a/SCons/Tool/cyglink.py b/SCons/Tool/cyglink.py index fd8c1fd..e85797b 100644 --- a/SCons/Tool/cyglink.py +++ b/SCons/Tool/cyglink.py @@ -12,14 +12,13 @@ import re import os import SCons.Action -import SCons.Tool.linkCommon +import SCons.Tool.linkCommon as linkCommon from SCons.Tool.linkCommon import ImpLibSymlinkGenerator, StringizeLibSymlinks, EmitLibSymlinks, ImpLibPrefixGenerator, \ ImpLibSuffixGenerator, ImpLibNameGenerator import SCons.Util import SCons.Tool from . import gnulink -from . import link def _lib_generator(target, source, env, for_signature, **kw): @@ -157,7 +156,7 @@ def _versioned_lib_suffix(env, suffix, version): def _versioned_implib_name(env, libnode, version, prefix, suffix, **kw): - return SCons.Tool.linkCommon._versioned_lib_name(env, libnode, version, prefix, suffix, + return linkCommon._versioned_lib_name(env, libnode, version, prefix, suffix, ImpLibPrefixGenerator, ImpLibSuffixGenerator, implib_libtype=kw['libtype']) @@ -231,8 +230,8 @@ def generate(env): 'VersionedShLibSuffix': _versioned_lib_suffix, 'VersionedLdModSuffix': _versioned_lib_suffix, 'VersionedImpLibSuffix': _versioned_lib_suffix, - 'VersionedShLibName': SCons.Tool.linkCommon._versioned_shlib_name, - 'VersionedLdModName': SCons.Tool.linkCommon._versioned_ldmod_name, + 'VersionedShLibName': linkCommon._versioned_shlib_name, + 'VersionedLdModName': linkCommon._versioned_ldmod_name, 'VersionedShLibImpLibName': lambda *args: _versioned_implib_name(*args, libtype='ShLib'), 'VersionedLdModImpLibName': lambda *args: _versioned_implib_name(*args, libtype='LdMod'), 'VersionedShLibImpLibSymlinks': lambda *args: _versioned_implib_symlinks(*args, libtype='ShLib'), diff --git a/SCons/Tool/gnulink.py b/SCons/Tool/gnulink.py index 51932da..2b09549 100644 --- a/SCons/Tool/gnulink.py +++ b/SCons/Tool/gnulink.py @@ -9,8 +9,6 @@ selection method. """ # -# __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 @@ -31,7 +29,6 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" import SCons.Tool.linkCommon import SCons.Util @@ -39,6 +36,7 @@ import SCons.Tool import sys from . import link +import SCons.Tool.linkCommon as linkCommon def generate(env): @@ -56,11 +54,8 @@ def generate(env): # OpenBSD doesn't usually use SONAME for libraries use_soname = not sys.platform.startswith('openbsd') - SCons.Tool.linkCommon._setup_versioned_lib_variables(env, tool='gnulink', use_soname=use_soname) - env['LINKCALLBACKS'] = SCons.Tool.linkCommon._versioned_lib_callbacks() - - # # For backward-compatibility with older SCons versions - # env['SHLIBVERSIONFLAGS'] = SCons.Util.CLVar('') + linkCommon._setup_versioned_lib_variables(env, tool='gnulink', use_soname=use_soname) + env['LINKCALLBACKS'] = linkCommon._versioned_lib_callbacks() def exists(env): diff --git a/SCons/Tool/hplink.py b/SCons/Tool/hplink.py index 10ef30b..ba182f1 100644 --- a/SCons/Tool/hplink.py +++ b/SCons/Tool/hplink.py @@ -8,8 +8,6 @@ selection method. """ # -# __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 @@ -30,9 +28,6 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" - -import os import os.path import SCons.Util diff --git a/SCons/Tool/ilink.py b/SCons/Tool/ilink.py index aa6bcaa..4112825 100644 --- a/SCons/Tool/ilink.py +++ b/SCons/Tool/ilink.py @@ -9,8 +9,6 @@ selection method. """ # -# __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 @@ -31,8 +29,6 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" - import SCons.Defaults import SCons.Tool import SCons.Util diff --git a/SCons/Tool/linkCommon/README.md b/SCons/Tool/linkCommon/README.md new file mode 100644 index 0000000..26bc9a5 --- /dev/null +++ b/SCons/Tool/linkCommon/README.md @@ -0,0 +1,56 @@ + + +# Versioned Shared Library and Loadable modules requirements + +The following env variables can affect the command line and created files for these + +* `SHLIBVERSION` +* `SONAME` +* `SOVERSION` +* `APPLELINK_NO_CURRENT_VERSION` (applelink only) +* `APPLELINK_CURRENT_VERSION` (applelink only) +* `APPLELINK_COMPATIBILITY_VERSION` (applelink only) + +In most cases the linker will create a file named as + +`${SHLIBPREFIX}lib_name${SHLIBVERSION}${SHLIBSUFFIX}` + +Which will have a soname baked into it as one of the + +* `${SONAME}` +* `${SHLIBPREFIX}lib_name${SOVERSION}${SHLIBSUFFIX}` +* (for applelink only) + * `${SHLIBPREFIX}lib_name${major version only from SHLIBVERSION}${SHLIBSUFFIX}` + * `-Wl,-compatibility_version,%s` + * `-Wl,-current_version,%s` + +For **applelink** the version has to follow these rules to verify that the version # is valid. + +* For version # = X[.Y[.Z]] +* where X 0-65535 +* where Y either not specified or 0-255 +* where Z either not specified or 0-255 + + + +For most platforms this will lead to a series of symlinks eventually pointing to the actual shared library (or loadable module file). +1. `${SHLIBPREFIX}lib_name${SHLIBSUFFIX} -> ${SHLIBPREFIX}lib_name${SHLIBVERSION}${SHLIBSUFFIX}` +1. `${SHLIBPREFIX}lib_name${SOVERSION}${SHLIBSUFFIX} -> ${SHLIBPREFIX}lib_name${SHLIBVERSION}${SHLIBSUFFIX}` + +For **openbsd** the following rules for symlinks apply + + * OpenBSD uses x.y shared library versioning numbering convention and doesn't use symlinks to backwards-compatible libraries + + +The current code provides the following hooks a compiler can use to customize: + +``` + 'VersionedShLibSuffix': _versioned_lib_suffix, + 'VersionedLdModSuffix': _versioned_lib_suffix, + 'VersionedShLibSymlinks': _versioned_shlib_symlinks, + 'VersionedLdModSymlinks': _versioned_ldmod_symlinks, + 'VersionedShLibName': _versioned_shlib_name, + 'VersionedLdModName': _versioned_ldmod_name, + 'VersionedShLibSoname': _versioned_shlib_soname, + 'VersionedLdModSoname': _versioned_ldmod_soname, +```
\ No newline at end of file diff --git a/SCons/Tool/linkCommon/__init__.py b/SCons/Tool/linkCommon/__init__.py index c3ccd7a..c787e0c 100644 --- a/SCons/Tool/linkCommon/__init__.py +++ b/SCons/Tool/linkCommon/__init__.py @@ -30,8 +30,6 @@ from typing import Callable import SCons.Util import SCons.Warnings from SCons.Tool.DCommon import isD -from SCons.Tool.FortranCommon import isfortran -from SCons.Tool.cxx import iscplusplus from SCons.Util import is_List @@ -512,8 +510,11 @@ def _call_env_subst(env, string, *args, **kw): def smart_link(source, target, env, for_signature): - has_cplusplus = iscplusplus(source) - has_fortran = isfortran(env, source) + import SCons.Tool.cxx + import SCons.Tool.fortran + + has_cplusplus = SCons.Tool.cxx.iscplusplus(source) + has_fortran = SCons.Tool.fortran.isfortran(env, source) has_d = isD(env, source) if has_cplusplus and has_fortran and not has_d: global issued_mixed_link_warning diff --git a/SCons/Tool/mslink.py b/SCons/Tool/mslink.py index bab78d8..8fd7922 100644 --- a/SCons/Tool/mslink.py +++ b/SCons/Tool/mslink.py @@ -9,8 +9,6 @@ selection method. """ # -# __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 @@ -30,7 +28,6 @@ selection method. # 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 os import os.path diff --git a/SCons/Tool/sgilink.py b/SCons/Tool/sgilink.py index b1e7921..e92c7b9 100644 --- a/SCons/Tool/sgilink.py +++ b/SCons/Tool/sgilink.py @@ -9,8 +9,6 @@ selection method. """ # -# __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 @@ -31,7 +29,6 @@ selection method. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" import SCons.Util diff --git a/SCons/Tool/sunlink.py b/SCons/Tool/sunlink.py index c33ba5a..f668903 100644 --- a/SCons/Tool/sunlink.py +++ b/SCons/Tool/sunlink.py @@ -30,7 +30,7 @@ selection method. import os.path -import SCons.Tool.linkCommon +import SCons.Tool.linkCommon as linkCommon import SCons.Util from . import link @@ -63,12 +63,12 @@ def generate(env): env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}' # Support for versioned libraries - SCons.Tool.linkCommon._setup_versioned_lib_variables(env, tool ='sunlink', use_soname=True) + linkCommon._setup_versioned_lib_variables(env, tool='sunlink', use_soname=True) env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS -h $_SHLIBSONAME' env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS -h $_LDMODULESONAME' - env['LINKCALLBACKS'] = SCons.Tool.linkCommon._versioned_lib_callbacks() + env['LINKCALLBACKS'] = linkCommon._versioned_lib_callbacks() def exists(env): return ccLinker |