#!/usr/bin/python # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # Usage: pgomerge.py # Gathers .pgc files from dist/bin and merges them into # $PWD/$basename.pgd using pgomgr, then deletes them. # No errors if any of these files don't exist. import sys, os, os.path, subprocess if not sys.platform == "win32": raise Exception("This script was only meant for Windows.") def MergePGOFiles(basename, pgddir, pgcdir): """Merge pgc files produced from an instrumented binary into the pgd file for the second pass of profile-guided optimization with MSVC. |basename| is the name of the DLL or EXE without the extension. |pgddir| is the path that contains .pgd (should be the objdir it was built in). |pgcdir| is the path containing basename!N.pgc files, which is probably dist/bin. Calls pgomgr to merge each pgc file into the pgd, then deletes the pgc files.""" if not os.path.isdir(pgddir) or not os.path.isdir(pgcdir): return pgdfile = os.path.abspath(os.path.join(pgddir, basename + ".pgd")) if not os.path.isfile(pgdfile): return for file in os.listdir(pgcdir): if file.startswith(basename+"!") and file.endswith(".pgc"): try: pgcfile = os.path.normpath(os.path.join(pgcdir, file)) subprocess.call(['pgomgr', '-merge', pgcfile, pgdfile]) os.remove(pgcfile) except OSError: pass if __name__ == '__main__': if len(sys.argv) != 3: print >>sys.stderr, "Usage: pgomerge.py " sys.exit(1) MergePGOFiles(sys.argv[1], os.getcwd(), sys.argv[2])