Final changes to improve and cleanup build process for osx:

- fix setting dmg icon, dmg background
- remove old files
- cleanup build script
- fix paths

bzr-revno: 2
This commit is contained in:
Martin Zibricky 2012-07-01 21:32:14 +02:00 committed by Andreas Preikschat
commit 6d2290ae49
8 changed files with 75 additions and 322 deletions

0
osx/DmgImageInstallBackground.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

@ -1,28 +0,0 @@
all:
python build.py -c openlp.cfg
view:
python build.py -c openlp.cfg --package-view --compress-view
package:
python build.py -c openlp.cfg --package --package-view
bundle:
python build.py -c openlp.cfg --compress --compress-view
clean:
# remove old configuration files
rm -f openlp.spec
rm -f Info.plist
rm -f .version
# remove old build artifacts
rm -rf build
rm -rf dist
rm -rf Macopenlp.app
rm -rf OpenLP.app
rm -f warnopenlp.txt
rm -f *dmg

View File

@ -1,43 +1,6 @@
on saveImageWithItselfAsIcon(icon_image_file)
-- save icon_image_file with itself as icon
set icon_image_file_string to icon_image_file as string
tell application "Image Events"
launch
set icon_image to open file icon_image_file_string
save icon_image with icon
close icon_image
end tell
end saveImageWithItselfAsIcon
on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder)
tell application "Finder" to set f to aFileOrFolderWithIcon as alias
-- grab the file's icon
my CopyOrPaste(f, "c")
-- now the icon is in the clipboard
tell application "Finder" to set c to aFileOrFolder as alias
my CopyOrPaste(result, "v")
end copyIconOfTo
on CopyOrPaste(i, cv)
tell application "Finder"
activate
set infoWindow to open information window of i
set infoWindowName to name of infoWindow
end tell
tell application "System Events" to tell process "Finder" to tell window infoWindowName
keystroke tab -- select icon button
keystroke (cv & "w") using command down (* (copy or paste) + close window *)
end tell -- window 1 then process Finder then System Events
end CopyOrPaste
on run
set icon_image_file to POSIX file "%s" as alias
set dmg_file to POSIX file "/Volumes/%s" as alias
my saveImageWithItselfAsIcon(icon_image_file)
-- wait for virus scanner
delay 2
my copyIconOfTo(icon_image_file, dmg_file)
tell application "Finder"
tell disk "%s"

View File

@ -1,74 +0,0 @@
on saveImageWithItselfAsIcon(icon_image_file)
-- save icon_image_file with itself as icon
set icon_image_file_string to icon_image_file as string
tell application "Image Events"
launch
set icon_image to open file icon_image_file_string
save icon_image with icon
close icon_image
end tell
end saveImageWithItselfAsIcon
on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder)
tell application "Finder" to set f to aFileOrFolderWithIcon as alias
-- grab the file's icon
my CopyOrPaste(f, "c")
-- now the icon is in the clipboard
tell application "Finder" to set c to aFileOrFolder as alias
my CopyOrPaste(result, "v")
end copyIconOfTo
on CopyOrPaste(i, cv)
tell application "Finder"
activate
open information window of i
end tell
tell application "System Events" to tell process "Finder" to tell window 1
keystroke tab -- select icon button
keystroke (cv & "w") using command down (* (copy or paste) + close window *)
end tell -- window 1 then process Finder then System Events
end CopyOrPaste
on run
set icon_image_file to POSIX file "%s" as alias
set dmg_file to POSIX file "/Volumes/%s" as alias
my saveImageWithItselfAsIcon(icon_image_file)
-- wait for virus scanner
delay 2
my copyIconOfTo(icon_image_file, dmg_file)
tell application "Finder"
tell disk "%s"
open
set current view of container window to icon view
set toolbar visible of container window to false
set statusbar visible of container window to false
set the bounds of container window to {400, 100, 1100, 500}
set theViewOptions to the icon view options of container window
set arrangement of theViewOptions to not arranged
set icon size of theViewOptions to 128
set background picture of theViewOptions to file ".background:installer-background.png"
if not exists file "Applications" then
make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
end if
delay 5
set position of item "%s" of container window to {160, 200}
set position of item ".Trashes" of container window to {100, 500}
set position of item ".installer-background.png" of container window to {200, 500}
set position of item ".DS_Store" of container window to {400, 500}
set position of item "Applications" of container window to {550, 200}
set position of item ".VolumeIcon.icns" of container window to {500, 500}
set position of item ".fseventsd" of container window to {300, 500}
if exists POSIX file ".SymAVx86QSFile" then
set position of item ".SymAVx86QSFile" of container window to {600, 500}
end if
open
close
update without registering applications
-- wait until the virus scan completes
delay 5
-- eject
end tell
end tell
end run

View File

@ -1,40 +0,0 @@
on saveImageWithItselfAsIcon(icon_image_file)
-- save icon_image_file with itself as icon
set icon_image_file_string to icon_image_file as string
tell application "Image Events"
launch
set icon_image to open file icon_image_file_string
save icon_image with icon
close icon_image
end tell
end saveImageWithItselfAsIcon
on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder)
tell application "Finder" to set f to aFileOrFolderWithIcon as alias
-- grab the file's icon
my CopyOrPaste(f, "c")
-- now the icon is in the clipboard
tell application "Finder" to set c to aFileOrFolder as alias
my CopyOrPaste(result, "v")
end copyIconOfTo
on CopyOrPaste(i, cv)
tell application "Finder"
activate
open information window of i
end tell
tell application "System Events" to tell process "Finder" to tell window 1
keystroke tab -- select icon button
keystroke (cv & "w") using command down (* (copy or paste) + close window *)
end tell -- window 1 then process Finder then System Events
end CopyOrPaste
on run
set icon_image_file to POSIX file "%s" as alias
set dmg_file to POSIX file "%s" as alias
my saveImageWithItselfAsIcon(icon_image_file)
-- wait for virus scanner
delay 2
my copyIconOfTo(icon_image_file, dmg_file)
end run

View File

@ -1,41 +0,0 @@
on saveImageWithItselfAsIcon(icon_image_file)
-- save icon_image_file with itself as icon
set icon_image_file_string to icon_image_file as string
tell application "Image Events"
launch
set icon_image to open file icon_image_file_string
save icon_image with icon
close icon_image
end tell
end saveImageWithItselfAsIcon
on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder)
tell application "Finder" to set f to aFileOrFolderWithIcon as alias
-- grab the file's icon
my CopyOrPaste(f, "c")
-- now the icon is in the clipboard
tell application "Finder" to set c to aFileOrFolder as alias
my CopyOrPaste(result, "v")
end copyIconOfTo
on CopyOrPaste(i, cv)
tell application "Finder"
activate
set infoWindow to open information window of i
set infoWindowName to name of infoWindow
end tell
tell application "System Events" to tell process "Finder" to tell window infoWindowName
keystroke tab -- select icon button
keystroke (cv & "w") using command down (* (copy or paste) + close window *)
end tell -- window 1 then process Finder then System Events
end CopyOrPaste
on run
set icon_image_file to POSIX file "%s" as alias
set dmg_file to POSIX file "%s" as alias
my saveImageWithItselfAsIcon(icon_image_file)
-- wait for virus scanner
delay 2
my copyIconOfTo(icon_image_file, dmg_file)
end run

View File

@ -1,6 +1,6 @@
[executables]
sphinx = sphinx-build
pyinstaller = %(here)s/../pyinstaller/pyinstaller.py
pyinstaller = %(projects)s/pyinstaller/pyinstaller.py
lrelease = lrelease
diskutil = diskutil
hdiutil = hdiutil

View File

@ -205,14 +205,13 @@ class MacosxBuilder(object):
"""
parser = ArgumentParser()
parser.add_argument('-b', '--branch', metavar='BRANCH', dest='branch',
help='Specify the path to the branch you wish to build.',
default='../trunk')
help='Specify the path to the branch you wish to build.')
parser.add_argument('--devel', dest='devel',
action='store_true', default=False,
help='Development build does not have set icons for .dmg file '
'and .dmg filename contains bzr revision number.')
parser.add_argument('-d', '--documentation', metavar='DOCS',
dest='docs', default=os.path.join('..', 'documentation'),
dest='docs',
help='Specify the path to the documentation branch.')
parser.add_argument('-c', '--config', metavar='CONFIG', dest='config',
help='Specify the path to the configuration file.',
@ -226,6 +225,10 @@ class MacosxBuilder(object):
parser.add_argument('--transifex',
dest='update_translations', action='store_true', default=False,
help='Update the language translation from Transifex.')
parser.add_argument('--transifex-user',
dest='transifex_user', help='Transifex username.')
parser.add_argument('--transifex-pass',
dest='transifex_pass', help='Transifex password.')
parser.add_argument('-v', '--verbose', dest='verbose',
action='store_true', default=False,
help='Print out additional information.')
@ -236,7 +239,9 @@ class MacosxBuilder(object):
Read the configuration from the configuration file.
"""
self.config = ConfigParser(defaults={
u'here': self.script_path
u'here': self.script_path,
u'projects': os.path.abspath(os.path.join(self.script_path,
'..', '..')),
})
self.config.read(os.path.abspath(self.args.config))
@ -264,18 +269,16 @@ class MacosxBuilder(object):
Set up a variety of paths that we use throughout the build process.
"""
if self.args.branch:
branch_path = self.args.branch
self.branch_path = os.path.abspath(self.args.branch)
else:
branch_path = self.config.get(u'paths', u'branch')
self.branch_path = os.path.abspath(branch_path)
self.branch_path = self.config.get(u'paths', u'branch')
if self.args.docs:
docs_path = self.args.docs
self.docs_path = os.path.abspath(self.args.docs)
else:
docs_path = self.config.get(u'paths', u'documentation')
self.docs_path = os.path.abspath(docs_path)
self.docs_path = self.config.get(u'paths', u'documentation')
self.openlp_script = os.path.abspath(
os.path.join(branch_path, u'openlp.pyw'))
os.path.join(self.branch_path, u'openlp.pyw'))
self.hooks_path = os.path.abspath(os.path.join(
self.branch_path, self.config.get(u'paths', u'hooks')))
self.mac_icon = os.path.abspath(
@ -371,11 +374,10 @@ class MacosxBuilder(object):
raise Exception(u'Error running bzr log')
output_ascii = unicode(output, errors=u'ignore')
latest = output_ascii.split(u':')[0]
version_string = latest == revision and tag or \
u'%s-bzr%s' % (tag, latest)
self.version_string = version_string
self.version_string = u'%s-bzr%s' % (tag, latest)
self.version_tag = tag
version_file = open(os.path.join(self.dist_path, u'.version'), u'w')
version_file.write(version_string)
version_file.write(self.version_string)
version_file.close()
def copy_plugins(self):
@ -450,8 +452,14 @@ class MacosxBuilder(object):
raise Exception(u'No option named "username" found.')
if not self.config.has_option('transifex', 'password'):
raise Exception(u'No option named "password" found.')
username = self.config.get(u'transifex', u'username')
password = self.config.get(u'transifex', u'password')
if self.args.transifex_user:
username = self.args.transifex_user
else:
username = self.config.get(u'transifex', u'username')
if self.args.transifex_pass:
password = self.args.transifex_pass
else:
password = self.config.get(u'transifex', u'password')
os.chdir(os.path.split(self.i18n_utils)[0])
translation_utils = Popen([self.python, self.i18n_utils, u'-qdpu',
u'-U', username, u'-P', password])
@ -513,7 +521,12 @@ class MacosxBuilder(object):
"""
self._print(u'Creating dmg file...')
dmg_name = 'OpenLP-' + self.version_string + '.dmg'
# Release version does not contain revision in .dmg name.
if self.args.devel:
dmg_name = 'OpenLP-' + self.version_string + '.dmg'
else:
dmg_name = 'OpenLP-' + self.version_tag + '.dmg'
dmg_file = os.path.join(self.branch_path, 'build', dmg_name)
# Remove dmg if it exists.
if os.path.exists(dmg_file):
@ -548,13 +561,33 @@ class MacosxBuilder(object):
u'Could not copy app bundle, dmg creation failed.'
)
self._print('... Copying the background image.')
os.mkdir(os.path.join(dmg_volume_path, '.background'))
self._run_command(['cp', self.dmg_background_img,
os.path.join(dmg_volume_path,
'.background/installer-background.png')],
u'Could not copy the background image, dmg creation failed.'
# Set icon for dmg file.
# http://endrift.com/blog/2010/06/14/dmg-files-volume-icons-cli/
self._print('... Setting the dmg icon.')
dmg_icon = os.path.join(dmg_volume_path, '.VolumeIcon.icns')
self._run_command(['cp', self.mac_icon, dmg_icon],
u'Could not copy the dmg icon file, dmg creation failed.'
)
# Set proper dmg icon attributes.
self._run_command(['SetFile', '-c', 'icnC', dmg_icon],
'Could not set dmg icon attributes.')
# Ensures dmg icon will be used while mounted.
self._run_command(['SetFile', '-a', 'C', dmg_volume_path],
'Could not set dmg icon attributes.')
# Set dmg background. Requires running Mac OS X gui.
# TODO: better formatting and code refactoring
if not self.args.devel:
self._print('... Setting the background image.')
os.mkdir(os.path.join(dmg_volume_path, '.background'))
self._run_command(['cp', self.dmg_background_img,
os.path.join(dmg_volume_path,
'.background/installer-background.png')],
u'Could not copy the background image, dmg creation failed.'
)
self.adjust_dmg_view(os.path.basename(dmg_volume_path))
# Unmount dmg file.
self._print('... unmounting the dmg.')
@ -590,10 +623,23 @@ class MacosxBuilder(object):
self._print('Finished creating dmg file, resulting file: %s' %
compressed_dmg)
# TODO Reimplement following actions.
#adjust_package_view(settings, adjustview_scriptname)
#compress_view(settings, seticon_scriptname, dmg_file)
self.dmg_file = compressed_dmg
def adjust_dmg_view(self, dmg_volume_name):
try:
# TODO: Use only one applescript file. Remove one for osx 10.5.
f = open(os.path.join(self.script_path,
'applescript-adjust-dmg-view.master'))
p = Popen([self.osascript], stdin=PIPE)
p.communicate(f.read() % (dmg_volume_name, 'OpenLP'))
f.close()
result = p.returncode
if (result != 0):
self._print('Adjusting dmg view failed.')
sys.exit(1)
except (IOError, OSError):
self._print('Adjusting dmg view failed.')
sys.exit(1)
def main(self):
"""
@ -607,7 +653,7 @@ class MacosxBuilder(object):
self._print_verbose(u'Source path: .............%s', self.source_path)
self._print_verbose(u'"dist.app" path: .........%s', self.dist_app_path)
self._print_verbose(u'"dist" path: .............%s', self.dist_path)
self._print_verbose(u'"hooks" path: .............%s', self.hooks_path)
self._print_verbose(u'"hooks" path: ............%s', self.hooks_path)
self._print_verbose(u'PyInstaller: .............%s', self.pyinstaller)
self._print_verbose(u'Documentation branch path:%s', self.docs_path)
self._print_verbose(u'')
@ -639,76 +685,3 @@ class MacosxBuilder(object):
if __name__ == u'__main__':
MacosxBuilder().main()
# TODO reimplement following options. They arenecessary for release builds.
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 old_main():
version = platform.mac_ver()[0]
# we only need the differenciation between leopard and snow leopard
if version.startswith("10.6") or version.startswith("10.7"):
SNOWLEOPARD = True
logging.info('[%s] using snow leopard scripts (version = %s)',
script_name, version)
adjustview_scriptname = "applescript-adjustview-10-6.master"
seticon_scriptname = "applescript-seticon-10-6.master"
else:
SNOWLEOPARD = False
logging.info('[%s] using leopard scripts (version = %s)', script_name,
version)
adjustview_scriptname = "applescript-adjustview-10-5.master"
seticon_scriptname = "applescript-seticon-10-5.master"
if not os.path.isfile(adjustview_scriptname) \
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)