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