[Pkg-mozext-commits] [adblock-plus] 158/464: Added code required to package up K-Meleon extensions

David Prévot taffit at moszumanska.debian.org
Tue Jul 22 20:44:13 UTC 2014


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository adblock-plus.

commit 9a896362c131cb287cb9de39e62d57ca9523598b
Author: Wladimir Palant <trev at adblockplus.org>
Date:   Fri May 20 15:30:56 2011 +0200

    Added code required to package up K-Meleon extensions
---
 build.py           |  20 +++---
 packager.py        |   7 +--
 packagerKMeleon.py | 182 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 198 insertions(+), 11 deletions(-)

diff --git a/build.py b/build.py
index 4506f9f..5a23ba5 100644
--- a/build.py
+++ b/build.py
@@ -7,8 +7,6 @@
 
 import os, sys, re, buildtools
 from getopt import getopt, GetoptError
-import buildtools.packager as packager
-import buildtools.releaseAutomation as releaseAutomation
 
 class Command(object):
   name = property(lambda self: self._name)
@@ -162,10 +160,15 @@ def runBuild(baseDir, scriptName, opts, args, type):
       limitMetadata = True
   outFile = args[0] if len(args) > 0 else None
 
-  packager.createBuild(baseDir, outFile=outFile, locales=locales, buildNum=buildNum,
-                       releaseBuild=releaseBuild, keyFile=keyFile,
-                       limitMetadata=limitMetadata)
-
+  if type == 'gecko':
+    import buildtools.packager as packager
+    packager.createBuild(baseDir, outFile=outFile, locales=locales, buildNum=buildNum,
+                         releaseBuild=releaseBuild, keyFile=keyFile,
+                         limitMetadata=limitMetadata)
+  elif type == 'kmeleon':
+    import buildtools.packagerKMeleon as packagerKMeleon
+    packagerKMeleon.createBuild(baseDir, outFile=outFile, locales=locales,
+                                buildNum=buildNum, releaseBuild=releaseBuild)
 
 def setupTestEnvironment(baseDir, scriptName, opts, args, type):
   dirsFile = '.profileDirs'
@@ -178,6 +181,7 @@ def setupTestEnvironment(baseDir, scriptName, opts, args, type):
     handle = open(dirsFile, 'rb')
     profileDirs = map(str.strip, handle.readlines())
     handle.close()
+  import buildtools.packager as packager
   packager.setupTestEnvironment(baseDir, profileDirs)
 
 
@@ -187,6 +191,7 @@ def showDescriptions(baseDir, scriptName, opts, args, type):
     if option in ('-l', '--locales'):
       locales = value.split(',')
 
+  import buildtools.packager as packager
   if locales == None:
     locales = packager.getLocales(baseDir)
   elif locales == 'all':
@@ -233,6 +238,7 @@ def runReleaseAutomation(baseDir, scriptName, opts, args, type):
   if keyFile == None:
     print 'Warning: no key file specified, creating an unsigned release build\n'
 
+  import buildtools.releaseAutomation as releaseAutomation
   releaseAutomation.run(baseDir, version, keyFile, downloadsRepo, buildtoolsRepo)
 
 with addCommand(lambda baseDir, scriptName, opts, args, type: usage(scriptName, type), ('help', '-h', '--help')) as command:
@@ -247,7 +253,7 @@ with addCommand(runBuild, 'build') as command:
   command.addOption('File containing private key and certificates required to sign the package', short='k', long='key', value='file')
   command.addOption('Create a release build', short='r', long='release')
   command.addOption('Create a build for Babelzilla', long='babelzilla')
-  command.supportedTypes = ('gecko')
+  command.supportedTypes = ('gecko', 'kmeleon')
 
 with addCommand(setupTestEnvironment, 'testenv') as command:
   command.shortDescription = 'Set up test environment'
diff --git a/packager.py b/packager.py
index f7f36b2..fca04f7 100644
--- a/packager.py
+++ b/packager.py
@@ -26,8 +26,8 @@ KNOWN_APPS = {
 
 defaultLocale = 'en-US'
 
-def getDefaultFileName(baseDir, metadata, version):
-  return os.path.join(baseDir, '%s-%s.xpi' % (metadata.get('general', 'baseName'), version))
+def getDefaultFileName(baseDir, metadata, version, ext='xpi'):
+  return os.path.join(baseDir, '%s-%s.%s' % (metadata.get('general', 'baseName'), version, ext))
 
 def getMetadataPath(baseDir):
   return os.path.join(baseDir, 'metadata')
@@ -190,8 +190,7 @@ def fixupLocales(baseDir, files, params):
       else:
         files[path] = reference[file]['_origData'].encode('utf-8')
 
-def createChromeJar(baseDir, params):
-  files = {}
+def createChromeJar(baseDir, params, files={}):
   for name, path in getChromeSubdirs(baseDir, params['locales']).iteritems():
     if os.path.isdir(path):
       readFile(files, params, path, name)
diff --git a/packagerKMeleon.py b/packagerKMeleon.py
new file mode 100644
index 0000000..3584371
--- /dev/null
+++ b/packagerKMeleon.py
@@ -0,0 +1,182 @@
+# coding: utf-8
+
+# The contents of this file are subject to the Mozilla Public License
+# Version 1.1 (the "License"); you may not use this file except in
+# compliance with the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+
+import os, subprocess, re, tempfile, shutil, json
+import buildtools.packager as packager
+
+libs = (
+  'libcmt.lib', 'kernel32.lib', 'user32.lib', 'gdi32.lib', 'comctl32.lib',
+  'nspr4.lib', 'plds4.lib', 'plc4.lib', 'xpcom.lib', 'xpcomglue_s.lib',
+  'embed_base_s.lib', 'unicharutil_external_s.lib', 'js3250.lib'
+)
+compileflags = ('-c', '-O1', '-W3', '-MT', '-DXP_WIN', '-Zc:wchar_t-')
+linkflags = ('-DLL', '-NODEFAULTLIB', '-NOLOGO')
+versionflag = '-DABP_VERSION="%s"'
+
+def getKMeleonSourceDir(baseDir):
+  return os.path.join(baseDir, 'kmeleon_src')
+
+def getGeckoDir(baseDir):
+  return os.path.join(getKMeleonSourceDir(baseDir), 'mozilla', 'mozilla', 'dist')
+
+def getBaseExtensionDir(baseDir):
+  return os.path.join(baseDir, 'adblockplus')
+
+def getIncludeDirs(baseDir):
+  yield os.path.join(getKMeleonSourceDir(baseDir), 'src')
+  geckoIncludeDir = os.path.join(getGeckoDir(baseDir), 'include')
+  for dir in ('caps', 'content', 'dom', 'gfx', 'imglib2', 'js', 'layout',
+              'necko', 'nspr', 'pref', 'string', 'webbrwsr', 'widget', 'xpcom',
+              'xpconnect'):
+    yield os.path.join(geckoIncludeDir, dir)
+
+def getLibDirs(baseDir):
+  yield os.path.join(getGeckoDir(baseDir), 'lib')
+
+def getFileList(baseDir, ext):
+  for file in os.listdir(baseDir):
+    path = os.path.join(baseDir, file)
+    if os.path.isfile(path) and file.endswith(ext):
+      yield path
+
+def getSourceFiles(baseDir):
+  return getFileList(baseDir, '.cpp')
+
+def getXULFiles(baseDir):
+  return getFileList(baseDir, '.xul')
+
+def getMacroFiles(baseDir):
+  return getFileList(baseDir, '.kmm')
+
+def getInterfaceFiles(baseDir):
+  return getFileList(baseDir, '.xpt')
+
+def getModuleFiles(baseDir):
+  return getFileList(baseDir, '.jsm')
+
+def getPrefsFiles(baseDir):
+  return getFileList(baseDir, '.js')
+
+def buildDLL(baseDir, fileName, version):
+  tempDir = tempfile.mkdtemp()
+  try:
+    objFiles = []
+    for sourceFile in getSourceFiles(baseDir):
+      objFile = os.path.join(tempDir, os.path.splitext(os.path.basename(sourceFile))[0] + '.obj')
+      objFiles.append(objFile)
+      command = ['cl']
+      command.extend(compileflags)
+      command.append(versionflag % version)
+      command.extend(map(lambda d: '-I%s' % d, getIncludeDirs(baseDir)))
+      command.append(sourceFile)
+      command.append('-Fo%s' % objFile)
+      subprocess.Popen(command).communicate()
+
+    outFile = os.path.join(tempDir, fileName)
+    command = ['link']
+    command.extend(objFiles)
+    command.extend(libs)
+    command.extend(linkflags)
+    command.extend(map(lambda d: '-LIBPATH:%s' % d, getLibDirs(baseDir)))
+    command.append('-OUT:%s' % outFile)
+    subprocess.Popen(command).communicate()
+
+    handle = open(outFile, 'rb')
+    result = handle.read()
+    handle.close()
+    return result
+  finally:
+    shutil.rmtree(tempDir, ignore_errors=True)
+
+def createManifest(baseExtDir, params):
+  localeMetadata = packager.readLocaleMetadata(baseExtDir, params['locales'])
+
+  manifest = {}
+  metadata = params['metadata']
+  manifest['id'] = metadata.get('general', 'id')
+  manifest['version'] = metadata.get('general', 'version')
+  manifest['version'] = params['version']
+  manifest['name'] = localeMetadata[packager.defaultLocale]['name']
+  manifest['description'] = localeMetadata[packager.defaultLocale]['description']
+  manifest['creator'] = metadata.get('general', 'author')
+  manifest['homepage'] = metadata.get('homepage', 'default')
+  if metadata.has_section('contributors'):
+    manifest['contributors'] = map(lambda item: item[1], metadata.items('contributors'))
+    manifest['contributors'].sort()
+  else:
+    manifest['contributors'] = []
+  manifest['translators'] = packager.getTranslators(localeMetadata)
+  return 'var EXPORTED_SYMBOLS = ["manifest"];\nvar manifest = ' + json.dumps(manifest)
+
+def processChromeManifest(data, baseName):
+  # Manifest location is different in K-Meleon, update paths
+  data = re.sub(r'jar:chrome/', 'jar:', data)
+  data = re.sub(r'(\s)modules/', r'\1../modules/%s/' % baseName, data)
+  data = re.sub(r'(\s)defaults/', r'\1../defaults/', data)
+  return data
+
+def createBuild(baseDir, outFile=None, locales=None, buildNum=None, releaseBuild=False):
+  if buildNum == None:
+    buildNum = packager.getBuildNum(baseDir)
+
+  baseExtDir = getBaseExtensionDir(baseDir)
+  if locales == None:
+    locales = packager.getLocales(baseExtDir)
+  elif locales == 'all':
+    locales = packager.getLocales(baseExtDir, True)
+
+  metadata = packager.readMetadata(baseExtDir)
+  version = metadata.get('general', 'version')
+  if not releaseBuild:
+    version += '.' + buildNum
+
+  if outFile == None:
+    outFile = packager.getDefaultFileName(baseDir, metadata, version, 'zip')
+
+  params = {
+    'locales': locales,
+    'releaseBuild': releaseBuild,
+    'buildNum': buildNum,
+    'version': version.encode('utf-8'),
+    'metadata': metadata,
+    'limitMetadata': False,
+  }
+  baseName = metadata.get('general', 'baseName')
+
+  chromeFiles = {}
+  for xulFile in getXULFiles(baseDir):
+    packager.readFile(chromeFiles, params, xulFile, 'content/ui/%s' % os.path.basename(xulFile))
+
+  files = {}
+  files['modules/%s/Manifest.jsm' % baseName] = createManifest(baseExtDir, params)
+  files['kplugins/%s.dll' % baseName] = buildDLL(baseDir, '%s.dll' % baseName, version)
+  files['chrome/%s.jar' % baseName] = packager.createChromeJar(baseExtDir, params, files=chromeFiles)
+
+  packager.readFile(files, params, os.path.join(baseExtDir, 'chrome.manifest'), 'chrome/%s.manifest' % baseName)
+  files['chrome/%s.manifest' % baseName] = processChromeManifest(files['chrome/%s.manifest' % baseName], baseName)
+
+  for macroFile in getMacroFiles(baseDir):
+    packager.readFile(files, params, macroFile, 'macros/%s' % os.path.basename(macroFile))
+  for interfaceFile in getInterfaceFiles(baseDir):
+    packager.readFile(files, params, interfaceFile, 'components/%s' % os.path.basename(interfaceFile))
+  for moduleFile in getModuleFiles(baseDir):
+    packager.readFile(files, params, moduleFile, 'modules/%s/%s' % (baseName, os.path.basename(moduleFile)))
+  for prefsFile in getPrefsFiles(baseDir):
+    packager.readFile(files, params, prefsFile, 'defaults/pref/%s' % os.path.basename(prefsFile))
+
+  packager.readFile(files, params, os.path.join(baseExtDir, 'defaults'), 'defaults')
+  packager.readFile(files, params, os.path.join(baseExtDir, 'modules'), 'modules/%s' %baseName)
+
+  # Correct files names (defaults/preferences/ => defaults/pref/)
+  newFiles = {}
+  for key, value in files.iteritems():
+    if key.startswith('defaults/preferences/'):
+      key = 'defaults/pref/' + key[len('defaults/preferences/'):]
+    newFiles[key] = value
+  files = newFiles
+
+  packager.writeXPI(files, outFile)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/adblock-plus.git



More information about the Pkg-mozext-commits mailing list