summaryrefslogtreecommitdiff
path: root/var
diff options
context:
space:
mode:
authorHarmen Stoppels <harmenstoppels@gmail.com>2021-09-28 00:38:14 +0200
committerGitHub <noreply@github.com>2021-09-27 18:38:14 -0400
commit87450f3688d5d4799bb08526f82061ab4b9cb944 (patch)
tree48e8cfdd4021028bf1800148ba1b80678f33c479 /var
parentc0da0d83ff0f377dc622503127bc1f4c686ac52c (diff)
downloadspack-87450f3688d5d4799bb08526f82061ab4b9cb944.tar.gz
spack-87450f3688d5d4799bb08526f82061ab4b9cb944.tar.bz2
spack-87450f3688d5d4799bb08526f82061ab4b9cb944.tar.xz
spack-87450f3688d5d4799bb08526f82061ab4b9cb944.zip
Use gnuconfig package for config file replacement (#26035)
* Use gnuconfig package for config file replacement Currently the autotools build system tries to pick up config.sub and config.guess files from the system (in /usr/share) on arm and power. This is introduces an implicit system dependency which we can avoid by distributing config.guess and config.sub files in a separate package, such as the new `gnuconfig` package which is very lightweight/text only (unlike automake where we previously pulled these files from as a backup). This PR adds `gnuconfig` as an unconditional build dependency for arm and power archs. In case the user needs a system version of config.sub and config.guess, they are free to mark `gnuconfig` as an external package with the prefix pointing to the directory containing the config files: ```yaml gnuconfig: externals: - spec: gnuconfig@master prefix: /tmp/tmp.ooBlkyAKdw/lol buildable: false ``` Apart from that, this PR gives some better instructions for users when replacing config files goes wrong. * Mock needs this package too now, because autotools adds a depends_on * Add documentation * Make patch_config_files a prop, fix the docs, add integrations tests * Make macOS happy
Diffstat (limited to 'var')
-rw-r--r--var/spack/repos/builtin.mock/packages/autotools-config-replacement/package.py88
-rw-r--r--var/spack/repos/builtin.mock/packages/gnuconfig/package.py35
2 files changed, 123 insertions, 0 deletions
diff --git a/var/spack/repos/builtin.mock/packages/autotools-config-replacement/package.py b/var/spack/repos/builtin.mock/packages/autotools-config-replacement/package.py
new file mode 100644
index 0000000000..dbf8f8f6e6
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/autotools-config-replacement/package.py
@@ -0,0 +1,88 @@
+# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+import os
+
+from spack import *
+
+
+class AutotoolsConfigReplacement(AutotoolsPackage):
+ """
+ This package features broken and working config.sub and config.guess files,
+ that should be replaced by the ones provided by gnuconfig. It allows testing
+ with / without patches and with / without substitutes available.
+ """
+
+ has_code = False
+
+ version('1.0.0')
+ variant('patch_config_files', default=False)
+ variant('gnuconfig', default=False)
+
+ depends_on('gnuconfig', type='build', when='+gnuconfig')
+
+ @property
+ def patch_config_files(self):
+ return self.spec.satisfies('+patch_config_files')
+
+ def autoreconf(self, spec, prefix):
+ pass
+
+ def configure(self, spec, prefix):
+ pass
+
+ def build(self, spec, prefix):
+ pass
+
+ def install(self, spec, prefix):
+ broken = os.path.join(self.stage.source_path, 'broken')
+ working = os.path.join(self.stage.source_path, 'working')
+ install_tree(broken, self.prefix.broken)
+ install_tree(working, self.prefix.working)
+
+ @run_before('autoreconf')
+ def create_the_package_sources(self):
+ # Creates the following file structure:
+ # ./broken/config.sub -- not executable
+ # ./broken/config.guess -- exectuable & exit code 1
+ # ./working/config.sub -- executable & exit code 0
+ # ./working/config.guess -- executable & exit code 0
+ # Automatic config helper script substitution should replace the two
+ # broken scripts with those from the gnuconfig package.
+
+ broken = os.path.join(self.stage.source_path, 'broken')
+ working = os.path.join(self.stage.source_path, 'working')
+
+ mkdirp(broken)
+ mkdirp(working)
+
+ # a configure script is required
+ configure_script = join_path(self.stage.source_path, 'configure')
+ with open(configure_script, 'w') as f:
+ f.write("#!/bin/sh\nexit 0")
+ os.chmod(configure_script, 0o775)
+
+ # broken config.sub (not executable)
+ broken_config_sub = join_path(broken, 'config.sub')
+ with open(broken_config_sub, 'w') as f:
+ f.write("#!/bin/sh\nexit 0")
+
+ # broken config.guess (exectuable but with error return code)
+ broken_config_guess = join_path(broken, 'config.guess')
+ with open(broken_config_guess, 'w') as f:
+ f.write("#!/bin/sh\nexit 1")
+ os.chmod(broken_config_guess, 0o775)
+
+ # working config.sub
+ working_config_sub = join_path(working, 'config.sub')
+ with open(working_config_sub, 'w') as f:
+ f.write("#!/bin/sh\nexit 0")
+ os.chmod(working_config_sub, 0o775)
+
+ # working config.guess
+ working_config_guess = join_path(working, 'config.guess')
+ with open(working_config_guess, 'w') as f:
+ f.write("#!/bin/sh\nexit 0")
+ os.chmod(working_config_guess, 0o775)
diff --git a/var/spack/repos/builtin.mock/packages/gnuconfig/package.py b/var/spack/repos/builtin.mock/packages/gnuconfig/package.py
new file mode 100644
index 0000000000..b2aedb6940
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/gnuconfig/package.py
@@ -0,0 +1,35 @@
+# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+import os
+
+from spack import *
+
+
+class Gnuconfig(Package):
+ """
+ The GNU config.guess and config.sub scripts versioned by timestamp.
+ This package can be used as a build dependency for autotools packages that
+ ship a tarball with outdated config.guess and config.sub files.
+ """
+
+ has_code = False
+
+ version('2021-08-14')
+
+ def install(self, spec, prefix):
+ config_sub = join_path(prefix, 'config.sub')
+ config_guess = join_path(prefix, 'config.guess')
+
+ # Create files
+ with open(config_sub, 'w') as f:
+ f.write("#!/bin/sh\necho gnuconfig version of config.sub")
+
+ with open(config_guess, 'w') as f:
+ f.write("#!/bin/sh\necho gnuconfig version of config.guess")
+
+ # Make executable
+ os.chmod(config_sub, 0o775)
+ os.chmod(config_guess, 0o775)