modules: store configure args during build (#11084)

This change stores packages' configure arguments during build and makes
use of them while refreshing module files. This fixes problems such as in
#10716.
This commit is contained in:
Michael Kuhn 2020-02-24 15:34:57 +01:00 committed by Todd Gamblin
parent 32a3d59bfa
commit 3753424a87
4 changed files with 41 additions and 11 deletions

View file

@ -463,6 +463,10 @@ def log(pkg):
# Archive the environment used for the build
install(pkg.env_path, pkg.install_env_path)
if os.path.exists(pkg.configure_args_path):
# Archive the args used for the build
install(pkg.configure_args_path, pkg.install_configure_args_path)
# Finally, archive files that are specific to each package
with working_dir(pkg.stage.path):
errors = six.StringIO()
@ -1013,6 +1017,18 @@ def build_process():
# Save the build environment in a file before building.
dump_environment(pkg.env_path)
for attr in ('configure_args', 'cmake_args'):
try:
configure_args = getattr(pkg, attr)()
configure_args = ' '.join(configure_args)
with open(pkg.configure_args_path, 'w') as args_file:
args_file.write(configure_args)
break
except Exception:
pass
# cache debug settings
debug_enabled = tty.is_debug()

View file

@ -623,16 +623,9 @@ def configure_options(self):
msg = 'unknown, software installed outside of Spack'
return msg
# This is quite simple right now, but contains information on how
# to call different build system classes.
for attr in ('configure_args', 'cmake_args'):
try:
configure_args = getattr(pkg, attr)()
return ' '.join(configure_args)
except (AttributeError, IOError, KeyError):
# The method doesn't exist in the current spec,
# or it's not usable
pass
if os.path.exists(pkg.install_configure_args_path):
with open(pkg.install_configure_args_path, 'r') as args_file:
return args_file.read()
# Returning a false-like value makes the default templates skip
# the configure option section

View file

@ -68,6 +68,9 @@
# Filename for the Spack build/install environment file.
_spack_build_envfile = 'spack-build-env.txt'
# Filename for the Spack configure args file.
_spack_configure_argsfile = 'spack-configure-args.txt'
class InstallPhase(object):
"""Manages a single phase of the installation.
@ -896,6 +899,18 @@ def install_log_path(self):
# Otherwise, return the current install log path name.
return os.path.join(install_path, _spack_build_logfile)
@property
def configure_args_path(self):
"""Return the configure args file path associated with staging."""
return os.path.join(self.stage.path, _spack_configure_argsfile)
@property
def install_configure_args_path(self):
"""Return the configure args file path on successful installation."""
install_path = spack.store.layout.metadata_path(self.spec)
return os.path.join(install_path, _spack_configure_argsfile)
def _make_fetcher(self):
# Construct a composite fetcher that always contains at least
# one element (the root package). In case there are resources

View file

@ -15,7 +15,8 @@
import spack.repo
import spack.store
from spack.spec import Spec
from spack.package import _spack_build_envfile, _spack_build_logfile
from spack.package import (_spack_build_envfile, _spack_build_logfile,
_spack_configure_argsfile)
def test_install_and_uninstall(install_mockery, mock_fetch, monkeypatch):
@ -410,6 +411,9 @@ def test_pkg_install_paths(install_mockery):
env_path = os.path.join(spec.prefix, '.spack', _spack_build_envfile)
assert spec.package.install_env_path == env_path
args_path = os.path.join(spec.prefix, '.spack', _spack_configure_argsfile)
assert spec.package.install_configure_args_path == args_path
# Backward compatibility checks
log_dir = os.path.dirname(log_path)
mkdirp(log_dir)
@ -448,6 +452,7 @@ def test_pkg_install_log(install_mockery):
with working_dir(log_dir):
touch(log_path)
touch(spec.package.env_path)
touch(spec.package.configure_args_path)
install_path = os.path.dirname(spec.package.install_log_path)
mkdirp(install_path)
@ -456,6 +461,7 @@ def test_pkg_install_log(install_mockery):
assert os.path.exists(spec.package.install_log_path)
assert os.path.exists(spec.package.install_env_path)
assert os.path.exists(spec.package.install_configure_args_path)
# Cleanup
shutil.rmtree(log_dir)