#!/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 <binary basename> <dist/bin>
# 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 os
import os.path
import subprocess
import sys

if not sys.platform == "win32":
    raise RuntimeError("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 <basename>.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("Usage: pgomerge.py <binary basename> <dist/bin>", file=sys.stderr)
        sys.exit(1)
    MergePGOFiles(sys.argv[1], os.getcwd(), sys.argv[2])
