| Index: gypbuild.py
|
| ===================================================================
|
| --- gypbuild.py (revision 30103)
|
| +++ gypbuild.py (working copy)
|
| @@ -37,6 +37,162 @@
|
| class GypBuilder(object):
|
| """A class to help build gyp projects in a cross platform way"""
|
|
|
| + class Builder(object):
|
| + """Base Class for building."""
|
| +
|
| + def __init__(self, builder):
|
| + self.builder = builder
|
| +
|
| + def Log(self, *args):
|
| + """Prints something if verbose is true."""
|
| + self.builder.Log(args)
|
| +
|
| + def Execute(self, args):
|
| + """Executes an external program if execute is true."""
|
| + self.builder.Execute(args)
|
| +
|
| + def Dopresubmit(self, targets, options):
|
| + """Builds and runs both the unit tests and selenium."""
|
| + self.Dounit_tests(targets, options)
|
| + self.Doselenium(targets, options)
|
| +
|
| + def Doselenium(self, targets, options):
|
| + """Builds and runs the selenium tests."""
|
| + print "selenium not yet implemented."
|
| +
|
| + def Dounit_tests(self, targets, options):
|
| + """Builds and runs the unit tests."""
|
| + print "unit_tests not yet implemented."
|
| +
|
| + def CleanTargets(self, targets, options):
|
| + """Cleans the targets."""
|
| + print "clean not implemented for this platform."
|
| +
|
| +
|
| + class OSXBuilder(Builder):
|
| + """Class for building on OSX."""
|
| +
|
| + def __init__(self, builder):
|
| + GypBuilder.Builder.__init__(self, builder)
|
| +
|
| + def GetSolutionPath(self):
|
| + """Gets the solution path."""
|
| + return '%s.xcodeproj' % GypBuilder.base_name
|
| +
|
| + def CleanTargets(self, targets, options):
|
| + """Cleans the specifed targets."""
|
| + solution = self.GetSolutionPath()
|
| + self.Execute(['xcodebuild',
|
| + '-project', solution,
|
| + 'clean'])
|
| +
|
| + def Dobuild(self, targets, options):
|
| + """Builds the specifed targets."""
|
| + solution = self.GetSolutionPath()
|
| + self.Execute(['xcodebuild',
|
| + '-project', solution])
|
| +
|
| + class WinBuilder(Builder):
|
| + """Class for building on Windows."""
|
| +
|
| + def __init__(self, builder):
|
| + GypBuilder.Builder.__init__(self, builder)
|
| +
|
| + def GetSolutionPath(self):
|
| + """Gets the solution path."""
|
| + return os.path.abspath('%s.sln' % GypBuilder.base_name)
|
| +
|
| + def CheckVisualStudioVersionVsSolution(self, solution):
|
| + """Checks the solution matches the cl version."""
|
| + f = open(solution, "r")
|
| + line = f.readline()
|
| + f.close()
|
| + m = re.search(r'Format Version (\d+)\.', line)
|
| + if m:
|
| + solution_version = int(m.group(1))
|
| + else:
|
| + print "FAILURE: Unknown solution version in %s" % solution
|
| + sys.exit(1)
|
| +
|
| + output = subprocess.Popen(['cl.exe'],
|
| + stdout=subprocess.PIPE,
|
| + stderr=subprocess.PIPE).communicate()[1]
|
| + m = re.search(r'Compiler Version (\d+)\.', output)
|
| + if m:
|
| + compiler_version = int(m.group(1))
|
| + else:
|
| + print "FAILURE: Unknown cl.exe version."
|
| + sys.exit(1)
|
| +
|
| + # Compiler Solution
|
| + # Visual Studio .NET 2005 14 9
|
| + # Visual Studio .NET 2008 15 10
|
| + # Visual Studio .NET 2010 ?? ??
|
| + if (compiler_version - 14) > (solution_version - 9):
|
| + vs_map = {
|
| + 14: '2005',
|
| + 15: '2008',
|
| + 16: '2010',
|
| + }
|
| + sln_map = {
|
| + 9: '2005',
|
| + 10: '2008',
|
| + 11: '2010',
|
| + }
|
| + vs_version = vs_map[compiler_version]
|
| + print ("ERROR: solution (%s) version does not match "
|
| + "Visual Studio version (%s)" %
|
| + (sln_map[solution_version], vs_version))
|
| + print "You should 'set GYP_MSVS_VERSION=auto'"
|
| + print "and run 'gclient runhooks --force'"
|
| + sys.exit(1)
|
| +
|
| + def CleanTargets(self, targets, options):
|
| + """Cleans the targets."""
|
| + solution = self.GetSolutionPath()
|
| + self.Execute(['devenv.exe',
|
| + solution,
|
| + '/clean',
|
| + options.version])
|
| +
|
| + def Dobuild(self, targets, options):
|
| + """Builds the specifed targets."""
|
| + solution = self.GetSolutionPath()
|
| + if not is_admin.IsAdmin():
|
| + print ("WARNING: selenium_ie will not run unless you run as admin "
|
| + "or turn off UAC.\nAfter switching to admin run "
|
| + "'gclient runhooks --force'")
|
| + self.CheckVisualStudioVersionVsSolution(solution)
|
| + self.Execute(['msbuild',
|
| + solution,
|
| + '/p:Configuration=%s' % options.version])
|
| +
|
| + class LinuxBuilder(Builder):
|
| + """Class for building on Linux."""
|
| +
|
| + def __init__(self, builder):
|
| + GypBuilder.Builder.__init__(self, builder)
|
| +
|
| + def GetSolutionPath(self):
|
| + """Gets the solution path."""
|
| + return '%s_main.scons' % GypBuilder.base_name
|
| +
|
| + def CleanTargets(self, targets, options):
|
| + """Cleans the targets."""
|
| + solution = self.GetSolutionPath()
|
| + self.Execute(['hammer',
|
| + '-f', solution,
|
| + '--clean'])
|
| +
|
| + def Dobuild(self, targets, options):
|
| + """Builds the specifed targets."""
|
| + solution = self.GetSolutionPath()
|
| + self.Execute(['hammer',
|
| + '-f', solution])
|
| +
|
| + # Use "o3d" for chrome only build?
|
| + base_name = "o3d_all"
|
| +
|
| def __init__(self, args):
|
| self.execute = True
|
| self.verbose = False
|
| @@ -47,20 +203,23 @@
|
| parser = OptionParser()
|
| parser.add_option(
|
| "--list-targets", action="store_true",
|
| - help="lists all available targets")
|
| + help="lists all available targets.")
|
| parser.add_option(
|
| "--no-execute", action="store_true", default=False,
|
| - help="just print commands that would get executed")
|
| + help="just prints commands that would get executed.")
|
| parser.add_option(
|
| "--verbose", action="store_true",
|
| - help="prints more output")
|
| + help="prints more output.")
|
| parser.add_option(
|
| "--targets", action="append",
|
| help="targets to build separated by commas.")
|
| parser.add_option(
|
| "--clean", action="store_true",
|
| - help="clean the targets")
|
| + help="cleans the targets.")
|
| parser.add_option(
|
| + "--rebuild", action="store_true",
|
| + help="cleans, then builds targets")
|
| + parser.add_option(
|
| "--version", choices=versions, default="Debug",
|
| help="version to build. Versions are '%s'. Default='Debug' " %
|
| "', '".join(versions))
|
| @@ -85,17 +244,36 @@
|
| # flatten the targets.
|
| targets = sum([t.split(",") for t in targets], [])
|
|
|
| + os.chdir("build")
|
| +
|
| + # Create a platform specific builder.
|
| + if os.name == 'nt':
|
| + builder = self.WinBuilder(self)
|
| + elif platform.system() == 'Darwin':
|
| + builder = self.OSXBuilder(self)
|
| + elif platform.system() == 'Linux':
|
| + builder = self.LinuxBuilder(self)
|
| + else:
|
| + print "ERROR: Unknown platform."
|
| + sys.exit(1)
|
| +
|
| + # clean if asked.
|
| + if options.clean or options.rebuild:
|
| + builder.CleanTargets(targets, options)
|
| + if not options.rebuild:
|
| + return
|
| +
|
| # call a Do method based on the mode.
|
| - os.chdir("build")
|
| - func = getattr(self, "Do%s" % options.mode)
|
| + func = getattr(builder, "Do%s" % options.mode)
|
| func(targets, options)
|
|
|
| def Log(self, *args):
|
| + """Prints something if verbose is true."""
|
| if self.verbose:
|
| print args
|
|
|
| def Execute(self, args):
|
| - """Executes an external program."""
|
| + """Executes an external program if execute is true."""
|
| if self.execute:
|
| self.Log(" ".join(args))
|
| if subprocess.call(args) > 0:
|
| @@ -103,90 +281,7 @@
|
| else:
|
| print " ".join(args)
|
|
|
| - def CheckVisualStudioVersionVsSolution(self, solution):
|
| - """Checks the solution matches the cl version."""
|
| - f = open(solution, "r")
|
| - line = f.readline()
|
| - f.close()
|
| - m = re.search(r'Format Version (\d+)\.', line)
|
| - if m:
|
| - solution_version = int(m.group(1))
|
| - else:
|
| - print "FAILURE: Unknown solution version in %s" % solution
|
| - sys.exit(1)
|
|
|
| - output = subprocess.Popen(['cl.exe'],
|
| - stdout=subprocess.PIPE,
|
| - stderr=subprocess.PIPE).communicate()[1]
|
| - m = re.search(r'Compiler Version (\d+)\.', output)
|
| - if m:
|
| - compiler_version = int(m.group(1))
|
| - else:
|
| - print "FAILURE: Unknown cl.exe version."
|
| - sys.exit(1)
|
| -
|
| - # Compiler Solution
|
| - # Visual Studio .NET 2005 14 9
|
| - # Visual Studio .NET 2008 15 10
|
| - # Visual Studio .NET 2010 ?? ??
|
| - if (compiler_version - 14) > (solution_version - 9):
|
| - vs_map = {
|
| - 14: '2005',
|
| - 15: '2008',
|
| - 16: '2010',
|
| - }
|
| - sln_map = {
|
| - 9: '2005',
|
| - 10: '2008',
|
| - 11: '2010',
|
| - }
|
| - vs_version = vs_map[compiler_version]
|
| - print ("ERROR: solution (%s) version does not match "
|
| - "Visual Studio version (%s)" %
|
| - (sln_map[solution_version], vs_version))
|
| - print "You should 'set GYP_MSVS_VERSION=auto'"
|
| - print "and run 'gclient runhooks --force'"
|
| - sys.exit(1)
|
| -
|
| - def Dobuild(self, targets, options):
|
| - """Builds the specifed targets."""
|
| -
|
| - # Use "o3d" for chrome only build.
|
| - name = "o3d_all"
|
| -
|
| - if os.name == 'nt':
|
| - solution = os.path.abspath('%s.sln' % name)
|
| - if not is_admin.IsAdmin():
|
| - print ("WARNING: selenium_ie will not run unless you run as admin "
|
| - "or turn off UAC.\nAfter switching to admin run "
|
| - "'gclient runhooks --force'")
|
| - self.CheckVisualStudioVersionVsSolution(solution)
|
| - self.Execute(['msbuild',
|
| - solution,
|
| - '/p:Configuration=%s' % options.version])
|
| - elif platform.system() == 'Darwin':
|
| - self.Execute(['xcodebuild',
|
| - '-project', '%s.xcodeproj' % name])
|
| - elif platform.system() == 'Linux':
|
| - self.Execute(['hammer',
|
| - '-f', '%s_main.scons' % name])
|
| - else:
|
| - print "Error: Unknown platform", os.name
|
| -
|
| - def Dopresubmit(self, targets, options):
|
| - """Builds and runs both the unit tests and selenium."""
|
| - self.Dounit_tests(targets, options)
|
| - self.Doselenium(targets, options)
|
| -
|
| - def Doselenium(self, targets, options):
|
| - """Builds and runs the selenium tests."""
|
| - print "selenium not yet implemented."
|
| -
|
| - def Dounit_tests(self, targets, options):
|
| - """Builds and runs the unit tests."""
|
| - print "unit_tests not yet implemented."
|
| -
|
| -
|
| def main(args):
|
| GypBuilder(args[1:])
|
|
|
|
|