gn_meta_sln.py revision 06e539ad121946312a651b77e51234322292638a
1c20d34ca03300179be75792e0f4fc71767936eccBrian Osman# Copyright 2016 The Chromium Authors. All rights reserved.
2c20d34ca03300179be75792e0f4fc71767936eccBrian Osman# Use of this source code is governed by a BSD-style license that can be
3c20d34ca03300179be75792e0f4fc71767936eccBrian Osman# found in the LICENSE file.
4c20d34ca03300179be75792e0f4fc71767936eccBrian Osman
5c20d34ca03300179be75792e0f4fc71767936eccBrian Osmanimport os
6c20d34ca03300179be75792e0f4fc71767936eccBrian Osmanimport glob
7c20d34ca03300179be75792e0f4fc71767936eccBrian Osmanimport sys
8c20d34ca03300179be75792e0f4fc71767936eccBrian Osmanfrom shutil import copyfile
9c20d34ca03300179be75792e0f4fc71767936eccBrian Osman
10c20d34ca03300179be75792e0f4fc71767936eccBrian Osman# Get list of existing directories to use as configs
11c20d34ca03300179be75792e0f4fc71767936eccBrian Osmanconfigs = []
1206e539ad121946312a651b77e51234322292638aBrian OsmanconfigsWithSln = []
1306e539ad121946312a651b77e51234322292638aBrian OsmansrcDir = ""
1406e539ad121946312a651b77e51234322292638aBrian OsmannewestSlnTimestamp = 0
15c20d34ca03300179be75792e0f4fc71767936eccBrian Osmanfor root, dirs, files in os.walk("out"):
16c20d34ca03300179be75792e0f4fc71767936eccBrian Osman    for outDir in dirs:
1706e539ad121946312a651b77e51234322292638aBrian Osman        gnFile = os.path.join("out", outDir, "build.ninja.d")
1806e539ad121946312a651b77e51234322292638aBrian Osman        slnFile = os.path.join("out", outDir, "all.sln")
1906e539ad121946312a651b77e51234322292638aBrian Osman        if os.path.exists(gnFile):
20c20d34ca03300179be75792e0f4fc71767936eccBrian Osman            configs.append(outDir)
2106e539ad121946312a651b77e51234322292638aBrian Osman        if os.path.exists(slnFile):
2206e539ad121946312a651b77e51234322292638aBrian Osman            configsWithSln.append(outDir)
2306e539ad121946312a651b77e51234322292638aBrian Osman            slnTimestamp = os.path.getmtime(slnFile)
2406e539ad121946312a651b77e51234322292638aBrian Osman            if slnTimestamp > newestSlnTimestamp:
2506e539ad121946312a651b77e51234322292638aBrian Osman                newestSlnTimestamp = slnTimestamp
2606e539ad121946312a651b77e51234322292638aBrian Osman                srcDir = outDir
27c20d34ca03300179be75792e0f4fc71767936eccBrian Osman    break
28c20d34ca03300179be75792e0f4fc71767936eccBrian Osman
2906e539ad121946312a651b77e51234322292638aBrian Osman# We need at least one config with a solution
3006e539ad121946312a651b77e51234322292638aBrian Osmanif len(configsWithSln) == 0:
3106e539ad121946312a651b77e51234322292638aBrian Osman    print "ERROR: At least one GN directory must have been built with --ide=vs"
3206e539ad121946312a651b77e51234322292638aBrian Osman    sys.exit()
3306e539ad121946312a651b77e51234322292638aBrian Osman
34c20d34ca03300179be75792e0f4fc71767936eccBrian Osman# Ensure directories exist
35c20d34ca03300179be75792e0f4fc71767936eccBrian Osmantry:
36c20d34ca03300179be75792e0f4fc71767936eccBrian Osman    os.makedirs("out/sln/obj")
37c20d34ca03300179be75792e0f4fc71767936eccBrian Osmanexcept OSError:
38c20d34ca03300179be75792e0f4fc71767936eccBrian Osman    pass
39c20d34ca03300179be75792e0f4fc71767936eccBrian Osman
40c20d34ca03300179be75792e0f4fc71767936eccBrian Osman# Copy filter files unmodified
41c20d34ca03300179be75792e0f4fc71767936eccBrian Osmanfor filterFile in glob.glob("out/" + srcDir + "/obj/*.filters"):
42c20d34ca03300179be75792e0f4fc71767936eccBrian Osman    copyfile(filterFile, filterFile.replace("out/" + srcDir, "out/sln"))
43c20d34ca03300179be75792e0f4fc71767936eccBrian Osman
44c20d34ca03300179be75792e0f4fc71767936eccBrian Osman# Copy Solution file, with additional configurations
45c20d34ca03300179be75792e0f4fc71767936eccBrian OsmanslnLines = iter(open("out/" + srcDir + "/all.sln"))
46c20d34ca03300179be75792e0f4fc71767936eccBrian OsmannewSlnLines = []
47c20d34ca03300179be75792e0f4fc71767936eccBrian Osman
48c20d34ca03300179be75792e0f4fc71767936eccBrian Osmanfor line in slnLines:
49c20d34ca03300179be75792e0f4fc71767936eccBrian Osman    newSlnLines.append(line)
50c20d34ca03300179be75792e0f4fc71767936eccBrian Osman    if "SolutionConfigurationPlatforms" in line:
51c20d34ca03300179be75792e0f4fc71767936eccBrian Osman        slnConfig = slnLines.next()
52c20d34ca03300179be75792e0f4fc71767936eccBrian Osman        for config in configs:
53c20d34ca03300179be75792e0f4fc71767936eccBrian Osman            newSlnLines.append(slnConfig.replace("GN", config))
54c20d34ca03300179be75792e0f4fc71767936eccBrian Osman    elif "ProjectConfigurationPlatforms" in line:
55c20d34ca03300179be75792e0f4fc71767936eccBrian Osman        activeCfg = slnLines.next()
56c20d34ca03300179be75792e0f4fc71767936eccBrian Osman        while "EndGlobalSection" not in activeCfg:
57c20d34ca03300179be75792e0f4fc71767936eccBrian Osman            buildCfg = slnLines.next()
58c20d34ca03300179be75792e0f4fc71767936eccBrian Osman            for config in configs:
59c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                newSlnLines.append(activeCfg.replace("GN", config))
60c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                newSlnLines.append(buildCfg.replace("GN", config))
61c20d34ca03300179be75792e0f4fc71767936eccBrian Osman            activeCfg = slnLines.next()
62c20d34ca03300179be75792e0f4fc71767936eccBrian Osman        newSlnLines.append(activeCfg)
63c20d34ca03300179be75792e0f4fc71767936eccBrian Osman
64c20d34ca03300179be75792e0f4fc71767936eccBrian Osmanwith open("out/sln/skia.sln", "w") as newSln:
65c20d34ca03300179be75792e0f4fc71767936eccBrian Osman    newSln.writelines(newSlnLines)
66c20d34ca03300179be75792e0f4fc71767936eccBrian Osman
67c20d34ca03300179be75792e0f4fc71767936eccBrian Osman# Now bring over all project files with modification
68c20d34ca03300179be75792e0f4fc71767936eccBrian Osmanfor srcProjFilename in glob.glob("out/" + srcDir + "/obj/*.vcxproj"):
69c20d34ca03300179be75792e0f4fc71767936eccBrian Osman    with open(srcProjFilename) as srcProjFile:
70c20d34ca03300179be75792e0f4fc71767936eccBrian Osman        projLines = iter(srcProjFile)
71c20d34ca03300179be75792e0f4fc71767936eccBrian Osman        newProjLines = []
72c20d34ca03300179be75792e0f4fc71767936eccBrian Osman        for line in projLines:
73c20d34ca03300179be75792e0f4fc71767936eccBrian Osman            if "ProjectConfigurations" in line:
74c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                newProjLines.append(line)
75c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                projConfigLines = [
76c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                    projLines.next(),
77c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                    projLines.next(),
78c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                    projLines.next(),
79c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                    projLines.next() ]
80c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                for config in configs:
81c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                    for projConfigLine in projConfigLines:
82c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                        newProjLines.append(
83c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                            projConfigLine.replace("GN", config))
84c20d34ca03300179be75792e0f4fc71767936eccBrian Osman            elif "<OutDir" in line:
85c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                newProjLines.append(line.replace(srcDir, "$(Configuration)"))
86c20d34ca03300179be75792e0f4fc71767936eccBrian Osman            else:
87c20d34ca03300179be75792e0f4fc71767936eccBrian Osman                newProjLines.append(line)
88c20d34ca03300179be75792e0f4fc71767936eccBrian Osman        newName = "out/sln/obj/" + os.path.basename(srcProjFilename)
89c20d34ca03300179be75792e0f4fc71767936eccBrian Osman        with open(newName, "w") as newProj:
90c20d34ca03300179be75792e0f4fc71767936eccBrian Osman            newProj.writelines(newProjLines)
91