diff options
-rw-r--r-- | lib/spack/spack/bootstrap.py | 60 | ||||
-rw-r--r-- | lib/spack/spack/solver/asp.py | 9 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/clingo-bootstrap/package.py | 15 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/clingo/package.py | 15 |
4 files changed, 83 insertions, 16 deletions
diff --git a/lib/spack/spack/bootstrap.py b/lib/spack/spack/bootstrap.py index 52bd810e89..3d51ca931e 100644 --- a/lib/spack/spack/bootstrap.py +++ b/lib/spack/spack/bootstrap.py @@ -5,6 +5,13 @@ import contextlib import os import sys +try: + import sysconfig # novm +except ImportError: + # Not supported on Python 2.6 + pass + +import archspec.cpu import llnl.util.filesystem as fs import llnl.util.tty as tty @@ -20,17 +27,33 @@ import spack.util.executable from spack.util.environment import EnvironmentModifications +def spec_for_current_python(): + """For bootstrapping purposes we are just interested in the Python + minor version (all patches are ABI compatible with the same minor) + and on whether ucs4 support has been enabled for Python 2.7 + + See: + https://www.python.org/dev/peps/pep-0513/ + https://stackoverflow.com/a/35801395/771663 + """ + version_str = '.'.join(str(x) for x in sys.version_info[:2]) + variant_str = '' + if sys.version_info[0] == 2 and sys.version_info[1] == 7: + unicode_size = sysconfig.get_config_var('Py_UNICODE_SIZE') + variant_str = '+ucs4' if unicode_size == 4 else '~ucs4' + + spec_fmt = 'python@{0} {1}' + return spec_fmt.format(version_str, variant_str) + + @contextlib.contextmanager def spack_python_interpreter(): """Override the current configuration to set the interpreter under which Spack is currently running as the only Python external spec available. """ - python_cls = type(spack.spec.Spec('python').package) python_prefix = os.path.dirname(os.path.dirname(sys.executable)) - externals = python_cls.determine_spec_details( - python_prefix, [os.path.basename(sys.executable)]) - external_python = externals[0] + external_python = spec_for_current_python() entry = { 'buildable': False, @@ -60,9 +83,10 @@ def make_module_available(module, spec=None, install=False): # We can constrain by a shortened version in place of a version range # because this spec is only used for querying or as a placeholder to be # replaced by an external that already has a concrete version. This syntax - # is not suffucient when concretizing without an external, as it will + # is not sufficient when concretizing without an external, as it will # concretize to python@X.Y instead of python@X.Y.Z - spec.constrain('^python@%d.%d' % sys.version_info[:2]) + python_requirement = '^' + spec_for_current_python() + spec.constrain(python_requirement) installed_specs = spack.store.db.query(spec, installed=True) for ispec in installed_specs: @@ -197,3 +221,27 @@ def ensure_bootstrap_configuration(): with spack.store.use_store(spack.paths.user_bootstrap_store): with spack_python_interpreter(): yield + + +def clingo_root_spec(): + # Construct the root spec that will be used to bootstrap clingo + spec_str = 'clingo-bootstrap@spack+python' + + # Add a proper compiler hint to the root spec. We use GCC for + # everything but MacOS. + if str(spack.architecture.platform()) == 'darwin': + spec_str += ' %apple-clang' + else: + spec_str += ' %gcc' + + # Add hint to use frontend operating system on Cray + if str(spack.architecture.platform()) == 'cray': + spec_str += ' os=fe' + + # Add the generic target + generic_target = archspec.cpu.host().family + spec_str += ' target={0}'.format(str(generic_target)) + + tty.debug('[BOOTSTRAP ROOT SPEC] clingo: {0}'.format(spec_str)) + + return spack.spec.Spec(spec_str) diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py index a663e3e274..15994b01ea 100644 --- a/lib/spack/spack/solver/asp.py +++ b/lib/spack/spack/solver/asp.py @@ -253,14 +253,11 @@ class PyclingoDriver(object): # TODO: Find a way to vendor the concrete spec # in a cross-platform way with spack.bootstrap.ensure_bootstrap_configuration(): - generic_target = archspec.cpu.host().family - spec_str = 'clingo-bootstrap@spack+python target={0}'.format( - str(generic_target) - ) - clingo_spec = spack.spec.Spec(spec_str) + clingo_spec = spack.bootstrap.clingo_root_spec() clingo_spec._old_concretize() spack.bootstrap.make_module_available( - 'clingo', spec=clingo_spec, install=True) + 'clingo', spec=clingo_spec, install=True + ) import clingo self.out = asp or llnl.util.lang.Devnull() self.cores = cores diff --git a/var/spack/repos/builtin/packages/clingo-bootstrap/package.py b/var/spack/repos/builtin/packages/clingo-bootstrap/package.py index 014ba12927..aeef40c4e1 100644 --- a/var/spack/repos/builtin/packages/clingo-bootstrap/package.py +++ b/var/spack/repos/builtin/packages/clingo-bootstrap/package.py @@ -9,6 +9,9 @@ import spack.compilers class ClingoBootstrap(Clingo): """Clingo with some options used for bootstrapping""" + + maintainers = ['alalazo'] + variant('build_type', default='Release', values=('Release',), description='CMake build type') @@ -41,6 +44,18 @@ class ClingoBootstrap(Clingo): # Clingo needs the Python module to be usable by Spack conflicts('~python', msg='Python support is required to bootstrap Spack') + @property + def cmake_py_shared(self): + return self.define('CLINGO_BUILD_PY_SHARED', 'OFF') + + def cmake_args(self): + args = super(ClingoBootstrap, self).cmake_args() + args.extend([ + # Avoid building the clingo executable + self.define('CLINGO_BUILD_APPS', 'OFF'), + ]) + return args + def setup_build_environment(self, env): if '%apple-clang platform=darwin' in self.spec: opts = '-mmacosx-version-min=10.13' diff --git a/var/spack/repos/builtin/packages/clingo/package.py b/var/spack/repos/builtin/packages/clingo/package.py index 7f43f4708b..84f3c37c27 100644 --- a/var/spack/repos/builtin/packages/clingo/package.py +++ b/var/spack/repos/builtin/packages/clingo/package.py @@ -21,7 +21,7 @@ class Clingo(CMakePackage): url = "https://github.com/potassco/clingo/archive/v5.2.2.tar.gz" git = 'https://github.com/potassco/clingo.git' - maintainers = ["tgamblin"] + maintainers = ["tgamblin", "alalazo"] version('master', branch='master', submodules=True, preferred=True) version('spack', commit='2a025667090d71b2c9dce60fe924feb6bde8f667', submodules=True) @@ -56,10 +56,17 @@ class Clingo(CMakePackage): """Return standard CMake defines to ensure that the current spec is the one found by CMake find_package(Python, ...) """ + python_spec = self.spec['python'] + include_dir = python_spec.package.get_python_inc() return [ - '-DPython_EXECUTABLE={0}'.format(str(self.spec['python'].command)) + self.define('Python_EXECUTABLE', str(python_spec.command)), + self.define('Python_INCLUDE_DIR', include_dir) ] + @property + def cmake_py_shared(self): + return self.define('CLINGO_BUILD_PY_SHARED', 'ON') + def cmake_args(self): try: self.compiler.cxx14_flag @@ -69,10 +76,10 @@ class Clingo(CMakePackage): args = [ '-DCLINGO_REQUIRE_PYTHON=ON', '-DCLINGO_BUILD_WITH_PYTHON=ON', - '-DCLINGO_BUILD_PY_SHARED=ON', '-DPYCLINGO_USER_INSTALL=OFF', '-DPYCLINGO_USE_INSTALL_PREFIX=ON', - '-DCLINGO_BUILD_WITH_LUA=OFF' + '-DCLINGO_BUILD_WITH_LUA=OFF', + self.cmake_py_shared ] if self.spec['cmake'].satisfies('@3.16.0:'): args += self.cmake_python_hints |