Title: [295543] trunk/Tools/CISupport/built-product-archive
Revision
295543
Author
e...@apple.com
Date
2022-06-14 15:51:38 -0700 (Tue, 14 Jun 2022)

Log Message

Refactor built-product-archive to avoid deleting build products
https://bugs.webkit.org/show_bug.cgi?id=241586

Reviewed by Jonathan Bedard.

Deleting build products interferes with subsequent incremental builds.
Change the script to filter out what gets added to the archive, instead
of deleting from the directory being archived.

On Darwin-based platforms, this is done with mkbom and ditto's --bom
option, and surfaced in createZip via an `excludePatterns` argument.

Additionally, clean up the top-level logic before calling into
createZip, so that it doesn't need to know about the --minify option.

* Tools/CISupport/built-product-archive:

Canonical link: https://commits.webkit.org/251548@main

Modified Paths

Diff

Modified: trunk/Tools/CISupport/built-product-archive (295542 => 295543)


--- trunk/Tools/CISupport/built-product-archive	2022-06-14 22:22:40 UTC (rev 295542)
+++ trunk/Tools/CISupport/built-product-archive	2022-06-14 22:51:38 UTC (rev 295543)
@@ -26,6 +26,7 @@
 
 from __future__ import print_function
 import errno
+import fnmatch
 import optparse
 import os
 import shutil
@@ -146,10 +147,8 @@
     command = ['/usr/bin/zip', '-j', archiveFile, pathToLauncher, pathToReadme]
     return subprocess.call(command)
 
-def createZip(directoryToZip, configuration, embedParentDirectoryNameOnDarwin=False, minify=False):
+def createZip(directoryToZip, configuration, excludePatterns=None, embedParentDirectoryNameOnDarwin=False):
     archiveDir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "WebKitBuild"))
-    if minify:
-        configuration = 'minified-' + configuration
     archiveFile = os.path.join(archiveDir, configuration + ".zip")
 
     try:
@@ -159,18 +158,50 @@
             raise
 
     if sys.platform == 'darwin':
-        command = ['ditto', '-c', '-k', '--sequesterRsrc']
+        command = ['ditto', '-ckv', '--sequesterRsrc']
         if embedParentDirectoryNameOnDarwin:
             command += ['--keepParent']
+        if excludePatterns:
+            bomFile = os.path.join(archiveDir, configuration + '.bom')
+            mkbom = subprocess.Popen(('mkbom', '-s', '-i-', bomFile), stdin=subprocess.PIPE, text=True)
+            for root, dirs, files in os.walk(directoryToZip):
+                relativePath = root.replace(directoryToZip, '.', 1)
+                mkbom.stdin.write(relativePath + '\n')
+                for name in files:
+                    archiveMemberName = os.path.join(relativePath, name)
+                    if any(fnmatch.fnmatch(name, pattern) for pattern in excludePatterns):
+                        print('Ignoring:', archiveMemberName)
+                    else:
+                        mkbom.stdin.write(archiveMemberName + '\n')
+                dirsToIgnore = {name for pattern in excludePatterns for name in fnmatch.filter(dirs, pattern)}
+                for name in reversed(dirs):
+                    if name not in dirsToIgnore:
+                        continue
+                    print('Ignoring:', os.path.join(relativePath, name))
+                    dirs.remove(name)
+            mkbom.stdin.close()
+            if mkbom.wait():
+                return 1
+            command += ['--bom', bomFile]
         command += [directoryToZip, archiveFile]
-        return subprocess.call(command) or addFilesToArchive(archiveFile, PATH_TO_LAUNCHER, PATH_TO_README) 
+        return subprocess.call(command) or addFilesToArchive(archiveFile, PATH_TO_LAUNCHER, PATH_TO_README)
     elif sys.platform == 'cygwin':
-        return subprocess.call(["zip", "-r", archiveFile, "bin64"], cwd=directoryToZip)
+        zipCommand = ["zip", "-r", archiveFile, "bin64"]
+        if excludePatterns:
+            for excludePattern in excludePatterns:
+                zipCommand += ['-x', excludePattern]
+        return subprocess.call(zipCommand, cwd=directoryToZip)
     elif sys.platform == 'win32':
+        if excludePatterns:
+            raise NotImplementedError('win32 createZip does not support exclude patterns')
         createZipManually(directoryToZip, archiveFile)
         return 0
     elif sys.platform.startswith('linux'):
-        return subprocess.call(["zip", "-y", "-r", archiveFile, "."], cwd=directoryToZip)
+        zipCommand = ["zip", "-y", "-r", archiveFile, "."]
+        if excludePatterns:
+            for excludePattern in excludePatterns:
+                zipCommand += ['-x', excludePattern]
+        return subprocess.call(zipCommand, cwd=directoryToZip)
 
 
 def dirContainsdwo(directory):
@@ -181,21 +212,8 @@
                 return True
     return False
 
+MINIFIED_EXCLUDED_PATTERNS = ('*.a', '*.dSYM', 'DerivedSources')
 
-def minifyDirectory(platform, directory):
-    if platform in ['mac', 'ios', 'tvos', 'watchos']:
-        dir_patterns = ('.dSYM', 'DerivedSources')
-        file_patterns = ('.a',)
-        for root, dirs, files in os.walk(directory):
-            if any(root.endswith(pattern) for pattern in dir_patterns):
-                print('Removing: {}'.format(root))
-                shutil.rmtree(root)
-            for name in files:
-                if any(name.endswith(pattern) for pattern in file_patterns):
-                    print('Removing: {}'.format(os.path.join(root, name)))
-                    os.remove(os.path.join(root, name))
-
-
 def archiveBuiltProduct(configuration, platform, fullPlatform, minify=False):
     assert platform in ('gtk', 'ios', 'jsc', 'mac', 'tvos', 'watchos', 'win', 'wincairo', 'wpe')
     global _configurationBuildDirectory
@@ -204,19 +222,19 @@
         combinedDirectory = os.path.join(_topLevelBuildDirectory, 'combined-mac-and-{}'.format(platform))
         removeDirectoryIfExists(combinedDirectory)
         os.makedirs(combinedDirectory)
-        if minify:
-            minifyDirectory(platform, _configurationBuildDirectory)
-            minifyDirectory(platform, _hostBuildDirectory)
         if subprocess.call(['/bin/cp', '-pR', _configurationBuildDirectory, combinedDirectory]):
             return 1
         if subprocess.call(['/bin/cp', '-pR', _hostBuildDirectory, combinedDirectory]):
             return 1
-
-        return createZip(combinedDirectory, configuration, minify=minify)
+        if minify:
+            return createZip(combinedDirectory, 'minified-' + configuration, excludePatterns=MINIFIED_EXCLUDED_PATTERNS)
+        else:
+            return createZip(combinedDirectory, configuration)
     elif platform == 'mac':
         if minify:
-            minifyDirectory(platform, _configurationBuildDirectory)
-        return createZip(_configurationBuildDirectory, configuration, embedParentDirectoryNameOnDarwin=True, minify=minify)
+            return createZip(_configurationBuildDirectory, 'minified-' + configuration, excludePatterns=MINIFIED_EXCLUDED_PATTERNS, embedParentDirectoryNameOnDarwin=True)
+        else:
+            return createZip(_configurationBuildDirectory, configuration, embedParentDirectoryNameOnDarwin=True)
     elif platform in ('win', 'wincairo'):
         binType = 'bin64' if os.path.exists(os.path.join(_configurationBuildDirectory, 'bin64')) else 'bin32'
         binDirectory = os.path.join(_configurationBuildDirectory, binType)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to