#!/usr/bin/env python # Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. # # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file in the root of the source # tree. An additional intellectual property rights grant can be found # in the file PATENTS. All contributing project authors may # be found in the AUTHORS file in the root of the source tree. __author__ = 'ivinnichenko@webrtc.org (Illya Vinnichenko)' from buildbot.process import factory from buildbot.steps import shell from buildbot.steps.shell import ShellCommand from buildbot.process import properties from buildbot.process.properties import WithProperties import os import sys SVN_LOCATION = "http://webrtc.googlecode.com/svn/trunk" class WebRTCFactory(factory.BuildFactory): """A Build Factory affected by properties.""" def __init__(self, build_factory_properties=None, steps=None, enable_coverage=False, account=None): factory.BuildFactory.__init__(self, steps) self.properties = properties.Properties() self.enable_build = False self.force_sync = False self.headless_tests = [] self.enable_coverage = enable_coverage self.gyp_params = [] self.account = account self.coverage_dir = "" self.coverage_url = "" self.release = False if self.account is None: self.coverage_url = "http://www.corp.google.com/~webrtc-cb" self.coverage_dir = "/home/webrtc-cb/www" else: self.coverage_url = "http://www.corp.google.com/~%s" % self.account self.coverage_dir = "/home/%s/www" % self.account def EnableBuild(self, force_sync): """Build the binary [must be overridden].""" pass def AddCommonTestSteps(self, test): """Add common steps for test.[must be overridden] test: test to be run. """ pass def AddCommonStep(self): """Define common step [must be overridden].""" pass def AddCommonTestRunStep(self): """Define common test run step [must be overridden].""" pass def AddCommonMakeStep(self): """Define common make step [must be overridden].""" pass def AddCommonGYPStep(self): """Define common gyp step [must be overridden].""" pass def EnableTest(self, test): """Enable Test to be run. [must be overridden] test: test to be run. """ pass def EnableTests(self, tests): """Enable Test to be run. tests: list of test to be run. """ print "Headless tests:%s" % self.headless_tests for test in tests: self.EnableTest(test) if self.enable_coverage: self.EnableCoverage() def EnableHeadLess(self, tests): """Add headless (build only) tests. tests: list of headless test. """ self.headless_tests += tests def EnableCoverage(self): """Enable coverage data [must be overridden].""" pass class GenerateCodeCoverage(ShellCommand): command = ["genhtml", "final.info", "--output-directory", WithProperties("/home/webrtc-cb/www/%(buildername)s_%(buildnumber)s")] name = "LCOV_GenHTML" def __init__(self, coverage_url=None, coverage_dir=None, **kwargs): if coverage_url is None or coverage_dir is None: raise TypeError("coverage location required") print coverage_url, coverage_dir ShellCommand.__init__(self, **kwargs) self.addFactoryArguments(coverage_url=coverage_url, coverage_dir=coverage_dir) self.setDefaultWorkdir("build/trunk") self.coverage_url = coverage_url self.coverage_dir = coverage_dir self.setCommand(["genhtml", "final.info", "--output-directory", WithProperties(coverage_dir + "/%(buildername)s_%(buildnumber)s")]) def createSummary(self, log): coverage_url = "%s/%s_%s" % (self.coverage_url, self.getProperty("buildername"), self.getProperty("buildnumber")) coverage_dir = "%s/%s_%s" % (self.coverage_dir, self.getProperty("buildername"), self.getProperty("buildnumber")) os.chmod(coverage_dir,0777) for root, dirs, files in os.walk(coverage_dir): for d in dirs: os.chmod(os.path.join(root, d), 0777) for f in files: os.chmod(os.path.join(root, f), 0777) self.addURL("coverage", coverage_url) def start(self): ShellCommand.start(self) ################################################################################ class WebRTCLinuxFactory(WebRTCFactory): """A Build Factory affected by properties.""" def __init__(self, build_factory_properties=None, steps=None, enable_coverage=False, account=None): WebRTCFactory.__init__(self, build_factory_properties, steps, enable_coverage, account) def EnableBuild(self, force_sync=False, release=False, build32=False, chrome_os=False, clang=False): if build32: self.gyp_params.append("-Dtarget_arch=ia32") self.enable_build = True self.force_sync = force_sync """Linux specific Build""" self.release = release self.AddCommonStep(["rm", "-rf", "trunk"], descriptor="Cleanup") self.AddCommonStep(["gclient", "config", SVN_LOCATION], descriptor="gclient_config") cmd = ["gclient", "sync"] if force_sync: cmd.append("--force") self.AddCommonStep(cmd, descriptor="Sync") if chrome_os: self.gyp_params.append("-Dchromeos=1") if clang: self.gyp_params.append("-Dclang=1") if self.enable_coverage: self.gyp_params.append("-Dcoverage=1") self.AddCommonGYPStep("webrtc.gyp", descriptor="CommonGYP") if clang: self.AddCommonStep(["trunk/tools/clang/scripts/update.sh"], descriptor="Update_Clang") if self.release: self.AddCommonMakeStep("all", make_extra="BUILDTYPE=Release") else: self.AddCommonMakeStep("all") def AddCommonStep(self, cmd, descriptor="", workdir="build"): self.addStep(shell.ShellCommand(command=cmd, workdir=workdir, description=[descriptor, "running..."], descriptionDone=[descriptor, "done..."], name="%s" % descriptor)) def AddCommonTestRunStep(self, test, descriptor="", cmd=None, workdir="build/trunk"): if test in self.headless_tests: return test_folder = "Release" if self.release else "Debug" test_descriptor = test + descriptor if cmd is None: cmd = ["out/%s/%s" % (test_folder, test)] self.addStep(shell.ShellCommand(command=cmd, workdir=workdir, description=["Running", test_descriptor], descriptionDone=[test_descriptor, "finished"], name="run_test_%s" % test_descriptor)) def AddCommonMakeStep(self, make, descriptor="", make_extra=None): make_descriptor = make + descriptor #cpu = `grep -i \"processor\" /proc/cpuinfo | sort -u | wc -l` cmd = ["make", make, "-j100"] if make_extra is not None: cmd.append(make_extra) self.addStep(shell.ShellCommand(command=cmd, workdir="build/trunk", description=["Making", make_descriptor], descriptionDone=[make_descriptor, "built"], name="make_%s" % make_descriptor)) def AddCommonGYPStep(self, gyp_file, gyp_params=[], descriptor="gyp"): cmd = ["./build/gyp_chromium", "--depth=.", gyp_file] cmd += gyp_params + self.gyp_params self.addStep(shell.ShellCommand(command=cmd, workdir="build/trunk", description=[descriptor, "running..."], descriptionDone=[descriptor, "done..."], name="gyp_%s" % descriptor)) def EnableCoverage(self): """Enable coverage data [must be overridden].""" self.AddCommonStep(["lcov", "--directory", ".", "--capture", "-b", ".", "--output-file", "webrtc.info"], workdir="build/trunk", descriptor="LCOV_Capture") self.AddCommonStep(['lcov', '--extract', 'webrtc.info', '*/src/*', '--output', 'test.info'], workdir="build/trunk", descriptor="LCOV_Extract") self.AddCommonStep(["lcov", "--remove", "test.info", "*/usr/include/*", "/third*", "/testing/*", "--output", "final.info"], workdir="build/trunk", descriptor="LCOV_Filter") self.addStep(GenerateCodeCoverage(coverage_url=self.coverage_url, coverage_dir=self.coverage_dir)) def AddCommonTestSteps(self, test): """Add common steps for test. test: test to be run. """ self.AddCommonMakeStep(test, descriptor="_test") self.AddCommonTestRunStep(test, descriptor="_test") def EnableTest(self, test): """Enable Test to be run. test: test to be run. """ if test == "audioproc_unittest": self.AddCommonMakeStep(test, descriptor="_test") self.AddCommonTestRunStep(test, cmd=["../../../out/Debug/audioproc_unittest"], workdir="build/trunk/test/data/audio_processing") # Fixed point run: self.AddCommonGYPStep("src/modules/modules.gyp", gyp_params=["-Dprefer_fixed_point=1"], descriptor="tests_fp") self.AddCommonMakeStep(test, "_test_(FP)") self.AddCommonTestRunStep(test, descriptor="_(FP)", cmd=["../../../out/Debug/audioproc_unittest"], workdir="build/trunk/test/data/audio_processing") elif test == "signal_processing_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "resampler_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "vad_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "rtp_rtcp_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "video_coding_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "test_bwe": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "audio_device_test_api": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "audio_device_test_func": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "audio_coding_module_test": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "video_processing_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "test_fec": self.AddCommonTestSteps(test) elif test == "system_wrappers_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "cng_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "g711_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "g722_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "pcm16b_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "audio_conference_mixer_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "media_file_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "udp_transport_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "webrtc_utility_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "neteq_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "vp8_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "libyuv_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "voice_engine_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "vie_auto_test": self.addStep(shell.Compile(command=('xvfb-run --server-args="-screen 0 ' '800x600x24 -extension Composite" out/Debug/vie_auto_test --automated ' '--gtest_filter="ViEStandardIntegrationTest.*:ViEApiIntegrationTest.*" ' '--capture_test_ensure_resolution_alignment_in_capture_device=false'), workdir="build/trunk", description=[test, "running..."], descriptionDone=[test, "done..."], name="%s" % test)) elif test == "voe_auto_test": self.addStep(shell.Compile(command=('out/Debug/voe_auto_test --automated ' '--gtest_filter="-*Manual*"'), workdir="build/trunk", description=[test, "running..."], descriptionDone=[test, "done..."], name="%s" % test)) else: print "No supported tests are found..." ################################################################################ class WebRTCMacFactory(WebRTCFactory): """A Build Factory affected by properties.""" def __init__(self, build_factory_properties=None, steps=None, enable_coverage=False, account=None): WebRTCFactory.__init__(self, build_factory_properties, steps, enable_coverage, account) self.build_type = "both" self.allowed_build_types = ["both", "xcode", "make"] def EnableBuild(self, force_sync=True, build_type="both", release=False): self.enable_build = True self.force_sync = force_sync self.release = release """Mac specific Build""" if build_type not in self.allowed_build_types: print "*** INCORRECT BUILD TYPE (%s)!!! ***" % build_type sys.exit(0) else: self.build_type = build_type self.AddCommonStep(["rm", "-rf", "trunk"], descriptor="Cleanup") self.AddCommonStep(["gclient", "config", SVN_LOCATION], descriptor="gclient_config") cmd = ["gclient", "sync"] if force_sync: cmd.append("--force") self.AddCommonStep(cmd, descriptor="Sync") if self.build_type == "make" or self.build_type == "both": self.AddCommonGYPStep("webrtc.gyp", gyp_params=["-f", "make"], descriptor="EnableMake") self.AddCommonMakeStep("all") def AddCommonStep(self, cmd, descriptor="", workdir="build"): self.addStep(shell.ShellCommand(command=cmd, workdir=workdir, description=[descriptor, "running..."], descriptionDone=[descriptor, "done..."], name="%s" % descriptor)) def AddCommonTestRunStep(self, test, descriptor="", cmd=None, workdir="build/trunk"): if test in self.headless_tests: return test_folder = "Release" if self.release else "Debug" test_descriptor = test + descriptor if cmd is None: if self.build_type == "xcode" or self.build_type == "both": cmd = ["xcodebuild/%s/%s" % (test_folder, test)] self.AddCommonStep(cmd, descriptor=test_descriptor+"(xcode)", workdir="build/trunk") if self.build_type == "make" or self.build_type == "both": cmd = ["out/%s/%s" % (test_folder, test)] self.AddCommonStep(cmd, descriptor=test_descriptor+"(make)", workdir="build/trunk") def AddCommonMakeStep(self, make, descriptor="", make_extra=None): make_descriptor = make + descriptor cpu = "`sysctl -n hw.logicalcpu`" if self.build_type == "make" or self.build_type == "both": cmd = ["make", make, "-j100"] if make_extra is not None: cmd.append(make_extra) self.AddCommonStep(cmd, descriptor=make_descriptor+"(make)", workdir="build/trunk") if self.build_type == "xcode" or self.build_type == "both": cmd = ["xcodebuild", "-project", "webrtc.xcodeproj", "-configuration", "Debug", "-target", "All"] self.AddCommonStep(cmd, descriptor=make_descriptor+"(xcode)", workdir="build/trunk") def AddCommonGYPStep(self, gyp_file, gyp_params=[], descriptor="gyp"): cmd = ["./build/gyp_chromium", "--depth=.", gyp_file] cmd += gyp_params + self.gyp_params self.addStep(shell.ShellCommand(command=cmd, workdir="build/trunk", description=[descriptor, "running..."], descriptionDone=[descriptor, "done..."], name="gyp_%s" % descriptor)) def AddCommonTestSteps(self, test): """Add common steps for test. test: test to be run. """ self.AddCommonTestRunStep(test, descriptor="_test") def EnableTest(self, test): """Enable Test to be run. test: test to be run. """ if test == "audioproc_unittest": print "Does not run on Mac now" elif test == "signal_processing_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "resampler_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "vad_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "rtp_rtcp_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "video_coding_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "test_bwe": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "audio_device_test_api": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "audio_device_test_func": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "audio_coding_module_test": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "video_processing_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "test_fec": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "system_wrappers_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "audio_conference_mixer_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "media_file_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "udp_transport_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "webrtc_utility_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "neteq_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "vp8_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "libyuv_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "voice_engine_unittests": self.AddCommonTestRunStep(test, descriptor="_test") else: print "No supported tests are found..." ################################################################################ class WebRTCWinFactory(WebRTCFactory): """A Build Factory affected by properties.""" def __init__(self, build_factory_properties=None, steps=None, enable_coverage=False, account=None): WebRTCFactory.__init__(self, build_factory_properties, steps, enable_coverage, account) self.configuration = "Debug" self.platform = "x64" self.allowed_platforms = ["x64", "Win32"] self.allowed_configurations = ["Debug", "Release", "both"] def EnableBuild(self, force_sync=True, platform="Win32", configuration="Debug", build_only=False): self.enable_build = True self.force_sync = force_sync """Win specific Build""" if platform not in self.allowed_platforms: print "*** INCORRECT PLATFORM (%s)!!! ***" % platform sys.exit(0) else: self.platform = platform if configuration not in self.allowed_configurations: print "*** INCORRECT CONFIGURATION (%s)!!! ***" % configuration sys.exit(0) else: self.configuration = configuration if not build_only: self.AddCommonStep(["rm", "-rf", "trunk"], descriptor="Cleanup") self.AddCommonStep(["gclient", "config", SVN_LOCATION], descriptor="gclient_config") cmd = ["gclient", "sync"] if force_sync: cmd.append("--force") self.AddCommonStep(cmd, descriptor="Sync") if self.configuration == "Debug" or self.configuration == "both": cmd = ["msbuild", "webrtc.sln", "/t:Clean", "/p:Configuration=Debug;Platform=%s" % (self.platform)] self.AddCommonStep(cmd, descriptor="Build_Clean", workdir="build/trunk") cmd = ["msbuild", "webrtc.sln", "/p:Configuration=Debug;Platform=%s" % (self.platform)] self.AddCommonStep(cmd, descriptor="Build_Debug", workdir="build/trunk") if self.configuration == "Release" or self.configuration == "both": cmd = ["msbuild", "webrtc.sln", "/t:Clean", "/p:Configuration=Release;Platform=%s" % (self.platform)] self.AddCommonStep(cmd, descriptor="Build_Clean", workdir="build/trunk") cmd = ["msbuild", "webrtc.sln", "/p:Configuration=Release;Platform=%s" % (self.platform)] self.AddCommonStep(cmd, descriptor="Build_Release", workdir="build/trunk") def AddCommonStep(self, cmd, descriptor="", workdir="build"): self.addStep(shell.ShellCommand(command=cmd, workdir=workdir, description=[descriptor, "running..."], descriptionDone=[descriptor, "done..."], name="%s" % descriptor)) def AddCommonTestRunStep(self, test, descriptor="", cmd=None, workdir="build/trunk"): if test in self.headless_tests: return test_descriptor = test + descriptor if cmd is None: if self.configuration == "Debug" or self.configuration == "both": cmd = ["build\Debug\%s.exe" % test] self.AddCommonStep(cmd, descriptor=test_descriptor+"_Debug", workdir=workdir) if self.configuration == "Release" or self.configuration == "both": cmd = ["build\Release\%s.exe" % test] self.AddCommonStep(cmd, descriptor=test_descriptor+"_Release", workdir=workdir) def EnableTest(self, test): """Enable Test to be run. test: test to be run. """ if test == "audioproc_unittest": print "Does not run on Mac now" elif test == "resampler_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "vad_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "system_wrappers_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "neteq_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "vp8_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "libyuv_unittests": self.AddCommonTestRunStep(test, descriptor="_test") elif test == "voice_engine_unittests": self.AddCommonTestRunStep(test, descriptor="_test") else: print "No supported tests are found..."