From 05dde36a9e90c2b6d8612a3cce63b34ef7808f55 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 3 Dec 2016 17:22:08 +0200 Subject: [PATCH] Fix up the rest of the macOS builder --- builders/builder.py | 50 ++++++++++++++++++++++--------------- builders/macosx-builder.py | 26 +++++++++++-------- builders/windows-builder.py | 0 3 files changed, 46 insertions(+), 30 deletions(-) mode change 100755 => 100644 builders/windows-builder.py diff --git a/builders/builder.py b/builders/builder.py index c2338da..dc151fb 100644 --- a/builders/builder.py +++ b/builders/builder.py @@ -31,22 +31,30 @@ from subprocess import Popen, PIPE BUILDER_DESCRIPTION = 'Build OpenLP for {platform}. Options are provided on both the command line and a ' \ 'configuration file. Options in the configuration file are overridden by the command line options.\n\n' \ - 'This build system can produce either development or release builds. A development release uses the code ' \ - 'as-is in the specified branch directory. The release build exports a tag from bzr and uses the exported ' \ - 'code for building. The two modes are invoked by the presence or absence of the --release option. If this ' \ - 'option is omitted, a development build is built, while including the --release option with a version ' \ - 'number will produce a build of that exact version.' + 'This build system can produce either development or release builds. A development release uses the ' \ + 'code as-is in the specified branch directory. The release build exports a tag from bzr and uses the ' \ + 'exported code for building. The two modes are invoked by the presence or absence of the --release ' \ + 'option. If this option is omitted, a development build is built, while including the --release ' \ + 'option with a version number will produce a build of that exact version.' -def _which(command): +def _which(program): """ Return absolute path to a command found on system PATH. """ - if command.startswith('/'): - return command - for path in os.environ["PATH"].split(os.pathsep): - if os.access(os.path.join(path, command), os.X_OK): - return "%s/%s" % (path, command) + def is_exe(fpath): + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + + fpath, fname = os.path.split(program) + if fpath and is_exe(program): + return program + else: + for path in os.environ['PATH'].split(os.pathsep): + path = path.strip('"') + exe_file = os.path.join(path, program) + if is_exe(exe_file): + return exe_file + return None class Builder(object): @@ -168,7 +176,11 @@ class Builder(object): """ self._print_verbose('Executables:') for option in self.config.options('executables'): - value = _which(self.config.get('executables', option)) + value = self.config.get('executables', option) + if not value.strip(): + value = None + else: + value = _which(value) setattr(self, '{option}_exe'.format(option=option), value) self._print_verbose(' {option:.<30}: {value}'.format(option=option + ' ', value=value)) @@ -233,6 +245,7 @@ class Builder(object): Run PyInstaller on the branch to build an executable. """ self._print('Running PyInstaller...') + copy(os.path.join(self.work_path, 'openlp.py'), self.openlp_script) os.chdir(self.work_path) cmd = [self.python, self.pyinstaller_exe, @@ -249,7 +262,7 @@ class Builder(object): cmd.append('--log-level=ERROR') else: cmd.append('--log-level=DEBUG') - if self.args.devel: + if not self.args.release: cmd.append('-d') self._run_command(cmd, 'Error running PyInstaller') @@ -381,10 +394,10 @@ class Builder(object): """ Run Sphinx to build the manual """ - self._print('Deleting previous help manual build... %s', self.manual_build_path) + self._print('Running Sphinx...') + self._print_verbose(' Deleting previous help manual build... %s', self.manual_build_path) if os.path.exists(self.manual_build_path): rmtree(self.manual_build_path) - self._print('Running Sphinx...') os.chdir(self.manual_path) sphinx_build = self.get_sphinx_build() command = [self.sphinx_exe, '-b', sphinx_build, '-d', 'build/doctrees', 'source', 'build/{}'.format(sphinx_build)] @@ -420,8 +433,6 @@ class Builder(object): self.copy_default_theme() self.copy_plugins() self.copy_media_player() - self.copy_extra_files() - # TODO creating help on Mac if os.path.exists(self.manual_path): self.run_sphinx() else: @@ -429,13 +440,12 @@ class Builder(object): self._print('WARNING: Documentation trunk not found') self._print(' Help file will not be included in build') self._print('') - self.copy_macosx_files() + self.copy_extra_files() if not self.args.skip_translations: if self.args.update_translations: self.update_translations() self.compile_translations() - self.code_sign() - self.create_dmg_file() + self.build_package() self._print('Done.') raise SystemExit() diff --git a/builders/macosx-builder.py b/builders/macosx-builder.py index 92d9d21..a50b9d9 100644 --- a/builders/macosx-builder.py +++ b/builders/macosx-builder.py @@ -119,14 +119,20 @@ class MacosxBuilder(Builder): dir_size += os.path.getsize(filename) return dir_size + def get_sphinx_build(self): + """ + The type of build Sphinx should be doing + """ + return 'applehelp' + def setup_paths(self): """ Extra setup to run """ super().setup_paths() - if hasattr(self, 'mutoolbin'): - self.mutoollib = os.path.abspath( - os.path.join(os.path.dirname(self.mutoolbin), '..', 'lib', 'libjbig2dec.0.dylib')) + if hasattr(self, 'mutool_exe'): + self.mutool_lib = os.path.abspath( + os.path.join(os.path.dirname(self.mutool_exe), '..', 'lib', 'libjbig2dec.0.dylib')) self.dist_app_path = os.path.join(self.work_path, 'dist', 'OpenLP.app') self.dist_path = os.path.join(self.work_path, 'dist', 'OpenLP.app', 'Contents', 'MacOS') @@ -157,15 +163,15 @@ class MacosxBuilder(Builder): """ self._print('Copying extra files for Mac OS X...') self._print_verbose('... LICENSE.txt') - copy(os.path.join(self.script_path, 'LICENSE.txt'), os.path.join(self.dist_path, 'LICENSE.txt')) + copy(self.license_path, os.path.join(self.dist_path, 'LICENSE.txt')) self._print_verbose('... mudraw') - if hasattr(self, 'mudrawbin') and os.path.isfile(self.mudrawbin): - copy(self.mudrawbin, os.path.join(self.dist_path, 'mudraw')) + if hasattr(self, 'mudraw_exe') and self.mudraw_exe and os.path.isfile(self.mudraw_exe): + copy(self.mudraw_exe, os.path.join(self.dist_path, 'mudraw')) self.relink_mudraw() - elif hasattr(self, 'mutoolbin') and os.path.isfile(self.mutoolbin): - copy(self.mutoolbin, os.path.join(self.dist_path, 'mutool')) + elif hasattr(self, 'mutool_exe') and self.mutool_exe and os.path.isfile(self.mutool_exe): + copy(self.mutool_exe, os.path.join(self.dist_path, 'mutool')) self.relink_mutool() - copy(self.mutoollib, os.path.join(self.dist_path, 'libjbig2dec.0.dylib')) + copy(self.mutool_lib, os.path.join(self.dist_path, 'libjbig2dec.0.dylib')) else: self._print('... WARNING: mudraw and mutool not found') @@ -274,7 +280,7 @@ class MacosxBuilder(Builder): size += 10 self._print('... %s' % self.script_path) - os.chdir(self.script_path) + os.chdir(os.path.dirname(self.dmg_settings_path)) self._run_command([self.dmgbuild_exe, '-s', self.dmg_settings_path, '-D', 'size={size}M'.format(size=size), '-D', 'icon={icon_path}'.format(icon_path=self.icon_path), '-D', 'app={dist_app_path}'.format(dist_app_path=self.dist_app_path), dmg_title, self.dmg_file], diff --git a/builders/windows-builder.py b/builders/windows-builder.py old mode 100755 new mode 100644