forked from openlp/openlp
fixed code according to the merge remarks:
- style guide - use of OpenLP class instead of native QApplication
This commit is contained in:
parent
801a2b17c9
commit
31ddfe24d5
@ -274,7 +274,7 @@ def main():
|
|||||||
# Now create and actually run the application.
|
# Now create and actually run the application.
|
||||||
app = OpenLP(qt_args)
|
app = OpenLP(qt_args)
|
||||||
if sys.platform == 'darwin':
|
if sys.platform == 'darwin':
|
||||||
QtGui.QApplication.addLibraryPath(QtGui.QApplication.applicationDirPath() + "/qt4_plugins")
|
OpenLP.addLibraryPath(QtGui.QApplication.applicationDirPath() + "/qt4_plugins")
|
||||||
#i18n Set Language
|
#i18n Set Language
|
||||||
language = LanguageManager.get_language()
|
language = LanguageManager.get_language()
|
||||||
appTranslator = LanguageManager.get_translator(language)
|
appTranslator = LanguageManager.get_translator(language)
|
||||||
|
@ -1,5 +1,81 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
# -*- encoding: utf-8 -*-
|
# -*- encoding: utf-8 -*-
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# OpenLP - Open Source Lyrics Projection #
|
||||||
|
# --------------------------------------------------------------------------- #
|
||||||
|
# Copyright (c) 2008-2011 Raoul Snyman #
|
||||||
|
# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael #
|
||||||
|
# Gorven, Scott Guerrieri, Meinert Jordan, Armin Köhler, Andreas Preikschat, #
|
||||||
|
# Christian Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon #
|
||||||
|
# Tibble, Carsten Tinggaard, Frode Woldsund #
|
||||||
|
# --------------------------------------------------------------------------- #
|
||||||
|
# This program is free software; you can redistribute it and/or modify it #
|
||||||
|
# under the terms of the GNU General Public License as published by the Free #
|
||||||
|
# Software Foundation; version 2 of the License. #
|
||||||
|
# #
|
||||||
|
# This program is distributed in the hope that it will be useful, but WITHOUT #
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
|
||||||
|
# more details. #
|
||||||
|
# #
|
||||||
|
# You should have received a copy of the GNU General Public License along #
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
|
||||||
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
"""
|
||||||
|
Mac OS X Build Script
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
This script is used to build the OS X binary and the accompanying installer.
|
||||||
|
For this script to work out of the box, it depends on a number of things:
|
||||||
|
|
||||||
|
Python 2.6
|
||||||
|
This build script only works with Python 2.6.
|
||||||
|
|
||||||
|
PyQt4
|
||||||
|
You should already have this installed, OpenLP doesn't work without it. The
|
||||||
|
version the script expects is the packaged one available from River Bank
|
||||||
|
Computing.
|
||||||
|
|
||||||
|
PyInstaller
|
||||||
|
PyInstaller should be a checkout of revision 1355 of trunk, and in a
|
||||||
|
directory which is configured in the openlp.cfg. The revision is very
|
||||||
|
important as there is just included a fix for builds on OS X.
|
||||||
|
|
||||||
|
To install PyInstaller, first checkout trunk from Subversion. The easiest
|
||||||
|
way is to do a
|
||||||
|
|
||||||
|
svn co http://svn.pyinstaller.org/trunk
|
||||||
|
|
||||||
|
Then you need to copy the two hook-*.py files from the "pyinstaller"
|
||||||
|
subdirectory in OpenLP's "resources" directory into PyInstaller's "hooks"
|
||||||
|
directory.
|
||||||
|
|
||||||
|
openlp.cfg
|
||||||
|
The configuration file contains settings of the version string to include
|
||||||
|
in the bundle as well as directory and file settings for different purposes
|
||||||
|
(e.g. PyInstaller location or installer background image)
|
||||||
|
|
||||||
|
To start the build process do a
|
||||||
|
|
||||||
|
make
|
||||||
|
|
||||||
|
inside the resources/osx directory. The result should be a {openlp_dmgname}.dmg
|
||||||
|
file in the same directory. If something went wrong - this sometimes happen
|
||||||
|
with the graphical commands in the Apple script - do a
|
||||||
|
|
||||||
|
make clean
|
||||||
|
|
||||||
|
and start the build process again. If you want to execute only parts of the
|
||||||
|
build process you can specify different make targets
|
||||||
|
|
||||||
|
make view -- runs the Apple scripts to set the icons
|
||||||
|
make package -- creates the dmg file and copies the application files
|
||||||
|
make bundle -- compresses the dmg file and sets the dmg file icon
|
||||||
|
"""
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import os
|
import os
|
||||||
import ConfigParser
|
import ConfigParser
|
||||||
@ -10,43 +86,250 @@ import platform
|
|||||||
import re
|
import re
|
||||||
import subprocess as subp
|
import subprocess as subp
|
||||||
|
|
||||||
|
# set the script name
|
||||||
|
script_name = "build"
|
||||||
|
|
||||||
|
def build_application(settings, app_name_lower, app_dir):
|
||||||
|
logging.info('[%s] now building the app with pyinstaller at "%s"...',
|
||||||
|
script_name, settings['pyinstaller_basedir'])
|
||||||
|
result = os.system('python %s/pyinstaller.py openlp.spec' \
|
||||||
|
% settings['pyinstaller_basedir'])
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] The pyinstaller build reported an error, cannot \
|
||||||
|
continue!', script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
logging.info('[%s] copying the qt_menu files...', script_name)
|
||||||
|
# see http://www.pyinstaller.org/ticket/157
|
||||||
|
result = os.system('cp -R %(qt_menu_directory)s \
|
||||||
|
%(application_directory)s/Contents/Resources' \
|
||||||
|
% { 'qt_menu_directory' : settings['qt_menu_basedir'],
|
||||||
|
'application_directory' : app_dir })
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] could not copy the qt_menu files, cannot \
|
||||||
|
continue!', script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
dist_folder = os.getcwd() + '/dist/' + app_name_lower
|
||||||
|
# logging.info('[%s] copying the additional app files (from %s)...',
|
||||||
|
# script_name, dist_folder)
|
||||||
|
# result = os.system('cp -R %(dist_directory)s/* '
|
||||||
|
# + '%(application_directory)s/Contents/MacOS' \
|
||||||
|
# % { 'dist_directory' : dist_folder,
|
||||||
|
# 'application_directory' : app_dir })
|
||||||
|
# if (result != 0):
|
||||||
|
# logging.error('[%s] could not copy additional files, cannot '
|
||||||
|
# + 'continue!', script_name)
|
||||||
|
# sys.exit(1)
|
||||||
|
|
||||||
|
logging.info('[%s] copying the new plugins...', script_name)
|
||||||
|
result = os.system('cp -R %(openlp_directory)s/openlp/plugins \
|
||||||
|
%(application_directory)s/Contents/MacOS' \
|
||||||
|
% { 'openlp_directory' : settings['openlp_basedir'],
|
||||||
|
'application_directory' : app_dir })
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] could not copy plugins, dmg creation failed!',
|
||||||
|
script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
logging.info('[%s] copying the icons to the resource directory...',
|
||||||
|
script_name)
|
||||||
|
result = os.system('cp %(icon_file)s \
|
||||||
|
%(application_directory)s/Contents/Resources' \
|
||||||
|
% { 'icon_file' : settings['openlp_icon_file'],
|
||||||
|
'application_directory' : app_dir })
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] could not copy the icon, dmg creation failed!',
|
||||||
|
script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
logging.info('[%s] copying the version file...', script_name)
|
||||||
|
result = os.system('CpMac %s/.version %s/Contents/MacOS' % (os.getcwd(),
|
||||||
|
app_dir))
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] could not copy the version file, dmg creation \
|
||||||
|
failed!', script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
logging.info('[%s] copying the new Info.plist...', script_name)
|
||||||
|
result = os.system('cp %(target_directory)s/Info.plist \
|
||||||
|
%(application_directory)s/Contents' \
|
||||||
|
% { 'target_directory' : os.getcwd(),
|
||||||
|
'application_directory' : app_dir })
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] could not copy the info file, dmg creation \
|
||||||
|
failed!', script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def deploy_qt(settings):
|
||||||
|
logging.info('[%s] running mac deploy qt on %s.app...', script_name,
|
||||||
|
settings['openlp_appname']);
|
||||||
|
|
||||||
|
result = os.system('macdeployqt %s.app' % settings['openlp_appname']);
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] could not create dmg file!', script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def create_dmg(settings):
|
||||||
|
logging.info('[%s] creating the dmg...', script_name)
|
||||||
|
dmg_file = os.getcwd() + '/' + settings['openlp_dmgname'] + '.dmg'
|
||||||
|
result = os.system('hdiutil create %(dmg_file)s~ -ov -megabytes \
|
||||||
|
%(vol_size)s -fs HFS+ -volname %(vol_name)s' \
|
||||||
|
% { 'dmg_file' : dmg_file,
|
||||||
|
'vol_size' : '250',
|
||||||
|
'vol_name' : settings['openlp_appname'] })
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] could not create dmg file!', script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
logging.info('[%s] mounting the dmg file...', script_name)
|
||||||
|
output = subp.Popen(["hdiutil", "attach", dmg_file + "~.dmg"],
|
||||||
|
stdout=subp.PIPE).communicate()[0]
|
||||||
|
logging.debug(output)
|
||||||
|
|
||||||
|
p = re.compile('Apple_HFS\s+(.+?)\s*$')
|
||||||
|
result = p.search(output, re.M)
|
||||||
|
volume_basedir = ''
|
||||||
|
if result:
|
||||||
|
volume_basedir = result.group(1)
|
||||||
|
else:
|
||||||
|
logging.error('could not mount dmg file, cannot continue!')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
logging.info('[%s] copying the app (from %s) to the dmg (at %s)...',
|
||||||
|
script_name, app_dir, volume_basedir)
|
||||||
|
result = os.system('CpMac -r %s %s' \
|
||||||
|
% ( app_dir, volume_basedir ))
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] could not copy application, dmg creation failed!',
|
||||||
|
script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
logging.info('[%s] copying the background image...', script_name)
|
||||||
|
# os.mkdir(volume_basedir + '/.background')
|
||||||
|
result = os.system('CpMac %s %s'
|
||||||
|
% (settings['installer_backgroundimage_file'],
|
||||||
|
volume_basedir + '/.installer-background.png'))
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] could not copy the background image, dmg creation\
|
||||||
|
failed!', script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
return (volume_basedir, dmg_file)
|
||||||
|
|
||||||
|
def unmount_dmg(settings, volume_basedir):
|
||||||
|
logging.info('[%s] unmounting the dmg...', script_name)
|
||||||
|
result = os.system('hdiutil detach %s' % volume_basedir)
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] could not unmount the dmg file, dmg creation \
|
||||||
|
failed!', script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def compress_view(settings, seticon_scriptname, dmg_file):
|
||||||
|
logging.info('[%s] setting icon of the dmg file...', script_name)
|
||||||
|
try:
|
||||||
|
f = open(seticon_scriptname)
|
||||||
|
p = subp.Popen(["osascript"], stdin=subp.PIPE)
|
||||||
|
p.communicate(f.read() % ((os.getcwd() + '/' +
|
||||||
|
settings['openlp_dmg_icon_file']), dmg_file))
|
||||||
|
f.close()
|
||||||
|
result = p.returncode
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] could not set the icon to the dmg file, \
|
||||||
|
dmg creation failed!', script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
except IOError, e:
|
||||||
|
logging.error('[%s] could not adjust the view (%s), dmg creation \
|
||||||
|
failed!', script_name, e)
|
||||||
|
sys.exit(1)
|
||||||
|
except OSError, e:
|
||||||
|
logging.error('[%s] could not set the icon to the dmg file(%s), \
|
||||||
|
dmg creation failed!', script_name, e)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def adjust_package_view(settings, adjustview_scriptname):
|
||||||
|
logging.info('[%s] making adjustments to the view...', script_name)
|
||||||
|
try:
|
||||||
|
f = open(adjustview_scriptname)
|
||||||
|
p = subp.Popen(["osascript"], stdin=subp.PIPE)
|
||||||
|
p.communicate(f.read() % ((os.getcwd() + '/' + \
|
||||||
|
settings['openlp_dmg_icon_file']),
|
||||||
|
settings['openlp_appname'],
|
||||||
|
settings['openlp_appname'],
|
||||||
|
settings['openlp_appname']))
|
||||||
|
f.close()
|
||||||
|
result = p.returncode
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] could not adjust the view, dmg creation \
|
||||||
|
failed!', script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
except IOError, e:
|
||||||
|
logging.error('[%s] could not adjust the view (%s), dmg creation \
|
||||||
|
failed!', script_name, e)
|
||||||
|
sys.exit(1)
|
||||||
|
except OSError, e:
|
||||||
|
logging.error('[%s] could not adjust the view (%s), dmg creation \
|
||||||
|
failed!', script_name, e)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def compress_dmg(settings):
|
||||||
|
logging.info('[%s] compress the dmg file...', script_name)
|
||||||
|
result = os.system('hdiutil convert %s~.dmg -format UDZO \
|
||||||
|
-imagekey zlib-level=9 -o %s' \
|
||||||
|
% (dmg_file, dmg_file))
|
||||||
|
if (result != 0):
|
||||||
|
logging.error('[%s] could not compress the dmg file, dmg creation \
|
||||||
|
failed!', script_name)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
# set default actions
|
# set default actions
|
||||||
doBuild = True
|
do_build = True
|
||||||
doCompressView = True
|
do_compress_view = True
|
||||||
doPackageView = True
|
do_package_view = True
|
||||||
doCreateDmg = True
|
do_create_dmg = True
|
||||||
doCompressDmg = True
|
do_compress_dmg = True
|
||||||
doDeployQt = True
|
do_deploy_qt = True
|
||||||
|
|
||||||
# set the script name
|
|
||||||
script_name = "build"
|
|
||||||
|
|
||||||
parser = optparse.OptionParser()
|
parser = optparse.OptionParser()
|
||||||
parser.add_option('-c', '--config', dest = 'config', help = 'config file', metavar = 'CONFIG')
|
parser.add_option('-c', '--config', dest='config', help='config file',
|
||||||
parser.add_option('-v', '--package-view', dest = 'package_view', help = 'triggers view adjustment scripts for package', metavar = 'PACKAGEVIEWONLY', action='store_true', default=False)
|
metavar='CONFIG')
|
||||||
parser.add_option('-y', '--compress-view', dest = 'compress_view', help = 'triggers view adjustment scripts for dmg', metavar = 'COMPRESSVIEWONLY', action='store_true', default=False)
|
parser.add_option('-v', '--package-view', dest='package_view',
|
||||||
parser.add_option('-p', '--package', dest = 'package', help = 'package application folder to dmg', metavar = 'PACKAGE', action='store_true', default=False)
|
help='triggers view adjustment scripts for package',
|
||||||
parser.add_option('-z', '--compress', dest = 'compress', help = 'compresses the existing dmg', metavar = 'COMPRESS', action='store_true', default=False)
|
metavar='PACKAGEVIEWONLY', action='store_true', default=False)
|
||||||
parser.add_option('-b', '--basedir', dest = 'basedir', help = 'volume basedir like /Volumes/OpenLP', metavar = 'BASEDIR', default='/Volumes/OpenLP')
|
parser.add_option('-y', '--compress-view', dest='compress_view',
|
||||||
|
help='triggers view adjustment scripts for dmg',
|
||||||
|
metavar='COMPRESSVIEWONLY', action='store_true', default=False)
|
||||||
|
parser.add_option('-p', '--package', dest='package',
|
||||||
|
help='package application folder to dmg', metavar='PACKAGE',
|
||||||
|
action='store_true', default=False)
|
||||||
|
parser.add_option('-z', '--compress', dest='compress',
|
||||||
|
help='compresses the existing dmg', metavar='COMPRESS',
|
||||||
|
action='store_true', default=False)
|
||||||
|
parser.add_option('-b', '--basedir', dest='basedir',
|
||||||
|
help='volume basedir like /Volumes/OpenLP', metavar='BASEDIR',
|
||||||
|
default='/Volumes/OpenLP')
|
||||||
|
|
||||||
(options, args) = parser.parse_args()
|
(options, args) = parser.parse_args()
|
||||||
|
|
||||||
# if an option is set, false all
|
# if an option is set, false all
|
||||||
if (options.package_view is True or options.compress_view is True or options.package is True or options.compress is True):
|
if (options.package_view is True or options.compress_view is True
|
||||||
doBuild = False
|
or options.package is True or options.compress is True):
|
||||||
doDeployQt = False
|
do_build = False
|
||||||
doPackageView = options.package_view
|
do_deploy_qt = False
|
||||||
doCompressView = options.compress_view
|
do_package_view = options.package_view
|
||||||
doCreateDmg = options.package
|
do_compress_view = options.compress_view
|
||||||
doCompressDmg = options.compress
|
do_create_dmg = options.package
|
||||||
|
do_compress_dmg = options.compress
|
||||||
|
|
||||||
if not options.config:
|
if not options.config:
|
||||||
parser.error('option --config|-c is required')
|
parser.error('option --config|-c is required')
|
||||||
|
|
||||||
logHandler = logging.StreamHandler()
|
logHandler = logging.StreamHandler()
|
||||||
logHandler.setFormatter(logging.Formatter('%(asctime)s %(levelname)-8s %(message)s',
|
logHandler.setFormatter(logging.Formatter(
|
||||||
|
'%(asctime)s %(levelname)-8s %(message)s',
|
||||||
'%a, %d %b %Y %H:%M:%S'))
|
'%a, %d %b %Y %H:%M:%S'))
|
||||||
logging.getLogger().addHandler(logHandler)
|
logging.getLogger().addHandler(logHandler)
|
||||||
logging.getLogger().setLevel(logging.DEBUG)
|
logging.getLogger().setLevel(logging.DEBUG)
|
||||||
@ -60,25 +343,29 @@ if __name__ == '__main__':
|
|||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if not sys.platform == "darwin":
|
if not sys.platform == "darwin":
|
||||||
logging.error('[%s] this script only works on Macintosh OS X systems, not on %s',
|
logging.error('[%s] this script only works on Macintosh OS X systems,'
|
||||||
script_name, sys.platform)
|
+ 'not on %s', script_name, sys.platform)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
version = platform.mac_ver()[0]
|
version = platform.mac_ver()[0]
|
||||||
# we only need the differenciation between leopard and snow leopard
|
# we only need the differenciation between leopard and snow leopard
|
||||||
if version.startswith("10.6"):
|
if version.startswith("10.6"):
|
||||||
SNOWLEOPARD = True
|
SNOWLEOPARD = True
|
||||||
logging.info('[%s] using snow leopard scripts (version = %s)', script_name, version)
|
logging.info('[%s] using snow leopard scripts (version = %s)',
|
||||||
|
script_name, version)
|
||||||
adjustview_scriptname = "applescript-adjustview-10-6.master"
|
adjustview_scriptname = "applescript-adjustview-10-6.master"
|
||||||
seticon_scriptname = "applescript-seticon-10-6.master"
|
seticon_scriptname = "applescript-seticon-10-6.master"
|
||||||
else:
|
else:
|
||||||
SNOWLEOPARD = False
|
SNOWLEOPARD = False
|
||||||
logging.info('[%s] using leopard scripts (version = %s)', script_name, version)
|
logging.info('[%s] using leopard scripts (version = %s)', script_name,
|
||||||
|
version)
|
||||||
adjustview_scriptname = "applescript-adjustview-10-5.master"
|
adjustview_scriptname = "applescript-adjustview-10-5.master"
|
||||||
seticon_scriptname = "applescript-seticon-10-5.master"
|
seticon_scriptname = "applescript-seticon-10-5.master"
|
||||||
|
|
||||||
if not os.path.isfile(adjustview_scriptname) or not os.path.isfile(seticon_scriptname):
|
if not os.path.isfile(adjustview_scriptname) \
|
||||||
logging.error('[%s] could not find apple scripts for given mac version %s', script_name, version)
|
or not os.path.isfile(seticon_scriptname):
|
||||||
|
logging.error('[%s] could not find apple scripts for given OS X '
|
||||||
|
+ 'version %s', script_name, version)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
settings = dict()
|
settings = dict()
|
||||||
@ -86,176 +373,50 @@ if __name__ == '__main__':
|
|||||||
settings[k] = config.get('openlp', k)
|
settings[k] = config.get('openlp', k)
|
||||||
|
|
||||||
# prepare the configuration files
|
# prepare the configuration files
|
||||||
os.system('python expander.py --config %(config_file)s --template openlp.spec.master --expandto %(target_directory)s/openlp.spec' \
|
os.system('python expander.py --config %(config_file)s \
|
||||||
|
--template openlp.spec.master \
|
||||||
|
--expandto %(target_directory)s/openlp.spec' \
|
||||||
% { 'config_file' : options.config, 'target_directory' : os.getcwd() })
|
% { 'config_file' : options.config, 'target_directory' : os.getcwd() })
|
||||||
os.system('python expander.py --config %(config_file)s --template Info.plist.master --expandto %(target_directory)s/Info.plist' \
|
os.system('python expander.py --config %(config_file)s \
|
||||||
|
--template Info.plist.master \
|
||||||
|
--expandto %(target_directory)s/Info.plist' \
|
||||||
% { 'config_file' : options.config, 'target_directory' : os.getcwd() })
|
% { 'config_file' : options.config, 'target_directory' : os.getcwd() })
|
||||||
os.system('python expander.py --config %(config_file)s --template version.master --expandto %(target_directory)s/.version' \
|
os.system('python expander.py --config %(config_file)s \
|
||||||
|
--template version.master \
|
||||||
|
--expandto %(target_directory)s/.version' \
|
||||||
% { 'config_file' : options.config, 'target_directory' : os.getcwd() })
|
% { 'config_file' : options.config, 'target_directory' : os.getcwd() })
|
||||||
|
|
||||||
# prepare variables
|
# prepare variables
|
||||||
app_name = settings['openlp_appname'].lower()
|
app_name_lower = settings['openlp_appname'].lower()
|
||||||
app_dir = os.getcwd() + '/' + settings['openlp_appname'] + '.app'
|
app_dir = os.getcwd() + '/' + settings['openlp_appname'] + '.app'
|
||||||
|
|
||||||
# if the view option is set, skip the building steps
|
# if the view option is set, skip the building steps
|
||||||
if (doBuild is True):
|
if (do_build is True):
|
||||||
logging.info('[%s] now building the app with pyinstaller at "%s"...', script_name, settings['pyinstaller_basedir'])
|
build_application(settings, app_name_lower, app_dir)
|
||||||
result = os.system('python %s/pyinstaller.py openlp.spec' \
|
|
||||||
% settings['pyinstaller_basedir'])
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] The pyinstaller build reported an error, cannot continue!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
logging.info('[%s] copying the qt_menu files...', script_name)
|
if (do_deploy_qt is True):
|
||||||
# see http://www.pyinstaller.org/ticket/157
|
deploy_qt(settings)
|
||||||
result = os.system('cp -R %(qt_menu_directory)s %(application_directory)s/Contents/Resources' \
|
|
||||||
% { 'qt_menu_directory' : settings['qt_menu_basedir'],
|
|
||||||
'application_directory' : app_dir })
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] could not copy the qt_menu files, cannot continue!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
dist_folder = os.getcwd() + '/dist/' + app_name
|
|
||||||
# logging.info('[%s] copying the additional app files (from %s)...', script_name, dist_folder)
|
|
||||||
# result = os.system('cp -R %(dist_directory)s/* %(application_directory)s/Contents/MacOS' \
|
|
||||||
# % { 'dist_directory' : dist_folder,
|
|
||||||
# 'application_directory' : app_dir })
|
|
||||||
# if (result != 0):
|
|
||||||
# logging.error('[%s] could not copy additional files, cannot continue!', script_name)
|
|
||||||
# sys.exit(1)
|
|
||||||
|
|
||||||
logging.info('[%s] copying the new plugins...', script_name)
|
|
||||||
result = os.system('cp -R %(openlp_directory)s/openlp/plugins %(application_directory)s/Contents/MacOS' \
|
|
||||||
% { 'openlp_directory' : settings['openlp_basedir'],
|
|
||||||
'application_directory' : app_dir })
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] could not copy plugins, dmg creation failed!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
logging.info('[%s] copying the icons to the resource directory...', script_name)
|
|
||||||
result = os.system('cp %(icon_file)s %(application_directory)s/Contents/Resources' \
|
|
||||||
% { 'icon_file' : settings['openlp_icon_file'],
|
|
||||||
'application_directory' : app_dir })
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] could not copy the icon, dmg creation failed!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
logging.info('[%s] copying the version file...', script_name)
|
|
||||||
result = os.system('CpMac %s/.version %s/Contents/MacOS' % (os.getcwd(), app_dir))
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] could not copy the version file, dmg creation failed!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
logging.info('[%s] copying the new Info.plist...', script_name)
|
|
||||||
result = os.system('cp %(target_directory)s/Info.plist %(application_directory)s/Contents' \
|
|
||||||
% { 'target_directory' : os.getcwd(),
|
|
||||||
'application_directory' : app_dir })
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] could not copy the info file, dmg creation failed!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if (doDeployQt is True):
|
|
||||||
logging.info('[%s] running mac deploy qt on %s.app...', script_name, settings['openlp_appname']);
|
|
||||||
|
|
||||||
result = os.system('macdeployqt %s.app' % settings['openlp_appname']);
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] could not create dmg file!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if (doCreateDmg is True):
|
|
||||||
logging.info('[%s] creating the dmg...', script_name)
|
|
||||||
dmg_file = os.getcwd() + '/' + settings['openlp_dmgname'] + '.dmg'
|
|
||||||
result = os.system('hdiutil create %(dmg_file)s~ -ov -megabytes %(vol_size)s -fs HFS+ -volname %(vol_name)s' \
|
|
||||||
% { 'dmg_file' : dmg_file,
|
|
||||||
'vol_size' : '250',
|
|
||||||
'vol_name' : settings['openlp_appname'] })
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] could not create dmg file!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
logging.info('[%s] mounting the dmg file...', script_name)
|
|
||||||
output = subp.Popen(["hdiutil", "attach", dmg_file + "~.dmg"], stdout=subp.PIPE).communicate()[0]
|
|
||||||
logging.debug(output)
|
|
||||||
|
|
||||||
p = re.compile('Apple_HFS\s+(.+?)\s*$')
|
|
||||||
result = p.search(output, re.M)
|
|
||||||
volume_basedir = ''
|
|
||||||
if result:
|
|
||||||
volume_basedir = result.group(1)
|
|
||||||
else:
|
|
||||||
logging.error('could not mount dmg file, cannot continue!')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
logging.info('[%s] copying the app (from %s) to the dmg (at %s)...', script_name, app_dir, volume_basedir)
|
|
||||||
result = os.system('CpMac -r %s %s' \
|
|
||||||
% ( app_dir, volume_basedir ))
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] could not copy application, dmg creation failed!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
logging.info('[%s] copying the background image...', script_name)
|
|
||||||
# os.mkdir(volume_basedir + '/.background')
|
|
||||||
result = os.system('CpMac %s %s' % (settings['installer_backgroundimage_file'], volume_basedir + '/.installer-background.png'))
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] could not copy the background image, dmg creation failed!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
if (do_create_dmg is True):
|
||||||
|
(volume_basedir, dmg_file) = create_dmg(settings)
|
||||||
else:
|
else:
|
||||||
# setting base dir
|
# setting base dir
|
||||||
volume_basedir = options.basedir
|
volume_basedir = options.basedir
|
||||||
dmg_file = os.getcwd() + '/' + settings['openlp_dmgname'] + '.dmg'
|
dmg_file = os.getcwd() + '/' + settings['openlp_dmgname'] + '.dmg'
|
||||||
|
|
||||||
if (doPackageView is True):
|
if (do_package_view is True):
|
||||||
logging.info('[%s] making adjustments to the view...', script_name)
|
adjust_package_view(settings, adjustview_scriptname)
|
||||||
try:
|
|
||||||
f = open(adjustview_scriptname)
|
|
||||||
p = subp.Popen(["osascript"], stdin=subp.PIPE)
|
|
||||||
p.communicate(f.read() % ((os.getcwd() + '/' + settings['openlp_dmg_icon_file']), settings['openlp_appname'], settings['openlp_appname'], settings['openlp_appname']))
|
|
||||||
f.close()
|
|
||||||
result = p.returncode
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] could not adjust the view, dmg creation failed!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
except IOError, e:
|
|
||||||
logging.error('[%s] could not adjust the view (%s), dmg creation failed!', script_name, e)
|
|
||||||
sys.exit(1)
|
|
||||||
except OSError, e:
|
|
||||||
logging.error('[%s] could not adjust the view (%s), dmg creation failed!', script_name, e)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if (doCreateDmg is True):
|
if (do_create_dmg is True):
|
||||||
logging.info('[%s] unmounting the dmg...', script_name)
|
unmount_dmg(settings, volume_basedir)
|
||||||
result = os.system('hdiutil detach %s' % volume_basedir)
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] could not unmount the dmg file, dmg creation failed!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if (doCompressDmg is True):
|
if (do_compress_dmg is True):
|
||||||
logging.info('[%s] compress the dmg file...', script_name)
|
compress_dmg(settings)
|
||||||
result = os.system('hdiutil convert %s~.dmg -format UDZO -imagekey zlib-level=9 -o %s' \
|
|
||||||
% (dmg_file, dmg_file))
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] could not compress the dmg file, dmg creation failed!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if (doCompressView is True):
|
if (do_compress_view is True):
|
||||||
logging.info('[%s] setting icon of the dmg file...', script_name)
|
compress_view(settings, seticon_scriptname, dmg_file)
|
||||||
try:
|
|
||||||
f = open(seticon_scriptname)
|
|
||||||
p = subp.Popen(["osascript"], stdin=subp.PIPE)
|
|
||||||
p.communicate(f.read() % ((os.getcwd() + '/' + settings['openlp_dmg_icon_file']), dmg_file))
|
|
||||||
f.close()
|
|
||||||
result = p.returncode
|
|
||||||
if (result != 0):
|
|
||||||
logging.error('[%s] could not set the icon to the dmg file, dmg creation failed!', script_name)
|
|
||||||
sys.exit(1)
|
|
||||||
except IOError, e:
|
|
||||||
logging.error('[%s] could not adjust the view (%s), dmg creation failed!', script_name, e)
|
|
||||||
sys.exit(1)
|
|
||||||
except OSError, e:
|
|
||||||
logging.error('[%s] could not set the icon to the dmg file(%s), dmg creation failed!', script_name, e)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if (doCompressDmg is True):
|
if (do_compress_dmg is True):
|
||||||
logging.info('[%s] finished creating dmg file, resulting file is "%s"', script_name, dmg_file)
|
logging.info('[%s] finished creating dmg file, resulting file is "%s"',
|
||||||
|
script_name, dmg_file)
|
||||||
|
|
||||||
|
@ -15,12 +15,15 @@ import sys
|
|||||||
# variable expansion:
|
# variable expansion:
|
||||||
# - %(dog)s --- normal python expansion
|
# - %(dog)s --- normal python expansion
|
||||||
# - %(dog%)s --- no python expansion, leave as is (stripping the trailing %)
|
# - %(dog%)s --- no python expansion, leave as is (stripping the trailing %)
|
||||||
# - %(dog:cat) --- if there is an expansion for dog, dog will be used; otherwise if cat exists cat will be used
|
# - %(dog:cat) --- if there is an expansion for dog, dog will be used;
|
||||||
# - %(dog=cat) --- if there is an expansion for dog, dog will be used; otherwise "cat" will be used
|
# otherwise if cat exists cat will be used
|
||||||
# reConf = re.compile(r'(?<!%)%\((?P<key>[^\(]+?)\)s')
|
# - %(dog=cat) --- if there is an expansion for dog, dog will be used;
|
||||||
reConf = re.compile(r'(?P<verbatim>%?)%\((?P<key>[^+=:&\)]+?)(?:(?P<kind>[+=:&])(?P<default>[^\)]+))?\)(?P<type>s|d)')
|
# otherwise "cat" will be used
|
||||||
|
# re_conf = re.compile(r'(?<!%)%\((?P<key>[^\(]+?)\)s')
|
||||||
|
re_conf = re.compile(r'(?P<verbatim>%?)%\((?P<key>[^+=:&\)]+?)'
|
||||||
|
+ '(?:(?P<kind>[+=:&])(?P<default>[^\)]+))?\)(?P<type>s|d)')
|
||||||
|
|
||||||
def expandVariable(match, expansions, errors):
|
def expand_variable(match, expansions, errors):
|
||||||
key = match.group('key')
|
key = match.group('key')
|
||||||
kind = match.group('kind')
|
kind = match.group('kind')
|
||||||
default = match.group('default')
|
default = match.group('default')
|
||||||
@ -74,10 +77,14 @@ if __name__ == '__main__':
|
|||||||
|
|
||||||
# get config file
|
# get config file
|
||||||
parser = optparse.OptionParser()
|
parser = optparse.OptionParser()
|
||||||
parser.add_option('-c', '--config', dest = 'config', help = 'config file', metavar = 'CONFIG')
|
parser.add_option('-c', '--config', dest='config',
|
||||||
parser.add_option('-t', '--template', dest = 'template', help = 'template file', metavar = 'TEMPLATE')
|
help='config file', metavar='CONFIG')
|
||||||
parser.add_option('-x', '--expandto', dest = 'expanded', help = 'expanded file', metavar = 'EXPANDED')
|
parser.add_option('-t', '--template', dest='template',
|
||||||
parser.add_option('-e', '--echo', dest = 'echo', help = 'echo variable', metavar = 'ECHOVAR')
|
help='template file', metavar='TEMPLATE')
|
||||||
|
parser.add_option('-x', '--expandto', dest='expanded',
|
||||||
|
help='expanded file', metavar='EXPANDED')
|
||||||
|
parser.add_option('-e', '--echo', dest='echo',
|
||||||
|
help='echo variable', metavar='ECHOVAR')
|
||||||
|
|
||||||
(options, args) = parser.parse_args()
|
(options, args) = parser.parse_args()
|
||||||
|
|
||||||
@ -89,13 +96,14 @@ if __name__ == '__main__':
|
|||||||
if not options.template:
|
if not options.template:
|
||||||
parser.error('option --template|-t is required')
|
parser.error('option --template|-t is required')
|
||||||
if not os.path.exists(options.template):
|
if not os.path.exists(options.template):
|
||||||
parser.error('template file "%s" does not exist' % options.template)
|
parser.error('template file "%s" does not exist' \
|
||||||
|
% options.template)
|
||||||
if not options.expanded:
|
if not options.expanded:
|
||||||
parser.error('option --expandto|-e is required')
|
parser.error('option --expandto|-e is required')
|
||||||
|
|
||||||
logHandler = logging.StreamHandler()
|
logHandler = logging.StreamHandler()
|
||||||
logHandler.setFormatter(logging.Formatter('%(asctime)s %(levelname)-8s %(message)s',
|
logHandler.setFormatter(logging.Formatter('%(asctime)s %(levelname)-8s '
|
||||||
'%a, %d %b %Y %H:%M:%S'))
|
+ ' %(message)s', '%a, %d %b %Y %H:%M:%S'))
|
||||||
logging.getLogger().addHandler(logHandler)
|
logging.getLogger().addHandler(logHandler)
|
||||||
logging.getLogger().setLevel(logging.DEBUG)
|
logging.getLogger().setLevel(logging.DEBUG)
|
||||||
|
|
||||||
@ -103,8 +111,8 @@ if __name__ == '__main__':
|
|||||||
config.readfp(open(options.config, 'r'))
|
config.readfp(open(options.config, 'r'))
|
||||||
|
|
||||||
if not config.has_section('openlp'):
|
if not config.has_section('openlp'):
|
||||||
logging.error('[expander] %s: config file "%s" lacks an [openlp] section',
|
logging.error('[expander] %s: config file "%s" lacks an [openlp] '
|
||||||
options.template, options.config)
|
+ 'section', options.template, options.config)
|
||||||
|
|
||||||
expansions = dict()
|
expansions = dict()
|
||||||
for k in config.options('openlp'):
|
for k in config.options('openlp'):
|
||||||
@ -125,12 +133,10 @@ if __name__ == '__main__':
|
|||||||
else:
|
else:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
# closure to capture expansions and errors variable
|
# closure to capture expansions and errors variable
|
||||||
errors = []
|
errors = []
|
||||||
expanded = []
|
expanded = []
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# try to expand the template
|
# try to expand the template
|
||||||
line = 0
|
line = 0
|
||||||
@ -141,14 +147,15 @@ if __name__ == '__main__':
|
|||||||
template.close()
|
template.close()
|
||||||
|
|
||||||
def _expand(m):
|
def _expand(m):
|
||||||
return expandVariable(m, expansions = expansions, errors = errors)
|
return expand_variable(m, expansions = expansions, errors = errors)
|
||||||
|
|
||||||
for l in raw:
|
for l in raw:
|
||||||
line += 1
|
line += 1
|
||||||
exp = reConf.sub(_expand, l)
|
exp = re_conf.sub(_expand, l)
|
||||||
if errors:
|
if errors:
|
||||||
for key in errors:
|
for key in errors:
|
||||||
logging.error('[expander] %s: line %d: could not expand key "%s"', options.template, line, key)
|
logging.error('[expander] %s: line %d: could not expand '
|
||||||
|
+ 'key "%s"', options.template, line, key)
|
||||||
faulty = True
|
faulty = True
|
||||||
errors = []
|
errors = []
|
||||||
else:
|
else:
|
||||||
@ -157,17 +164,18 @@ if __name__ == '__main__':
|
|||||||
if faulty:
|
if faulty:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
# successfully expanded template, now backup potentially existing target file
|
# successfully expanded template, now backup potentially existing
|
||||||
|
# target file
|
||||||
targetFile = options.expanded % expansions
|
targetFile = options.expanded % expansions
|
||||||
if os.path.exists(targetFile):
|
if os.path.exists(targetFile):
|
||||||
if os.path.exists('%s~' % targetFile):
|
if os.path.exists('%s~' % targetFile):
|
||||||
os.unlink('%s~' % targetFile)
|
os.unlink('%s~' % targetFile)
|
||||||
os.rename(options.expanded, '%s~' % targetFile)
|
os.rename(options.expanded, '%s~' % targetFile)
|
||||||
logging.info('[expander] %s: backed up existing target file "%s" to "%s"',
|
logging.info('[expander] %s: backed up existing target file "%s" '
|
||||||
options.template, targetFile, '%s~' % options.expanded)
|
+ 'to "%s"', options.template, targetFile,
|
||||||
|
'%s~' % options.expanded)
|
||||||
|
|
||||||
|
# make sure that target directory exists
|
||||||
# TODO: make sure that target directory exists
|
|
||||||
targetDir = os.path.dirname(targetFile)
|
targetDir = os.path.dirname(targetFile)
|
||||||
if not os.path.exists(targetDir):
|
if not os.path.exists(targetDir):
|
||||||
os.makedirs(targetDir)
|
os.makedirs(targetDir)
|
||||||
@ -179,8 +187,8 @@ if __name__ == '__main__':
|
|||||||
target.write(exp)
|
target.write(exp)
|
||||||
target.close()
|
target.close()
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
logging.error('[expander] %s: could not expand to "%s"', options.template, options.expaned, e)
|
logging.error('[expander] %s: could not expand to "%s"',
|
||||||
|
options.template, options.expaned, e)
|
||||||
|
|
||||||
# copy over file access mode from template
|
# copy over file access mode from template
|
||||||
mode = os.stat(options.template)
|
mode = os.stat(options.template)
|
||||||
@ -189,7 +197,6 @@ if __name__ == '__main__':
|
|||||||
logging.info('[expander] expanded "%s" to "%s"',
|
logging.info('[expander] expanded "%s" to "%s"',
|
||||||
options.template, options.expanded)
|
options.template, options.expanded)
|
||||||
|
|
||||||
|
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user