зеркало из https://github.com/mozilla/FlightDeck.git
117 строки
4.1 KiB
Python
117 строки
4.1 KiB
Python
|
import sys
|
||
|
import os
|
||
|
import shutil
|
||
|
import fnmatch
|
||
|
import subprocess
|
||
|
import distutils.dir_util
|
||
|
|
||
|
from cuddlefish.bunch import Bunch
|
||
|
|
||
|
def clear_dir(dirname):
|
||
|
if os.path.exists(dirname) and os.path.isdir(dirname):
|
||
|
shutil.rmtree(dirname)
|
||
|
|
||
|
def run_program(args, **kwargs):
|
||
|
retval = subprocess.call(args, **kwargs)
|
||
|
if retval:
|
||
|
print "Process failed with exit code %d." % retval
|
||
|
sys.exit(retval)
|
||
|
|
||
|
def build_xpcom_components(comp_src_dir, moz_srcdir, moz_objdir,
|
||
|
base_output_dir, module_name,
|
||
|
xpt_output_dir=None):
|
||
|
options = Bunch(srcdir=moz_srcdir,
|
||
|
objdir=moz_objdir)
|
||
|
xpcom_info = Bunch()
|
||
|
|
||
|
autoconf = open(os.path.join(options.objdir, "config", "autoconf.mk"),
|
||
|
"r").readlines()
|
||
|
for line in autoconf:
|
||
|
if line.startswith("OS_TARGET"):
|
||
|
xpcom_info.os = line.split("=")[1].strip()
|
||
|
elif line.startswith("LIBXUL_SDK"):
|
||
|
xpcom_info.libxul = line.split("=")[1].strip()
|
||
|
if sys.platform.startswith('win'):
|
||
|
# The path is mingw-style, convert it to windows-style.
|
||
|
sh_echo = subprocess.Popen(["sh", "-c",
|
||
|
"cmd //c echo " +
|
||
|
xpcom_info.libxul],
|
||
|
stdout=subprocess.PIPE)
|
||
|
sh_echo.wait()
|
||
|
xpcom_info.libxul = sh_echo.stdout.read().strip()
|
||
|
elif line.startswith("TARGET_XPCOM_ABI"):
|
||
|
xpcom_info.abi = line.split("=")[1].strip()
|
||
|
elif line.startswith("MOZILLA_VERSION"):
|
||
|
xpcom_info.mozilla_version = line.split("=")[1].strip()[:5]
|
||
|
elif (line.startswith("MOZ_DEBUG") and
|
||
|
not line.startswith("MOZ_DEBUG_")):
|
||
|
raw_value = line.split("=")[1].strip()
|
||
|
if not raw_value:
|
||
|
xpcom_info.is_debug = 0
|
||
|
else:
|
||
|
xpcom_info.is_debug = int(raw_value)
|
||
|
|
||
|
platform = "%(os)s_%(abi)s" % xpcom_info
|
||
|
print "Building XPCOM binary components for %s" % platform
|
||
|
|
||
|
rel_dest_dir = os.path.join("browser", "components", module_name)
|
||
|
comp_dest_dir = os.path.join(options.srcdir, rel_dest_dir)
|
||
|
comp_xpi_dir = os.path.join(options.objdir, "dist", "xpi-stage",
|
||
|
module_name, "components")
|
||
|
comp_plat_dir = os.path.join(base_output_dir,
|
||
|
platform, xpcom_info.mozilla_version)
|
||
|
|
||
|
clear_dir(comp_dest_dir)
|
||
|
clear_dir(comp_xpi_dir)
|
||
|
|
||
|
shutil.copytree(comp_src_dir, comp_dest_dir)
|
||
|
|
||
|
# Ensure that these paths are unix-like on Windows.
|
||
|
sh_pwd = subprocess.Popen(["sh", "-c", "pwd"],
|
||
|
cwd=options.srcdir,
|
||
|
stdout=subprocess.PIPE)
|
||
|
sh_pwd.wait()
|
||
|
unix_topsrcdir = sh_pwd.stdout.read().strip()
|
||
|
unix_rel_dest_dir = rel_dest_dir.replace("\\", "/")
|
||
|
|
||
|
# We're specifying 'perl' here because we have to for this
|
||
|
# to work on Windows.
|
||
|
run_program(["perl",
|
||
|
os.path.join(options.srcdir, "build", "autoconf",
|
||
|
"make-makefile"),
|
||
|
"-t", unix_topsrcdir,
|
||
|
unix_rel_dest_dir],
|
||
|
cwd=options.objdir)
|
||
|
|
||
|
env = {}
|
||
|
env.update(os.environ)
|
||
|
|
||
|
run_program(["make"],
|
||
|
cwd=os.path.join(options.objdir, rel_dest_dir),
|
||
|
env=env)
|
||
|
|
||
|
xptfiles = []
|
||
|
libfiles = []
|
||
|
for filename in os.listdir(comp_xpi_dir):
|
||
|
if fnmatch.fnmatch(filename, '*.xpt'):
|
||
|
xptfiles.append(filename)
|
||
|
else:
|
||
|
libfiles.append(filename)
|
||
|
|
||
|
clear_dir(comp_plat_dir)
|
||
|
distutils.dir_util.mkpath(comp_plat_dir)
|
||
|
for filename in libfiles:
|
||
|
shutil.copy(os.path.join(comp_xpi_dir, filename),
|
||
|
comp_plat_dir)
|
||
|
|
||
|
if xptfiles and not xpt_output_dir:
|
||
|
raise ValueError('typelibs generated, but xpt_output_dir '
|
||
|
'not provided')
|
||
|
|
||
|
for filename in xptfiles:
|
||
|
shutil.copy(os.path.join(comp_xpi_dir, filename),
|
||
|
xpt_output_dir)
|
||
|
|
||
|
clear_dir(comp_dest_dir)
|
||
|
clear_dir(comp_xpi_dir)
|