gecko-dev/testing/mozharness/scripts/openh264_build.py

251 строка
8.0 KiB
Python

#!/usr/bin/env python
# ***** BEGIN LICENSE BLOCK *****
# 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/.
# ***** END LICENSE BLOCK *****
import sys
import os
import glob
# load modules from parent dir
sys.path.insert(1, os.path.dirname(sys.path[0]))
# import the guts
from mozharness.base.vcs.vcsbase import VCSScript
from mozharness.base.log import ERROR
from mozharness.base.transfer import TransferMixin
from mozharness.mozilla.mock import MockMixin
class OpenH264Build(MockMixin, TransferMixin, VCSScript):
all_actions = [
'clobber',
'checkout-sources',
'build',
'test',
'package',
'upload',
]
default_actions = [
'checkout-sources',
'build',
'test',
'package',
]
config_options = [
[["--repo"], {
"dest": "repo",
"help": "OpenH264 repository to use",
"default": "https://github.com/cisco/openh264.git"
}],
[["--rev"], {
"dest": "revision",
"help": "revision to checkout",
"default": "master"
}],
[["--debug"], {
"dest": "debug_build",
"action": "store_true",
"help": "Do a debug build",
}],
[["--64"], {
"dest": "64bit",
"action": "store_true",
"help": "Do a 64-bit build",
"default": True,
}],
[["--32"], {
"dest": "64bit",
"action": "store_false",
"help": "Do a 32-bit build",
}],
[["--os"], {
"dest": "operating_system",
"help": "Specify the operating system to build for",
}],
[["--use-mock"], {
"dest": "use_mock",
"help": "use mock to set up build environment",
"action": "store_true",
"default": False,
}],
[["--use-yasm"], {
"dest": "use_yasm",
"help": "use yasm instead of nasm",
"action": "store_true",
"default": False,
}],
]
def __init__(self, require_config_file=False, config={},
all_actions=all_actions,
default_actions=default_actions):
# Default configuration
default_config = {
'debug_build': False,
'mock_target': 'mozilla-centos6-x86_64',
'mock_packages': ['make', 'git', 'nasm', 'glibc-devel.i686', 'libstdc++-devel.i686', 'zip', 'yasm'],
'mock_files': [],
'upload_ssh_key': os.path.expanduser("~/.ssh/ffxbld_rsa"),
'upload_ssh_user': 'ffxbld',
'upload_ssh_host': 'stage.mozilla.org',
'upload_path_base': '/home/ffxbld/openh264',
'use_yasm': False,
}
default_config.update(config)
VCSScript.__init__(
self,
config_options=self.config_options,
require_config_file=require_config_file,
config=default_config,
all_actions=all_actions,
default_actions=default_actions,
)
if self.config['use_mock']:
self.setup_mock()
self.enable_mock()
def query_package_name(self):
if self.config['64bit']:
bits = '64'
else:
bits = '32'
version = self.config['revision']
if sys.platform == 'linux2':
if self.config.get('operating_system') == 'android':
return 'openh264-android-{version}.zip'.format(version=version, bits=bits)
else:
return 'openh264-linux{bits}-{version}.zip'.format(version=version, bits=bits)
elif sys.platform == 'darwin':
return 'openh264-macosx{bits}-{version}.zip'.format(version=version, bits=bits)
elif sys.platform == 'win32':
return 'openh264-win{bits}-{version}.zip'.format(version=version, bits=bits)
self.fatal("can't determine platform")
def query_make_params(self):
retval = []
if self.config['debug_build']:
retval.append('BUILDTYPE=Debug')
if self.config['64bit']:
retval.append('ENABLE64BIT=Yes')
else:
retval.append('ENABLE64BIT=No')
if "operating_system" in self.config:
retval.append("OS=%s" % self.config['operating_system'])
if self.config['use_yasm']:
retval.append('ASM=yasm')
return retval
def query_upload_ssh_key(self):
return self.config['upload_ssh_key']
def query_upload_ssh_host(self):
return self.config['upload_ssh_host']
def query_upload_ssh_user(self):
return self.config['upload_ssh_user']
def query_upload_ssh_path(self):
return "%s/%s" % (self.config['upload_path_base'], self.config['revision'])
def run_make(self, target):
cmd = ['make', target] + self.query_make_params()
dirs = self.query_abs_dirs()
repo_dir = os.path.join(dirs['abs_work_dir'], 'src')
return self.run_command(cmd, cwd=repo_dir)
def checkout_sources(self):
repo = self.config['repo']
rev = self.config['revision']
dirs = self.query_abs_dirs()
repo_dir = os.path.join(dirs['abs_work_dir'], 'src')
repos = [
{'vcs': 'gittool', 'repo': repo, 'dest': repo_dir, 'revision': rev},
]
# self.vcs_checkout already retries, so no need to wrap it in
# self.retry. We set the error_level to ERROR to prevent it going fatal
# so we can do our own handling here.
retval = self.vcs_checkout_repos(repos, error_level=ERROR)
if not retval:
self.rmtree(repo_dir)
self.fatal("Automation Error: couldn't clone repo", exit_code=4)
# Checkout gmp-api
# TODO: Nothing here updates it yet, or enforces versions!
if not os.path.exists(os.path.join(repo_dir, 'gmp-api')):
retval = self.run_make('gmp-bootstrap')
if retval != 0:
self.fatal("couldn't bootstrap gmp")
else:
self.info("skipping gmp bootstrap - we have it locally")
# Checkout gtest
# TODO: Requires svn!
if not os.path.exists(os.path.join(repo_dir, 'gtest')):
retval = self.run_make('gtest-bootstrap')
if retval != 0:
self.fatal("couldn't bootstrap gtest")
else:
self.info("skipping gtest bootstrap - we have it locally")
return retval
def build(self):
retval = self.run_make('plugin')
if retval != 0:
self.fatal("couldn't build plugin")
def package(self):
dirs = self.query_abs_dirs()
srcdir = os.path.join(dirs['abs_work_dir'], 'src')
package_name = self.query_package_name()
package_file = os.path.join(dirs['abs_work_dir'], package_name)
if os.path.exists(package_file):
os.unlink(package_file)
to_package = [os.path.basename(f) for f in glob.glob(os.path.join(srcdir, "*gmpopenh264*"))]
cmd = ['zip', package_file] + to_package
retval = self.run_command(cmd, cwd=srcdir)
if retval != 0:
self.fatal("couldn't make package")
self.copy_to_upload_dir(package_file)
def upload(self):
if self.config['use_mock']:
self.disable_mock()
dirs = self.query_abs_dirs()
self.rsync_upload_directory(
dirs['abs_upload_dir'],
self.query_upload_ssh_key(),
self.query_upload_ssh_user(),
self.query_upload_ssh_host(),
self.query_upload_ssh_path(),
)
if self.config['use_mock']:
self.enable_mock()
def test(self):
retval = self.run_make('test')
if retval != 0:
self.fatal("test failures")
# main {{{1
if __name__ == '__main__':
myScript = OpenH264Build()
myScript.run_and_exit()