Bug 1423809 - Fixup dist/bin/Tupfile generation; r=nalexander draft
authorMike Shal <mshal@mozilla.com>
Fri, 08 Dec 2017 14:37:30 -0500
changeset 710985 b177fb99316fdf8c332dd972bc3e1426fb7190b6
parent 710984 3a0735f3afc1dd19582a1fcd5ab68c8f13c95768
child 743710 f011076f3e14fd4374a3531cb069b7803dcf0ede
push id92960
push userbmo:mshal@mozilla.com
push dateTue, 12 Dec 2017 22:51:36 +0000
reviewersnalexander
bugs1423809, 1416891
milestone59.0a1
Bug 1423809 - Fixup dist/bin/Tupfile generation; r=nalexander Bug 1416891 introduced a line in moz.build that uses LOCALIZED_FILES['..'], which ended up created a BackendTupfile object for 'dist/bin/browser/../Tupfile' separate from the BackendTupfile object for 'dist/bin/Tupfile'. Since both objects write to the same file, the one with a '..' in the path ended up clobbering the original one. This patch makes two small changes, either of which would be sufficient to fix the problem. First, we only get the backend file in _process_final_target_files() when we actually use it (the LOCALIZED_FILES in this case goes through the else case). Second, we now call normpath in _get_backend_file() to ensure things like '..' are resolved so that any future cases of 'Tupfile' and 'foo/../Tupfile' end up pointing to the same object. MozReview-Commit-ID: KDGBdtQ18lK
python/mozbuild/mozbuild/backend/tup.py
--- a/python/mozbuild/mozbuild/backend/tup.py
+++ b/python/mozbuild/mozbuild/backend/tup.py
@@ -185,17 +185,17 @@ class TupOnly(CommonBackend, PartialBack
         )
 
         # These are 'group' dependencies - All rules that list these as an output
         # will be built before any rules that list this as an input.
         self._installed_idls = '$(MOZ_OBJ_ROOT)/<installed-idls>'
         self._installed_files = '$(MOZ_OBJ_ROOT)/<installed-files>'
 
     def _get_backend_file(self, relobjdir):
-        objdir = mozpath.join(self.environment.topobjdir, relobjdir)
+        objdir = mozpath.normpath(mozpath.join(self.environment.topobjdir, relobjdir))
         if objdir not in self._backend_files:
             self._backend_files[objdir] = \
                     BackendTupfile(objdir, self.environment,
                                    self.environment.topsrcdir, self.environment.topobjdir)
         return self._backend_files[objdir]
 
     def _get_backend_file_for(self, obj):
         return self._get_backend_file(obj.relobjdir)
@@ -380,19 +380,19 @@ class TupOnly(CommonBackend, PartialBack
                 raise Exception("Cannot install to " + target)
 
         if target.startswith('_tests'):
             # TODO: TEST_HARNESS_FILES present a few challenges for the tup
             # backend (bug 1372381).
             return
 
         for path, files in obj.files.walk():
-            backend_file = self._get_backend_file(mozpath.join(target, path))
             for f in files:
                 if not isinstance(f, ObjDirPath):
+                    backend_file = self._get_backend_file(mozpath.join(target, path))
                     if '*' in f:
                         if f.startswith('/') or isinstance(f, AbsolutePath):
                             basepath, wild = os.path.split(f.full_path)
                             if '*' in basepath:
                                 raise Exception("Wildcards are only supported in the filename part of "
                                                 "srcdir-relative or absolute paths.")
 
                             # TODO: This is only needed for Windows, so we can