浏览代码

[libcxx] Preserve order, avoid duplicates when merging static archives

glob can return files in arbitrary order which breaks deterministic
builds. Rather, use `ar t` to list the files in each archive and
preserve the original order. Using `ar q` results in duplicate entries
in the archive, instead use `ar r` to avoid duplicates.

Differential Revision: https://reviews.llvm.org/D58024

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@353671 91177308-0d34-0410-b5e6-96231b3b80d8
Petr Hosek 6 年之前
父节点
当前提交
fc1ec361d3
共有 1 个文件被更改,包括 9 次插入8 次删除
  1. 9 8
      utils/merge_archives.py

+ 9 - 8
utils/merge_archives.py

@@ -78,6 +78,7 @@ def execute_command_verbose(cmd, cwd=None, verbose=False):
         sys.stderr.write('%s\n' % report)
         if exitCode != 0:
             exit_with_cleanups(exitCode)
+    return out
 
 def main():
     parser = ArgumentParser(
@@ -119,15 +120,15 @@ def main():
     global temp_directory_root
     temp_directory_root = tempfile.mkdtemp('.libcxx.merge.archives')
 
+    files = []
     for arc in archives:
-        execute_command_verbose([ar_exe, 'x', arc], cwd=temp_directory_root,
-                                verbose=args.verbose)
-
-    files = glob.glob(os.path.join(temp_directory_root, '*.o*'))
-    if not files:
-        print_and_exit('Failed to glob for %s' % temp_directory_root)
-    cmd = [ar_exe, 'qcs', args.output] + files
-    execute_command_verbose(cmd, cwd=temp_directory_root, verbose=args.verbose)
+        execute_command_verbose([ar_exe, 'x', arc],
+                                cwd=temp_directory_root, verbose=args.verbose)
+        out = execute_command_verbose([ar_exe, 't', arc])
+        files.extend(out.splitlines())
+
+    execute_command_verbose([ar_exe, 'rcsD', args.output] + files,
+                            cwd=temp_directory_root, verbose=args.verbose)
 
 
 if __name__ == '__main__':