FlightDeck/cuddlefish/xpcom.py

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)