]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Make build-many-glibcs.py re-exec itself if changed by checkout.
authorJoseph Myers <joseph@codesourcery.com>
Fri, 25 Nov 2016 00:58:22 +0000 (00:58 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 25 Nov 2016 00:58:22 +0000 (00:58 +0000)
Updating build-many-glibcs.py may result in changes to the default
versions of components, or to the set of components (if e.g. Hurd
support is added and that requires a new component).

It's desirable for the checkout process to leave a source tree that is
ready to use.  If the checkout updated the script itself, that means
it needs to be rerun to cause any new versions or components
referenced by the new script version to be properly checked out.  This
patch makes the script check if it was modified by the checkout
process, and re-exec itself (with the same arguments) if so.

* scripts/build-many-glibcs.py (Context.__init__): Save text of
script being executed.
(Context.get_script_text): New function.
(Context.exec_self): Likewise.
(Context.checkout): Re-exec script if changed by checkout process.

ChangeLog
scripts/build-many-glibcs.py

index c57a8927b31d1da5c28e05dfa3a5213562e2a712..9c5fdc8e5e7050f9ff121c16aa79f84a1615e9fc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2016-11-25  Joseph Myers  <joseph@codesourcery.com>
+
+       * scripts/build-many-glibcs.py (Context.__init__): Save text of
+       script being executed.
+       (Context.get_script_text): New function.
+       (Context.exec_self): Likewise.
+       (Context.checkout): Re-exec script if changed by checkout process.
+
 2016-11-24  Joseph Myers  <joseph@codesourcery.com>
 
        * math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)]
index 72f22a8471501f60fabc160d1766f404a14ec0f2..3099415c17a79130b5297d00099b74b9a8bbf5fc 100755 (executable)
@@ -61,6 +61,7 @@ class Context(object):
         self.makefile = os.path.join(self.builddir, 'Makefile')
         self.wrapper = os.path.join(self.builddir, 'wrapper')
         self.save_logs = os.path.join(self.builddir, 'save-logs')
+        self.script_text = self.get_script_text()
         if action != 'checkout':
             self.build_triplet = self.get_build_triplet()
             self.glibc_version = self.get_glibc_version()
@@ -70,6 +71,15 @@ class Context(object):
         self.add_all_configs()
         self.load_versions_json()
 
+    def get_script_text(self):
+        """Return the text of this script."""
+        with open(sys.argv[0], 'r') as f:
+            return f.read()
+
+    def exec_self(self):
+        """Re-execute this script with the same arguments."""
+        os.execv(sys.executable, [sys.executable] + sys.argv)
+
     def get_build_triplet(self):
         """Determine the build triplet with config.guess."""
         config_guess = os.path.join(self.component_srcdir('gcc'),
@@ -644,6 +654,10 @@ class Context(object):
                 self.checkout_tar(k, v, update)
                 revision = v
             self.set_component_version(k, v, explicit_versions[k], revision)
+        if self.get_script_text() != self.script_text:
+            # Rerun the checkout process in case the updated script
+            # uses different default versions or new components.
+            self.exec_self()
 
     def checkout_vcs(self, component, version, update):
         """Check out the given version of the given component from version