diff --git a/ext/toolchain/fuckfuck.py b/ext/toolchain/fuckfuck.py
deleted file mode 100644
index 4dcb6def..00000000
--- a/ext/toolchain/fuckfuck.py
+++ /dev/null
@@ -1,2000 +0,0 @@
-# synergy -- mouse and keyboard sharing utility
-# Copyright (C) 2012 Synergy Si Ltd.
-# Copyright (C) 2009 Nick Bolton
-#
-# This package is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# found in the file LICENSE that should have accompanied this file.
-#
-# This package 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, see .
-
-# TODO: split this file up, it's too long!
-
-import sys, os, ConfigParser, shutil, re, ftputil, zipfile, glob, commands
-from generators import VisualStudioGenerator, EclipseGenerator, XcodeGenerator, MakefilesGenerator
-from getopt import gnu_getopt
-
-if sys.version_info >= (2, 4):
- import subprocess
-
-class Toolchain:
-
- # minimum required version.
- # 2.6 needed for ZipFile.extractall.
- # do not change to 2.7, as the build machines are still at 2.6
- # and are a massive pain in the ass to upgrade.
- requiredMajor = 2
- requiredMinor = 6
-
- # options used by all commands
- globalOptions = 'v'
- globalOptionsLong = ['no-prompts', 'verbose', 'skip-gui', 'skip-core']
-
- # list of valid commands as keys. the values are optarg strings, but most
- # are None for now (this is mainly for extensibility)
- cmd_opt_dict = {
- 'about' : ['', []],
- 'setup' : ['g:', ['generator=']],
- 'configure' : ['g:dr', ['generator=', 'debug', 'release', 'mac-sdk=', 'mac-identity=']],
- 'build' : ['dr', ['debug', 'release']],
- 'clean' : ['dr', ['debug', 'release']],
- 'update' : ['', []],
- 'install' : ['', []],
- 'doxygen' : ['', []],
- 'dist' : ['', ['vcredist-dir=', 'qt-dir=']],
- 'distftp' : ['', ['host=', 'user=', 'pass=', 'dir=']],
- 'kill' : ['', []],
- 'usage' : ['', []],
- 'revision' : ['', []],
- 'reformat' : ['', []],
- 'open' : ['', []],
- 'genlist' : ['', []],
- 'reset' : ['', []],
- 'signwin' : ['', ['pfx=', 'pwd=', 'dist']],
- 'signmac' : ['', []]
- }
-
- # aliases to valid commands
- cmd_alias_dict = {
- 'info' : 'about',
- 'help' : 'usage',
- 'package' : 'dist',
- 'docs' : 'doxygen',
- 'make' : 'build',
- 'cmake' : 'configure',
- }
-
- def complete_command(self, arg):
- completions = []
-
- for cmd, optarg in self.cmd_opt_dict.iteritems():
- # if command was matched fully, return only this, so that
- # if `dist` is typed, it will return only `dist` and not
- # `dist` and `distftp` for example.
- if cmd == arg:
- return [cmd,]
- if cmd.startswith(arg):
- completions.append(cmd)
-
- for alias, cmd in self.cmd_alias_dict.iteritems():
- # don't know if this will work just like above, but it's
- # probably worth adding.
- if alias == arg:
- return [alias,]
- if alias.startswith(arg):
- completions.append(alias)
-
- return completions
-
- def start_cmd(self, argv):
-
- cmd_arg = ''
- if len(argv) > 1:
- cmd_arg = argv[1]
-
- # change common help args to help command
- if cmd_arg in ('--help', '-h', '--usage', '-u', '/?'):
- cmd_arg = 'usage'
-
- completions = self.complete_command(cmd_arg)
-
- if cmd_arg and len(completions) > 0:
-
- if len(completions) == 1:
-
- # get the only completion (since in this case we have 1)
- cmd = completions[0]
-
- # build up the first part of the map (for illustrative purposes)
- cmd_map = list()
- if cmd_arg != cmd:
- cmd_map.append(cmd_arg)
- cmd_map.append(cmd)
-
- # map an alias to the command, and build up the map
- if cmd in self.cmd_alias_dict.keys():
- alias = cmd
- if cmd_arg == cmd:
- cmd_map.append(alias)
- cmd = self.cmd_alias_dict[cmd]
- cmd_map.append(cmd)
-
- # show command map to avoid confusion
- if len(cmd_map) != 0:
- print 'Mapping command: %s' % ' -> '.join(cmd_map)
-
- self.run_cmd(cmd, argv[2:])
-
- return 0
-
- else:
- print (
- 'Command `%s` too ambiguous, '
- 'could mean any of: %s'
- ) % (cmd_arg, ', '.join(completions))
- else:
-
- if len(argv) == 1:
- print 'No command specified, showing usage.\n'
- else:
- print 'Command not recognised: %s\n' % cmd_arg
-
- self.run_cmd('usage')
-
- # generic error code if not returned sooner
- return 1
-
- def run_cmd(self, cmd, argv = []):
-
- verbose = False
- try:
- options_pair = self.cmd_opt_dict[cmd]
-
- options = self.globalOptions + options_pair[0]
-
- options_long = []
- options_long.extend(self.globalOptionsLong)
- options_long.extend(options_pair[1])
-
- opts, args = gnu_getopt(argv, options, options_long)
-
- for o, a in opts:
- if o in ('-v', '--verbose'):
- verbose = True
-
- # pass args and optarg data to command handler, which figures out
- # how to handle the arguments
- handler = CommandHandler(argv, opts, args, verbose)
-
- # use reflection to get the function pointer
- cmd_func = getattr(handler, cmd)
-
- cmd_func()
- except:
- if not verbose:
- # print friendly error for users
- sys.stderr.write('Error: ' + sys.exc_info()[1].__str__() + '\n')
- sys.exit(1)
- else:
- # if user wants to be verbose let python do it's thing
- raise
-
- def run(self, argv):
- if sys.version_info < (self.requiredMajor, self.requiredMinor):
- print ('Python version must be at least ' +
- str(self.requiredMajor) + '.' + str(self.requiredMinor) + ', but is ' +
- str(sys.version_info[0]) + '.' + str(sys.version_info[1]))
- sys.exit(1)
-
- try:
- self.start_cmd(argv)
- except KeyboardInterrupt:
- print '\n\nUser aborted, exiting.'
-
-class InternalCommands:
-
- project = 'synergy'
- setup_version = 5 # increment to force setup/config
- website_url = 'http://synergy-project.org/'
-
- this_cmd = 'hm'
- cmake_cmd = 'cmake'
- qmake_cmd = 'qmake'
- make_cmd = 'make'
- xcodebuild_cmd = 'xcodebuild'
- w32_make_cmd = 'mingw32-make'
- w32_qt_version = '4.6.2'
- defaultTarget = 'release'
-
- cmake_dir = 'res'
- gui_dir = 'src/gui'
- doc_dir = 'doc'
- extDir = 'ext'
-
- sln_filename = '%s.sln' % project
- xcodeproj_filename = '%s.xcodeproj' % project
- configDir = 'build'
- configFilename = '%s/%s.cfg' % (configDir, this_cmd)
- qtpro_filename = 'gui.pro'
- doxygen_filename = 'doxygen.cfg'
-
- cmake_url = 'http://www.cmake.org/cmake/resources/software.html'
-
- # try_chdir(...) and restore_chdir() will use this
- prevdir = ''
-
- # by default, no index specified as arg
- generator_id = None
-
- # by default, prompt user for input
- no_prompts = False
-
- # by default, compile the core
- enableMakeCore = True
-
- # by default, compile the gui
- enableMakeGui = True
-
- # by default, unknown
- macSdk = None
-
- # by default, unknown
- macIdentity = None
-
- # gtest dir with version number
- gtestDir = 'gtest-1.6.0'
-
- # gmock dir with version number
- gmockDir = 'gmock-1.6.0'
-
- win32_generators = {
- 1 : VisualStudioGenerator('10'),
- 2 : VisualStudioGenerator('10 Win64'),
- 3 : VisualStudioGenerator('9 2008'),
- 4 : VisualStudioGenerator('9 2008 Win64'),
- 5 : VisualStudioGenerator('8 2005'),
- 6 : VisualStudioGenerator('8 2005 Win64')
- }
-
- unix_generators = {
- 1 : MakefilesGenerator(),
- 2 : EclipseGenerator(),
- }
-
- darwin_generators = {
- 1 : MakefilesGenerator(),
- 2 : XcodeGenerator(),
- 3 : EclipseGenerator(),
- }
-
- def getBuildDir(self, target=''):
- return self.getGenerator().getBuildDir(target)
-
- def getBinDir(self, target=''):
- return self.getGenerator().getBinDir(target)
-
- def sln_filepath(self):
- return '%s\%s' % (self.getBuildDir(), self.sln_filename)
-
- def xcodeproj_filepath(self, target=''):
- return '%s/%s' % (self.getBuildDir(target), self.xcodeproj_filename)
-
- def usage(self):
- app = sys.argv[0]
- print ('Usage: %s [-g |-v|--no-prompts|]\n'
- '\n'
- 'Replace [command] with one of:\n'
- ' about Show information about this script\n'
- ' setup Runs the initial setup for this script\n'
- ' conf Runs cmake (generates project files)\n'
- ' open Attempts to open the generated project file\n'
- ' build Builds using the platform build chain\n'
- ' clean Cleans using the platform build chain\n'
- ' kill Kills all synergy processes (run as admin)\n'
- ' update Updates the source code from repository\n'
- ' revision Display the current source code revision\n'
- ' package Create a distribution package (e.g. tar.gz)\n'
- ' install Installs the program\n'
- ' doxygen Builds doxygen documentation\n'
- ' reformat Reformat .cpp and .h files using AStyle\n'
- ' genlist Shows the list of available platform generators\n'
- ' usage Shows the help screen\n'
- '\n'
- 'Example: %s build -g 3'
- ) % (app, app)
-
- def configureAll(self, targets, extraArgs=''):
-
- # if no mode specified, use default
- if len(targets) == 0:
- targets += [self.defaultTarget,]
-
- for target in targets:
- self.configure(target)
-
- def checkGTest(self):
- dir = self.extDir + '/' + self.gtestDir
- if (os.path.isdir(dir)):
- return
-
- zipFilename = dir + '.zip'
- if (not os.path.exists(zipFilename)):
- raise Exception('GTest zip not found at: ' + zipFilename)
-
- if not os.path.exists(dir):
- os.mkdir(dir)
-
- zip = zipfile.ZipFile(zipFilename)
- self.zipExtractAll(zip, dir)
-
- def checkGMock(self):
- dir = self.extDir + '/' + self.gmockDir
- if (os.path.isdir(dir)):
- return
-
- zipFilename = dir + '.zip'
- if (not os.path.exists(zipFilename)):
- raise Exception('GMock zip not found at: ' + zipFilename)
-
- if not os.path.exists(dir):
- os.mkdir(dir)
-
- zip = zipfile.ZipFile(zipFilename)
- self.zipExtractAll(zip, dir)
-
- # ZipFile.extractall() is buggy in 2.6.1
- # http://bugs.python.org/issue4710
- def zipExtractAll(self, z, dir):
- if not dir.endswith("/"):
- dir += "/"
-
- for f in z.namelist():
- if f.endswith("/"):
- os.makedirs(dir + f)
- else:
- z.extract(f, dir)
-
- def configure(self, target='', extraArgs=''):
-
- # ensure latest setup and do not ask config for generator (only fall
- # back to prompt if not specified as arg)
- self.ensure_setup_latest()
-
- if sys.platform == "darwin":
- config = self.getConfig()
-
- if self.macSdk:
- config.set('hm', 'macSdk', self.macSdk)
- elif config.has_option("hm", "macSdk"):
- self.macSdk = config.get('hm', 'macSdk')
-
- if self.macIdentity:
- config.set('hm', 'macIdentity', self.macIdentity)
- elif config.has_option("hm", "macIdentity"):
- self.macIdentity = config.get('hm', 'macIdentity')
-
- self.write_config(config)
-
- if not self.macSdk:
- raise Exception("Arg missing: --mac-sdk ");
-
- if not self.macIdentity:
- raise Exception("Arg missing: --mac-identity ");
-
- sdkDir = self.getMacSdkDir()
- if not os.path.exists(sdkDir):
- raise Exception("Mac SDK not found at: " + sdkDir)
-
- os.environ["MACOSX_DEPLOYMENT_TARGET"] = self.macSdk
-
- # default is release
- if target == '':
- print 'Defaulting target to: ' + self.defaultTarget
- target = self.defaultTarget
-
- # allow user to skip core compile
- if self.enableMakeCore:
- self.configureCore(target, extraArgs)
-
- # allow user to skip gui compile
- if self.enableMakeGui:
- self.configureGui(target, extraArgs)
-
- self.setConfRun(target)
-
- def configureCore(self, target="", extraArgs=""):
-
- # ensure that we have access to cmake
- _cmake_cmd = self.persist_cmake()
-
- # now that we know we've got the latest setup, we can ask the config
- # file for the generator (but again, we only fall back to this if not
- # specified as arg).
- generator = self.getGenerator()
-
- if generator != self.findGeneratorFromConfig():
- print('Generator changed, running setup.')
- self.setup(target)
-
- cmake_args = ''
- if generator.cmakeName != '':
- cmake_args += ' -G "' + generator.cmakeName + '"'
-
- # for makefiles always specify a build type (debug, release, etc)
- if generator.cmakeName.find('Unix Makefiles') != -1:
- cmake_args += ' -DCMAKE_BUILD_TYPE=' + target.capitalize()
-
- elif sys.platform == "darwin":
- macSdkMatch = re.match("(\d+)\.(\d+)", self.macSdk)
- if not macSdkMatch:
- raise Exception("unknown osx version: " + self.macSdk)
-
- sdkDir = self.getMacSdkDir()
- cmake_args += " -DCMAKE_OSX_SYSROOT=" + sdkDir
- cmake_args += " -DCMAKE_OSX_DEPLOYMENT_TARGET=" + self.macSdk
- cmake_args += " -DOSX_TARGET_MAJOR=" + macSdkMatch.group(1)
- cmake_args += " -DOSX_TARGET_MINOR=" + macSdkMatch.group(2)
-
- # if not visual studio, use parent dir
- sourceDir = generator.getSourceDir()
-
- self.checkGTest()
- self.checkGMock()
-
- if extraArgs != '':
- cmake_args += ' ' + extraArgs
-
- cmake_cmd_string = _cmake_cmd + cmake_args + ' ' + sourceDir
-
- # Run from build dir so we have an out-of-source build.
- self.try_chdir(self.getBuildDir(target))
-
- print "CMake command: " + cmake_cmd_string
- err = os.system(cmake_cmd_string)
-
- self.restore_chdir()
-
- if generator.cmakeName.find('Eclipse') != -1:
- self.fixCmakeEclipseBug()
-
- if err != 0:
- raise Exception('CMake encountered error: ' + str(err))
-
- def configureGui(self, target="", extraArgs=""):
-
- # make sure we have qmake
- self.persist_qmake()
-
- qmake_cmd_string = self.qmake_cmd + " " + self.qtpro_filename + " -r"
-
- if sys.platform == "darwin":
-
- # create makefiles on mac (not xcode).
- qmake_cmd_string += " -spec macx-g++"
-
- (major, minor) = self.getMacVersion()
- if major == 10 and minor <= 4:
- # 10.4: universal (intel and power pc)
- qmake_cmd_string += ' CONFIG+="ppc i386"'
-
- libs = (
- "-framework ApplicationServices "
- "-framework Security "
- "-framework cocoa")
-
- if major == 10 and minor >= 6:
- libs += " -framework ServiceManagement"
-
- qmake_cmd_string += " \"MACX_LIBS=%s\" " % libs
-
- sdkDir = self.getMacSdkDir()
- shortForm = "macosx" + self.macSdk
- version = str(major) + "." + str(minor)
-
- qmake_cmd_string += " QMAKE_MACOSX_DEPLOYMENT_TARGET=" + version
-
- (qMajor, qMinor, qRev) = self.getQmakeVersion()
- if qMajor <= 4:
- # 4.6: qmake takes full sdk dir.
- qmake_cmd_string += " QMAKE_MAC_SDK=" + sdkDir
- else:
- # 5.2: now we need to use the .path setting.
- qmake_cmd_string += " QMAKE_MAC_SDK=" + shortForm
- qmake_cmd_string += " QMAKE_MAC_SDK." + shortForm + ".path=" + sdkDir
-
- print "QMake command: " + qmake_cmd_string
-
- # run qmake from the gui dir
- self.try_chdir(self.gui_dir)
- err = os.system(qmake_cmd_string)
- self.restore_chdir()
-
- if err != 0:
- raise Exception('QMake encountered error: ' + str(err))
-
- def getQmakeVersion(self):
- version = commands.getoutput("qmake --version")
- result = re.search('(\d+)\.(\d+)\.(\d)', version)
-
- if not result:
- raise Exception("Could not get qmake version.")
-
- major = int(result.group(1))
- minor = int(result.group(2))
- rev = int(result.group(3))
-
- return (major, minor, rev)
-
- def getMacSdkDir(self):
- sdkName = "macosx" + self.macSdk
-
- # Ideally we'll use xcrun (which is influenced by $DEVELOPER_DIR), then try a couple
- # fallbacks to known paths if xcrun is not available
- status, sdkPath = commands.getstatusoutput("xcrun --show-sdk-path --sdk " + sdkName)
- if status == 0 and sdkPath:
- return sdkPath
-
- developerDir = os.getenv("DEVELOPER_DIR")
- if not developerDir:
- developerDir = "/Applications/Xcode.app/Contents/Developer"
-
- sdkDirName = sdkName.replace("macosx", "MacOSX")
- sdkPath = developerDir + "/Platforms/MacOSX.platform/Developer/SDKs/" + sdkDirName + ".sdk"
- if os.path.exists(sdkPath):
- return sdkPath
-
- return "/Developer/SDKs/" + sdkDirName + ".sdk"
-
- # http://tinyurl.com/cs2rxxb
- def fixCmakeEclipseBug(self):
- print "Fixing CMake Eclipse bugs..."
-
- file = open('.project', 'r+')
- content = file.read()
- pattern = re.compile('\s+.+', re.S)
- content = pattern.sub('', content)
- file.seek(0)
- file.write(content)
- file.truncate()
- file.close()
-
- def persist_cmake(self):
- # even though we're running `cmake --version`, we're only doing this for the 0 return
- # code; we don't care about the version, since CMakeLists worrys about this for us.
- err = os.system('%s --version' % self.cmake_cmd)
-
- if err != 0:
- # if return code from cmake is not 0, then either something has
- # gone terribly wrong with --version, or it genuinely doesn't exist.
- print ('Could not find `%s` in system path.\n'
- 'Download the latest version from:\n %s') % (
- self.cmake_cmd, self.cmake_url)
- raise Exception('Cannot continue without CMake.')
- else:
- return self.cmake_cmd
-
- def persist_qt(self):
- self.persist_qmake()
-
- def persist_qmake(self):
- # cannot use subprocess on < python 2.4
- if sys.version_info < (2, 4):
- return
-
- try:
- p = subprocess.Popen(
- [self.qmake_cmd, '--version'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- except:
- print >> sys.stderr, 'Error: Could not find qmake.'
- if sys.platform == 'win32': # windows devs usually need hints ;)
- print (
- 'Suggestions:\n'
- '1. Ensure that qmake.exe exists in your system path.\n'
- '2. Try to download Qt (check our dev FAQ for links):\n'
- ' qt-sdk-win-opensource-2010.02.exe')
- raise Exception('Cannot continue without qmake.')
-
- stdout, stderr = p.communicate()
- if p.returncode != 0:
- raise Exception('Could not test for cmake: %s' % stderr)
- else:
- m = re.search('.*Using Qt version (\d+\.\d+\.\d+).*', stdout)
- if m:
- if sys.platform == 'win32':
- ver = m.group(1)
- if ver != self.w32_qt_version: # TODO: test properly
- print >> sys.stderr, (
- 'Warning: Not using supported Qt version %s'
- ' (your version is %s).'
- ) % (self.w32_qt_version, ver)
- else:
- pass # any version should be ok for other platforms
- else:
- raise Exception('Could not find qmake version.')
-
- def ensureConfHasRun(self, target, skipConfig):
- if self.hasConfRun(target):
- print 'Skipping config for target: ' + target
- skipConfig = True
-
- if not skipConfig:
- self.configure(target)
-
- def build(self, targets=[], skipConfig=False):
-
- # if no mode specified, use default
- if len(targets) == 0:
- targets += [self.defaultTarget,]
-
- self.ensure_setup_latest()
-
- self.loadConfig()
-
- # allow user to skip core compile
- if self.enableMakeCore:
- self.makeCore(targets)
-
- # allow user to skip gui compile
- if self.enableMakeGui:
- self.makeGui(targets)
-
- def loadConfig(self):
- config = self.getConfig()
-
- if config.has_option("hm", "macSdk"):
- self.macSdk = config.get("hm", "macSdk")
-
- if config.has_option("hm", "macIdentity"):
- self.macIdentity = config.get("hm", "macIdentity")
-
- def makeCore(self, targets):
-
- generator = self.getGeneratorFromConfig().cmakeName
-
- if self.macSdk:
- os.environ["MACOSX_DEPLOYMENT_TARGET"] = self.macSdk
-
- if generator.find('Unix Makefiles') != -1:
- for target in targets:
- self.runBuildCommand(self.make_cmd, target)
- else:
- for target in targets:
- if generator.startswith('Visual Studio'):
- self.run_vcbuild(generator, target, self.sln_filepath())
- elif generator == 'Xcode':
- cmd = self.xcodebuild_cmd + ' -configuration ' + target.capitalize()
- self.runBuildCommand(cmd, target)
- else:
- raise Exception('Build command not supported with generator: ' + generator)
-
- def makeGui(self, targets, args=""):
- for target in targets:
-
- if sys.platform == 'win32':
-
- gui_make_cmd = self.w32_make_cmd + ' ' + target + args
- print 'Make GUI command: ' + gui_make_cmd
-
- self.try_chdir(self.gui_dir)
- err = os.system(gui_make_cmd)
- self.restore_chdir()
-
- if err != 0:
- raise Exception(gui_make_cmd + ' failed with error: ' + str(err))
-
- elif sys.platform in ['linux2', 'sunos5', 'freebsd7', 'darwin']:
-
- gui_make_cmd = self.make_cmd + " -w" + args
- print 'Make GUI command: ' + gui_make_cmd
-
- # start with a clean app bundle
- targetDir = self.getGenerator().getBinDir(target)
- bundleTargetDir = targetDir + '/Synergy.app'
- if os.path.exists(bundleTargetDir):
- shutil.rmtree(bundleTargetDir)
-
- binDir = self.getGenerator().binDir
- bundleTempDir = binDir + '/Synergy.app'
- if os.path.exists(bundleTempDir):
- shutil.rmtree(bundleTempDir)
-
- self.try_chdir(self.gui_dir)
- err = os.system(gui_make_cmd)
- self.restore_chdir()
-
- if err != 0:
- raise Exception(gui_make_cmd + ' failed with error: ' + str(err))
-
- if sys.platform == 'darwin' and not "clean" in args:
- self.macPostGuiMake(target)
-
- self.fixQtFrameworksLayout(target)
- else:
- raise Exception('Unsupported platform: ' + sys.platform)
-
- def macPostGuiMake(self, target):
- bundle = 'Synergy.app'
- binDir = self.getGenerator().binDir
- targetDir = self.getGenerator().getBinDir(target)
- bundleTempDir = binDir + '/' + bundle
- bundleTargetDir = targetDir + '/' + bundle
-
- if os.path.exists(bundleTempDir):
- shutil.move(bundleTempDir, bundleTargetDir)
-
- if self.enableMakeCore:
- # copy core binaries into the bundle, since the gui
- # now looks for the binaries in the current app dir.
-
- bundleBinDir = bundleTargetDir + "/Contents/MacOS/"
- shutil.copy(targetDir + "/synergyc", bundleBinDir)
- shutil.copy(targetDir + "/synergys", bundleBinDir)
- shutil.copy(targetDir + "/syntool", bundleBinDir)
-
- self.loadConfig()
- if not self.macIdentity:
- raise Exception("run config with --mac-identity")
-
- if self.enableMakeGui:
- # use qt to copy libs to bundle so no dependencies are needed. do not create a
- # dmg at this point, since we need to sign it first, and then create our own
- # after signing (so that qt does not affect the signed app bundle).
- bin = "macdeployqt Synergy.app -verbose=2"
- self.try_chdir(targetDir)
- err = os.system(bin)
- self.restore_chdir()
- print bundleTargetDir
- if err != 0:
- raise Exception(bin + " failed with error: " + str(err))
-
- (qMajor, qMinor, qRev) = self.getQmakeVersion()
- if qMajor <= 4:
- frameworkRootDir = "/Library/Frameworks"
- else:
- # TODO: auto-detect, qt can now be installed anywhere.
- frameworkRootDir = "/Developer/Qt5.2.1/5.2.1/clang_64/lib"
-
- target = bundleTargetDir + "/Contents/Frameworks"
-
- # copy the missing Info.plist files for the frameworks.
- for root, dirs, files in os.walk(target):
- for dir in dirs:
- if dir.startswith("Qt"):
- shutil.copy(
- frameworkRootDir + "/" + dir + "/Contents/Info.plist",
- target + "/" + dir + "/Resources/")
-
- def symlink(self, source, target):
- if not os.path.exists(target):
- os.symlink(source, target)
-
- def move(self, source, target):
- if os.path.exists(source):
- shutil.move(source, target)
-
- def fixQtFrameworksLayout(self, target):
- # reorganize Qt frameworks layout on Mac 10.9.5 or later
- # http://goo.gl/BFnQ8l
- # QtCore example:
- # QtCore.framework/
- # QtCore -> Versions/Current/QtCore
- # Resources -> Versions/Current/Resources
- # Versions/
- # Current -> 5
- # 5/
- # QtCore
- # Resources/
- # Info.plist
- targetDir = self.getGenerator().getBinDir(target)
-
- target = targetDir + "/Synergy.app/Contents/Frameworks"
- (major, minor) = self.getMacVersion()
- if major == 10:
- if minor >= 9:
- for root, dirs, files in os.walk(target):
- for dir in dirs:
- if dir.startswith("Qt"):
- self.try_chdir(target + "/" + dir +"/Versions")
- self.symlink("5", "Current")
- self.move("../Resources", "5")
- self.restore_chdir()
-
- self.try_chdir(target + "/" + dir)
- dot = dir.find('.')
- frameworkName = dir[:dot]
- self.symlink("Versions/Current/" + frameworkName, frameworkName)
- self.symlink("Versions/Current/Resources", "Resources")
- self.restore_chdir()
-
- def signmac(self):
- self.loadConfig()
- if not self.macIdentity:
- raise Exception("run config with --mac-identity")
-
- self.try_chdir("bin/Release/")
- err = os.system(
- 'codesign --deep -fs "' + self.macIdentity + '" Synergy.app')
- self.restore_chdir()
-
- if err != 0:
- raise Exception("codesign failed with error: " + str(err))
-
- def signwin(self, pfx, pwdFile, dist):
- generator = self.getGeneratorFromConfig().cmakeName
- if not generator.startswith('Visual Studio'):
- raise Exception('only windows is supported')
-
- f = open(pwdFile)
- lines = f.readlines()
- f.close()
- pwd = lines[0]
-
- if (dist):
- self.signFile(pfx, pwd, 'bin/Release', self.dist_name('win'))
- else:
- self.signFile(pfx, pwd, 'bin/Release', 'synergy.exe')
- self.signFile(pfx, pwd, 'bin/Release', 'synergyc.exe')
- self.signFile(pfx, pwd, 'bin/Release', 'synergys.exe')
- self.signFile(pfx, pwd, 'bin/Release', 'synergyd.exe')
- self.signFile(pfx, pwd, 'bin/Release', 'syntool.exe')
- self.signFile(pfx, pwd, 'bin/Release', 'synwinhk.dll')
-
- def signFile(self, pfx, pwd, dir, file):
- self.try_chdir(dir)
- err = os.system(
- 'signtool sign'
- ' /f ' + pfx +
- ' /p ' + pwd +
- ' /t http://timestamp.verisign.com/scripts/timstamp.dll ' +
- file)
- self.restore_chdir()
-
- if err != 0:
- raise Exception("signtool failed with error: " + str(err))
-
- def runBuildCommand(self, cmd, target):
-
- self.try_chdir(self.getBuildDir(target))
- err = os.system(cmd)
- self.restore_chdir()
-
- if err != 0:
- raise Exception(cmd + ' failed: ' + str(err))
-
- def clean(self, targets=[]):
-
- # if no mode specified, use default
- if len(targets) == 0:
- targets += [self.defaultTarget,]
-
- # allow user to skip core clean
- if self.enableMakeCore:
- self.cleanCore(targets)
-
- # allow user to skip qui clean
- if self.enableMakeGui:
- self.cleanGui(targets)
-
- def cleanCore(self, targets):
- generator = self.getGeneratorFromConfig().cmakeName
-
- if generator.startswith('Visual Studio'):
- # special case for version 10, use new /target:clean
- if generator.startswith('Visual Studio 10'):
- for target in targets:
- self.run_vcbuild(generator, target, self.sln_filepath(), '/target:clean')
-
- # any other version of visual studio, use /clean
- elif generator.startswith('Visual Studio'):
- for target in targets:
- self.run_vcbuild(generator, target, self.sln_filepath(), '/clean')
-
- else:
- cmd = ''
- if generator == "Unix Makefiles":
- print 'Cleaning with GNU Make...'
- cmd = self.make_cmd
- elif generator == 'Xcode':
- print 'Cleaning with Xcode...'
- cmd = self.xcodebuild_cmd
- else:
- raise Exception('Not supported with generator: ' + generator)
-
- for target in targets:
- self.try_chdir(self.getBuildDir(target))
- err = os.system(cmd + ' clean')
- self.restore_chdir()
-
- if err != 0:
- raise Exception('Clean failed: ' + str(err))
-
- def cleanGui(self, targets):
- self.makeGui(targets, " clean")
-
- def open(self):
- generator = self.getGeneratorFromConfig().cmakeName
- if generator.startswith('Visual Studio'):
- print 'Opening with %s...' % generator
- self.open_internal(self.sln_filepath())
-
- elif generator.startswith('Xcode'):
- print 'Opening with %s...' % generator
- self.open_internal(self.xcodeproj_filepath(), 'open')
-
- else:
- raise Exception('Not supported with generator: ' + generator)
-
- def update(self):
- print "Running Subversion update..."
- err = os.system('svn update')
- if err != 0:
- raise Exception('Could not update from repository with error code code: ' + str(err))
-
- def revision(self):
- print self.find_revision()
-
- def find_revision(self):
- return self.getGitRevision()
-
- def getGitRevision(self):
- if sys.version_info < (2, 4):
- raise Exception("Python 2.4 or greater required.")
-
- p = subprocess.Popen(
- ["git", "log", "--pretty=format:%h", "-n", "1"],
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-
- stdout, stderr = p.communicate()
-
- if p.returncode != 0:
- raise Exception('Could not get revision, git error: ' + str(p.returncode))
-
- return stdout.strip()
-
- def getGitBranchName(self):
- if sys.version_info < (2, 4):
- raise Exception("Python 2.4 or greater required.")
-
- p = subprocess.Popen(
- ["git", "rev-parse", "--abbrev-ref", "HEAD"],
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-
- stdout, stderr = p.communicate()
-
- if p.returncode != 0:
- raise Exception('Could not get branch name, git error: ' + str(p.returncode))
-
- return stdout.strip()
-
- def find_revision_svn(self):
- if sys.version_info < (2, 4):
- stdout = commands.getoutput('svn info')
- else:
- p = subprocess.Popen(['svn', 'info'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- stdout, stderr = p.communicate()
-
- if p.returncode != 0:
- raise Exception('Could not get revision - svn info failed with code: ' + str(p.returncode))
-
- m = re.search('.*Revision: (\d+).*', stdout)
- if not m:
- raise Exception('Could not find revision number in svn info output.')
-
- return m.group(1)
-
- def kill(self):
- if sys.platform == 'win32':
- return os.system('taskkill /F /FI "IMAGENAME eq synergy*"')
- else:
- raise Exception('Not implemented for platform: ' + sys.platform)
-
- def doxygen(self):
- self.enableMakeGui = False
-
- # The conf generates doc/doxygen.cfg from cmake/doxygen.cfg.in
- self.configure(self.defaultTarget, '-DCONF_DOXYGEN:BOOL=TRUE')
-
- err = os.system('doxygen %s/%s' % (self.doc_dir, self.doxygen_filename))
-
- if err != 0:
- raise Exception('doxygen failed with error code: ' + str(err))
-
- def dist(self, type, vcRedistDir, qtDir):
-
- # Package is supported by default.
- package_unsupported = False
- unixTarget = self.defaultTarget
-
- if type == '' or type == None:
- self.dist_usage()
- return
-
- moveExt = ''
-
- if type == 'src':
- self.distSrc()
-
- elif type == 'rpm':
- if sys.platform == 'linux2':
- self.distRpm()
- else:
- package_unsupported = True
-
- elif type == 'deb':
- if sys.platform == 'linux2':
- self.distDeb()
- else:
- package_unsupported = True
-
- elif type == 'win':
- if sys.platform == 'win32':
- #self.distNsis(vcRedistDir, qtDir)
- self.distWix()
- else:
- package_unsupported = True
-
- elif type == 'mac':
- if sys.platform == 'darwin':
- self.distMac()
- else:
- package_unsupported = True
-
- else:
- raise Exception('Package type not supported: ' + type)
-
- if moveExt != '':
- self.unixMove(
- self.getGenerator().buildDir + '/release/*.' + moveExt,
- self.getGenerator().binDir)
-
- if package_unsupported:
- raise Exception(
- ("Package type, '%s' is not supported for platform, '%s'")
- % (type, sys.platform))
-
- def distRpm(self):
- rpmDir = self.getGenerator().buildDir + '/rpm'
- if os.path.exists(rpmDir):
- shutil.rmtree(rpmDir)
-
- os.makedirs(rpmDir)
-
- templateFile = open(self.cmake_dir + '/synergy.spec.in')
- template = templateFile.read()
-
- template = template.replace('${in:version}', self.getVersionFromCmake())
-
- specPath = rpmDir + '/synergy.spec'
-
- specFile = open(specPath, 'w')
- specFile.write(template)
- specFile.close()
-
- version = self.getVersionFromCmake()
- target = '../../bin/synergy-%s-%s.rpm' % (
- version, self.getLinuxPlatform())
-
-
- try:
- self.try_chdir(rpmDir)
- cmd = 'rpmbuild -bb --define "_topdir `pwd`" synergy.spec'
- print "Command: " + cmd
- err = os.system(cmd)
- if err != 0:
- raise Exception('rpmbuild failed: ' + str(err))
-
- self.unixMove('RPMS/*/*.rpm', target)
-
- cmd = 'rpmlint ' + target
- print "Command: " + cmd
- err = os.system(cmd)
- if err != 0:
- raise Exception('rpmlint failed: ' + str(err))
-
- finally:
- self.restore_chdir()
-
- def distDeb(self):
- buildDir = self.getGenerator().buildDir
- binDir = self.getGenerator().binDir
- resDir = self.cmake_dir
-
- version = self.getVersionFromCmake()
- package = '%s-%s-%s' % (
- self.project, version, self.getLinuxPlatform())
-
- debDir = '%s/deb' % buildDir
- if os.path.exists(debDir):
- shutil.rmtree(debDir)
-
- metaDir = '%s/%s/DEBIAN' % (debDir, package)
- os.makedirs(metaDir)
-
- templateFile = open(resDir + '/deb/control.in')
- template = templateFile.read()
-
- template = template.replace('${in:version}',
- self.getVersionFromCmake())
-
- template = template.replace('${in:arch}',
- self.getDebianArch())
-
- controlPath = '%s/control' % metaDir
-
- controlFile = open(controlPath, 'w')
- controlFile.write(template)
- controlFile.close()
-
- targetBin = '%s/%s/usr/bin' % (debDir, package)
- targetShare = '%s/%s/usr/share' % (debDir, package)
- targetApplications = "%s/applications" % targetShare
- targetIcons = "%s/icons" % targetShare
- targetDocs = "%s/doc/%s" % (targetShare, self.project)
-
- os.makedirs(targetBin)
- os.makedirs(targetApplications)
- os.makedirs(targetIcons)
- os.makedirs(targetDocs)
-
- for root, dirs, files in os.walk(debDir):
- for d in dirs:
- os.chmod(os.path.join(root, d), 0o0755)
-
- binFiles = ['synergy', 'synergyc', 'synergys', 'synergyd', 'syntool']
- for f in binFiles:
- shutil.copy("%s/%s" % (binDir, f), targetBin)
- target = "%s/%s" % (targetBin, f)
- os.chmod(target, 0o0755)
- err = os.system("strip " + target)
- if err != 0:
- raise Exception('strip failed: ' + str(err))
-
- shutil.copy("%s/synergy.desktop" % resDir, targetApplications)
- shutil.copy("%s/synergy.ico" % resDir, targetIcons)
-
- docTarget = "%s/doc/%s" % (targetShare, self.project)
-
- copyrightPath = "%s/deb/copyright" % resDir
- shutil.copy(copyrightPath, docTarget)
-
- shutil.copy("%s/deb/changelog" % resDir, docTarget)
- os.system("gzip -9 %s/changelog" % docTarget)
- if err != 0:
- raise Exception('gzip failed: ' + str(err))
-
- for root, dirs, files in os.walk(targetShare):
- for f in files:
- os.chmod(os.path.join(root, f), 0o0644)
-
- target = '../../bin/%s.deb' % package
-
- try:
- self.try_chdir(debDir)
-
- # TODO: consider dpkg-buildpackage (higher level tool)
- cmd = 'fakeroot dpkg-deb --build %s' % package
- print "Command: " + cmd
- err = os.system(cmd)
- if err != 0:
- raise Exception('dpkg-deb failed: ' + str(err))
-
- cmd = 'lintian %s.deb' % package
- print "Command: " + cmd
- err = os.system(cmd)
- if err != 0:
- raise Exception('lintian failed: ' + str(err))
-
- self.unixMove('*.deb', target)
- finally:
- self.restore_chdir()
-
- def distSrc(self):
- version = self.getVersionFromCmake()
- name = (self.project + '-' + version + '-Source')
- exportPath = self.getGenerator().buildDir + '/' + name
-
- if os.path.exists(exportPath):
- print "Removing existing export..."
- shutil.rmtree(exportPath)
-
- os.mkdir(exportPath)
-
- cmd = "git archive %s | tar -x -C %s" % (
- self.getGitBranchName(), exportPath)
-
- print 'Exporting repository to: ' + exportPath
- err = os.system(cmd)
- if err != 0:
- raise Exception('Repository export failed: ' + str(err))
-
- packagePath = '../' + self.getGenerator().binDir + '/' + name + '.tar.gz'
-
- try:
- self.try_chdir(self.getGenerator().buildDir)
- print 'Packaging to: ' + packagePath
- err = os.system('tar cfvz ' + packagePath + ' ' + name)
- if err != 0:
- raise Exception('Package failed: ' + str(err))
- finally:
- self.restore_chdir()
-
- def unixMove(self, source, dest):
- print 'Moving ' + source + ' to ' + dest
- err = os.system('mv ' + source + ' ' + dest)
- if err != 0:
- raise Exception('Package failed: ' + str(err))
-
- def distMac(self):
- self.loadConfig()
- binDir = self.getGenerator().getBinDir('Release')
- name = "Synergy"
- dist = binDir + "/" + name
-
- # ensure dist dir is clean
- if os.path.exists(dist):
- shutil.rmtree(dist)
-
- os.makedirs(dist)
- shutil.move(binDir + "/" + name + ".app", dist + "/" + name + ".app")
-
- self.try_chdir(dist)
- err = os.system("ln -s /Applications")
- self.restore_chdir()
-
- fileName = "%s-%s-%s.dmg" % (
- self.project,
- self.getVersionFromCmake(),
- self.getMacPackageName())
-
- cmd = "hdiutil create " + fileName + " -srcfolder ./" + name + "/ -ov"
-
- self.try_chdir(binDir)
- err = os.system(cmd)
- self.restore_chdir()
-
- def distWix(self):
- generator = self.getGeneratorFromConfig().cmakeName
-
- arch = 'x86'
- if generator.endswith('Win64'):
- arch = 'x64'
-
- version = self.getVersionFromCmake()
- args = "/p:DefineConstants=\"Version=%s\"" % version
-
- self.run_vcbuild(
- generator, 'release', 'synergy.sln', args,
- 'src/setup/win32/', 'x86')
-
- filename = "%s-%s-Windows-%s.msi" % (
- self.project,
- version,
- arch)
-
- old = "bin/Release/synergy.msi"
- new = "bin/Release/%s" % (filename)
-
- try:
- os.remove(new)
- except OSError:
- pass
-
- os.rename(old, new)
-
- def distNsis(self, vcRedistDir, qtDir):
-
- if vcRedistDir == '':
- raise Exception(
- 'VC++ redist dir path not specified (--vcredist-dir).')
-
- if qtDir == '':
- raise Exception(
- 'QT SDK dir path not specified (--qt-dir).')
-
- generator = self.getGeneratorFromConfig().cmakeName
-
- arch = 'x86'
- installDirVar = '$PROGRAMFILES32'
-
- if generator.endswith('Win64'):
- arch = 'x64'
- installDirVar = '$PROGRAMFILES64'
-
- templateFile = open(self.cmake_dir + '\Installer.nsi.in')
- template = templateFile.read()
-
- template = template.replace('${in:version}', self.getVersionFromCmake())
- template = template.replace('${in:arch}', arch)
- template = template.replace('${in:vcRedistDir}', vcRedistDir)
- template = template.replace('${in:qtDir}', qtDir)
- template = template.replace('${in:installDirVar}', installDirVar)
-
- nsiPath = self.getGenerator().buildDir + '\Installer.nsi'
- nsiFile = open(nsiPath, 'w')
- nsiFile.write(template)
- nsiFile.close()
-
- command = 'makensis ' + nsiPath
- print 'NSIS command: ' + command
- err = os.system(command)
- if err != 0:
- raise Exception('Package failed: ' + str(err))
-
- def getVersionFromCmake(self):
- cmakeFile = open('CMakeLists.txt')
- cmake = cmakeFile.read()
-
- majorRe = re.search('VERSION_MAJOR (\d+)', cmake)
- major = majorRe.group(1)
-
- minorRe = re.search('VERSION_MINOR (\d+)', cmake)
- minor = minorRe.group(1)
-
- revRe = re.search('VERSION_REV (\d+)', cmake)
- rev = revRe.group(1)
-
- return major + '.' + minor + '.' + rev
-
- def ftpUpload(self, ftp, source, target):
- print "Uploading '%s' as '%s' to FTP server '%s'..." % (
- source, target, ftp.host)
- ftp.run(source, target)
- print 'Done'
-
- def distftp(self, type, ftp):
- if not type:
- raise Exception('Platform type not specified.')
-
- self.loadConfig()
-
- binDir = self.getGenerator().getBinDir('Release')
-
- packageSource = binDir + '/' + self.dist_name(type)
- packageTarget = self.dist_name_rev(type)
- self.ftpUpload(ftp, packageSource, packageTarget)
-
- if (type != 'src'):
- pluginsDir = binDir + '/plugins'
- nsPluginSource = self.findLibraryFile(type, pluginsDir, 'ns')
- nsPluginTarget = self.getLibraryDistFilename(type, pluginsDir, 'ns')
- self.ftpUpload(ftp, nsPluginSource, nsPluginTarget)
-
- def getLibraryDistFilename(self, type, dir, name):
- (platform, packageExt, libraryExt) = self.getDistributePlatformInfo(type)
- branch = self.getGitBranchName()
- revision = self.getGitRevision()
- firstPart = '%s-%s-%s-%s' % (name, branch, revision, platform)
-
- filename = '%s.%s' % (firstPart, libraryExt)
- if type == 'rpm' or type == 'deb':
- # linux is a bit special, include dist type (deb/rpm in filename)
- filename = '%s-%s.%s' % (firstPart, packageExt, libraryExt)
-
- return filename
-
- def findLibraryFile(self, type, dir, name):
- (platform, packageExt, libraryExt) = self.getDistributePlatformInfo(type)
- ext = libraryExt
-
- pattern = name + '\.' + ext
-
- for filename in os.listdir(dir):
- if re.search(pattern, filename):
- return dir + '/' + filename
-
- raise Exception('Could not find library name with pattern: ' + pattern)
-
- def getDistributePlatformInfo(self, type):
- ext = None
- libraryExt = None
- platform = None
-
- if type == 'src':
- ext = 'tar.gz'
- platform = 'Source'
-
- elif type == 'rpm' or type == 'deb':
- ext = type
- libraryExt = 'so'
- platform = self.getLinuxPlatform()
-
- elif type == 'win':
- # get platform based on last generator used
- ext = 'msi'
- libraryExt = 'dll'
- generator = self.getGeneratorFromConfig().cmakeName
- if generator.find('Win64') != -1:
- platform = 'Windows-x64'
- else:
- platform = 'Windows-x86'
-
- elif type == 'mac':
- ext = "dmg"
- libraryExt = 'dylib'
- platform = self.getMacPackageName()
-
- if not platform:
- raise Exception('Unable to detect distributable platform.')
-
- return (platform, ext, libraryExt)
-
- def dist_name(self, type):
- (platform, packageExt, libraryExt) = self.getDistributePlatformInfo(type)
- ext = packageExt
-
- pattern = (
- re.escape(self.project + '-') + '\d+\.\d+\.\d+' +
- re.escape('-' + platform + '.' + ext))
-
- for filename in os.listdir(self.getBinDir('Release')):
- if re.search(pattern, filename):
- return filename
-
- # still here? package probably not created yet.
- raise Exception('Could not find package name with pattern: ' + pattern)
-
- def dist_name_rev(self, type):
- # find the version number (we're puting the rev in after this)
- pattern = '(\d+\.\d+\.\d+)'
- replace = "%s-%s" % (
- self.getGitBranchName(), self.getGitRevision())
- return re.sub(pattern, replace, self.dist_name(type))
-
- def getDebianArch(self):
- if os.uname()[4][:3] == 'arm':
- return 'armhf'
-
- # os_bits should be loaded with '32bit' or '64bit'
- import platform
- (os_bits, other) = platform.architecture()
-
- # get platform based on current platform
- if os_bits == '32bit':
- return 'i386'
- elif os_bits == '64bit':
- return 'amd64'
- else:
- raise Exception("unknown os bits: " + os_bits)
-
- def getLinuxPlatform(self):
- if os.uname()[4][:3] == 'arm':
- return 'Linux-armv6l'
-
- # os_bits should be loaded with '32bit' or '64bit'
- import platform
- (os_bits, other) = platform.architecture()
-
- # get platform based on current platform
- if os_bits == '32bit':
- return 'Linux-i686'
- elif os_bits == '64bit':
- return 'Linux-x86_64'
- else:
- raise Exception("unknown os bits: " + os_bits)
-
- def dist_usage(self):
- print ('Usage: %s package [package-type]\n'
- '\n'
- 'Replace [package-type] with one of:\n'
- ' src .tar.gz source (Posix only)\n'
- ' rpm .rpm package (Red Hat)\n'
- ' deb .deb paclage (Debian)\n'
- ' win .exe installer (Windows)\n'
- ' mac .dmg package (Mac OS X)\n'
- '\n'
- 'Example: %s package src-tgz') % (self.this_cmd, self.this_cmd)
-
- def about(self):
- print ('Help Me script, from the Synergy project.\n'
- '%s\n'
- '\n'
- 'For help, run: %s help') % (self.website_url, self.this_cmd)
-
- def try_chdir(self, dir):
- global prevdir
-
- if dir == '':
- prevdir = ''
- return
-
- # Ensure temp build dir exists.
- if not os.path.exists(dir):
- print 'Creating dir: ' + dir
- os.makedirs(dir)
-
- prevdir = os.path.abspath(os.curdir)
-
- # It will exist by this point, so it's safe to chdir.
- print 'Entering dir: ' + dir
- os.chdir(dir)
-
- def restore_chdir(self):
- global prevdir
- if prevdir == '':
- return
- print 'Going back to: ' + prevdir
- os.chdir(prevdir)
-
- def open_internal(self, project_filename, application = ''):
-
- if not os.path.exists(project_filename):
- raise Exception('Project file (%s) not found, run hm conf first.' % project_filename)
- else:
- path = project_filename
-
- if application != '':
- path = application + ' ' + path
-
- err = os.system(path)
- if err != 0:
- raise Exception('Could not open project with error code code: ' + str(err))
-
- def setup(self, target=''):
- print "Running setup..."
-
- oldGenerator = self.findGeneratorFromConfig()
- if not oldGenerator == None:
- for target in ['debug', 'release']:
- buildDir = oldGenerator.getBuildDir(target)
-
- cmakeCacheFilename = 'CMakeCache.txt'
- if buildDir != '':
- cmakeCacheFilename = buildDir + '/' + cmakeCacheFilename
-
- if os.path.exists(cmakeCacheFilename):
- print "Removing %s, since generator changed." % cmakeCacheFilename
- os.remove(cmakeCacheFilename)
-
- # always either get generator from args, or prompt user when
- # running setup
- generator = self.get_generator_from_prompt()
-
- config = self.getConfig()
- config.set('hm', 'setup_version', self.setup_version)
-
- # store the generator so we don't need to ask again
- config.set('cmake', 'generator', generator)
-
- self.write_config(config)
-
- # for all targets, set conf not run
- self.setConfRun('all', False)
- self.setConfRun('debug', False)
- self.setConfRun('release', False)
-
- print "Setup complete."
-
- def getConfig(self):
- if os.path.exists(self.configFilename):
- config = ConfigParser.ConfigParser()
- config.read(self.configFilename)
- else:
- config = ConfigParser.ConfigParser()
-
- if not config.has_section('hm'):
- config.add_section('hm')
-
- if not config.has_section('cmake'):
- config.add_section('cmake')
-
- return config
-
- def write_config(self, config, target=''):
- if not os.path.isdir(self.configDir):
- os.mkdir(self.configDir)
- configfile = open(self.configFilename, 'wb')
- config.write(configfile)
-
- def getGeneratorFromConfig(self):
- generator = self.findGeneratorFromConfig()
- if generator:
- return generator
-
- raise Exception("Could not find generator: " + name)
-
- def findGeneratorFromConfig(self):
- config = ConfigParser.RawConfigParser()
- config.read(self.configFilename)
-
- if not config.has_section('cmake'):
- return None
-
- name = config.get('cmake', 'generator')
-
- generators = self.get_generators()
- keys = generators.keys()
- keys.sort()
- for k in keys:
- if generators[k].cmakeName == name:
- return generators[k]
-
- return None
-
- def min_setup_version(self, version):
- if os.path.exists(self.configFilename):
- config = ConfigParser.RawConfigParser()
- config.read(self.configFilename)
-
- try:
- return config.getint('hm', 'setup_version') >= version
- except:
- return False
- else:
- return False
-
- def hasConfRun(self, target):
- if self.min_setup_version(2):
- config = ConfigParser.RawConfigParser()
- config.read(self.configFilename)
- try:
- return config.getboolean('hm', 'conf_done_' + target)
- except:
- return False
- else:
- return False
-
- def setConfRun(self, target, hasRun=True):
- if self.min_setup_version(3):
- config = ConfigParser.RawConfigParser()
- config.read(self.configFilename)
- config.set('hm', 'conf_done_' + target, hasRun)
- self.write_config(config)
- else:
- raise Exception("User does not have correct setup version.")
-
- def get_generators(self):
- if sys.platform == 'win32':
- return self.win32_generators
- elif sys.platform in ['linux2', 'sunos5', 'freebsd7', 'aix5']:
- return self.unix_generators
- elif sys.platform == 'darwin':
- return self.darwin_generators
- else:
- raise Exception('Unsupported platform: ' + sys.platform)
-
- def get_generator_from_prompt(self):
- return self.getGenerator().cmakeName
-
- def getGenerator(self):
- generators = self.get_generators()
- if len(generators.keys()) == 1:
- return generators[generators.keys()[0]]
-
- # if user has specified a generator as an argument
- if self.generator_id:
- return generators[int(self.generator_id)]
-
- conf = self.findGeneratorFromConfig()
- if conf:
- return conf
-
- raise Exception(
- 'Generator not specified, use -g arg ' +
- '(use `hm genlist` for a list of generators).')
-
- def setup_generator_prompt(self, generators):
-
- if self.no_prompts:
- raise Exception('User prompting is disabled.')
-
- prompt = 'Enter a number:'
- print prompt,
-
- generator_id = raw_input()
-
- if generator_id in generators:
- print 'Selected generator:', generators[generator_id]
- else:
- print 'Invalid number, try again.'
- self.setup_generator_prompt(generators)
-
- return generators[generator_id]
-
- def get_vcvarsall(self, generator):
- import platform, _winreg
-
- # os_bits should be loaded with '32bit' or '64bit'
- (os_bits, other) = platform.architecture()
-
- # visual studio is a 32-bit app, so when we're on 64-bit, we need to check the WoW dungeon
- if os_bits == '64bit':
- key_name = r'SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7'
- else:
- key_name = r'SOFTWARE\Microsoft\VisualStudio\SxS\VC7'
-
- try:
- key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key_name)
- except:
- raise Exception('Unable to open Visual Studio registry key. Application may not be installed.')
-
- if generator.startswith('Visual Studio 8'):
- value,type = _winreg.QueryValueEx(key, '8.0')
- elif generator.startswith('Visual Studio 9'):
- value,type = _winreg.QueryValueEx(key, '9.0')
- elif generator.startswith('Visual Studio 10'):
- value,type = _winreg.QueryValueEx(key, '10.0')
- else:
- raise Exception('Cannot determine vcvarsall.bat location for: ' + generator)
-
- # not sure why, but the value on 64-bit differs slightly to the original
- if os_bits == '64bit':
- path = value + r'vc\vcvarsall.bat'
- else:
- path = value + r'vcvarsall.bat'
-
- if not os.path.exists(path):
- raise Exception("'%s' not found." % path)
-
- return path
-
- def run_vcbuild(self, generator, mode, solution, args='', dir='', config32='Win32'):
- import platform
-
- # os_bits should be loaded with '32bit' or '64bit'
- (os_bits, other) = platform.architecture()
- # Now we choose the parameters bases on OS 32/64 and our target 32/64
- # http://msdn.microsoft.com/en-us/library/x4d2c09s%28VS.80%29.aspx
-
- # valid options are only: ia64 amd64 x86_amd64 x86_ia64
- # but calling vcvarsall.bat does not garantee that it will work
- # ret code from vcvarsall.bat is always 0 so the only way of knowing that I worked is by analysing the text output
- # ms bugg: install VS9, FeaturePack, VS9SP1 and you'll obtain a vcvarsall.bat that fails.
- if generator.find('Win64') != -1:
- # target = 64bit
- if os_bits == '32bit':
- vcvars_platform = 'x86_amd64' # 32bit OS building 64bit app
- else:
- vcvars_platform = 'amd64' # 64bit OS building 64bit app
- config_platform = 'x64'
- else: # target = 32bit
- vcvars_platform = 'x86' # 32/64bit OS building 32bit app
- config_platform = config32
-
- if mode == 'release':
- config = 'Release'
- else:
- config = 'Debug'
-
- if generator.startswith('Visual Studio 10'):
- cmd = ('@echo off\n'
- 'call "%s" %s \n'
- 'cd "%s"\n'
- 'msbuild /nologo %s /p:Configuration="%s" /p:Platform="%s" "%s"'
- ) % (self.get_vcvarsall(generator), vcvars_platform, dir, args, config, config_platform, solution)
- else:
- config = config + '|' + config_platform
- cmd = ('@echo off\n'
- 'call "%s" %s \n'
- 'cd "%s"\n'
- 'vcbuild /nologo %s "%s" "%s"'
- ) % (self.get_vcvarsall(generator), vcvars_platform, dir, args, solution, config)
-
- # Generate a batch file, since we can't use environment variables directly.
- temp_bat = self.getBuildDir() + r'\vcbuild.bat'
- file = open(temp_bat, 'w')
- file.write(cmd)
- file.close()
-
- err = os.system(temp_bat)
- if err != 0:
- raise Exception('Microsoft compiler failed with error code: ' + str(err))
-
- def ensure_setup_latest(self):
- if not self.min_setup_version(self.setup_version):
- self.setup()
-
- def reformat(self):
- err = os.system(
- r'tool\astyle\AStyle.exe '
- '--quiet --suffix=none --style=java --indent=force-tab=4 --recursive '
- 'lib/*.cpp lib/*.h cmd/*.cpp cmd/*.h')
-
- if err != 0:
- raise Exception('Reformat failed with error code: ' + str(err))
-
- def printGeneratorList(self):
- generators = self.get_generators()
- keys = generators.keys()
- keys.sort()
- for k in keys:
- print str(k) + ': ' + generators[k].cmakeName
-
- def getMacVersion(self):
- if not self.macSdk:
- raise Exception("Mac OS X SDK not set.")
-
- result = re.search('(\d+)\.(\d+)', self.macSdk)
- if not result:
- print versions
- raise Exception("Could not find Mac OS X version.")
-
- major = int(result.group(1))
- minor = int(result.group(2))
- return (major, minor)
-
- def getMacPackageName(self):
-
- (major, minor) = self.getMacVersion()
-
- if major == 10:
- if minor <= 4:
- # 10.4: intel and power pc
- arch = "Universal"
- elif minor <= 6:
- # 10.5: 32-bit intel
- arch = "i386"
- else:
- # 10.7: 64-bit intel (gui only)
- arch = "x86_64"
- else:
- raise Exception("Mac OS major version unknown: " +
- str(major))
-
- # version is major and minor with no dots (e.g. 106)
- version = str(major) + str(minor)
-
- return "MacOSX%s-%s" % (version, arch)
-
- def reset(self):
- if os.path.exists('build'):
- shutil.rmtree('build')
-
- if os.path.exists('bin'):
- shutil.rmtree('bin')
-
- if os.path.exists('lib'):
- shutil.rmtree('lib')
-
- if os.path.exists('src/gui/tmp'):
- shutil.rmtree('src/gui/tmp')
-
- # qt 4.3 generates ui_ files.
- for filename in glob.glob("src/gui/ui_*"):
- os.remove(filename)
-
-# the command handler should be called only from hm.py (i.e. directly
-# from the command prompt). the purpose of this class is so that we
-# don't need to do argument handling all over the place in the internal
-# commands class.
-class CommandHandler:
- ic = InternalCommands()
- build_targets = []
- vcRedistDir = ''
- qtDir = ''
-
- def __init__(self, argv, opts, args, verbose):
-
- self.ic.verbose = verbose
-
- self.opts = opts
- self.args = args
-
- for o, a in self.opts:
- if o == '--no-prompts':
- self.ic.no_prompts = True
- elif o in ('-g', '--generator'):
- self.ic.generator_id = a
- elif o == '--skip-gui':
- self.ic.enableMakeGui = False
- elif o == '--skip-core':
- self.ic.enableMakeCore = False
- elif o in ('-d', '--debug'):
- self.build_targets += ['debug',]
- elif o in ('-r', '--release'):
- self.build_targets += ['release',]
- elif o == '--vcredist-dir':
- self.vcRedistDir = a
- elif o == '--qt-dir':
- self.qtDir = a
- elif o == '--mac-sdk':
- self.ic.macSdk = a
- elif o == '--mac-identity':
- self.ic.macIdentity = a
-
- def about(self):
- self.ic.about()
-
- def setup(self):
- self.ic.setup()
-
- def configure(self):
- self.ic.configureAll(self.build_targets)
-
- def build(self):
- self.ic.build(self.build_targets)
-
- def clean(self):
- self.ic.clean(self.build_targets)
-
- def update(self):
- self.ic.update()
-
- def install(self):
- print 'Not yet implemented: install'
-
- def doxygen(self):
- self.ic.doxygen()
-
- def dist(self):
-
- type = None
- if len(self.args) > 0:
- type = self.args[0]
-
- self.ic.dist(type, self.vcRedistDir, self.qtDir)
-
- def distftp(self):
- type = None
- host = None
- user = None
- password = None
- dir = None
-
- if len(self.args) > 0:
- type = self.args[0]
-
- for o, a in self.opts:
- if o == '--host':
- host = a
- elif o == '--user':
- user = a
- elif o == '--pass':
- password = a
- elif o == '--dir':
- dir = a
-
- if not host:
- raise Exception('FTP host was not specified.')
-
- ftp = ftputil.FtpUploader(
- host, user, password, dir)
-
- self.ic.distftp(type, ftp)
-
- def destroy(self):
- self.ic.destroy()
-
- def kill(self):
- self.ic.kill()
-
- def usage(self):
- self.ic.usage()
-
- def revision(self):
- self.ic.revision()
-
- def reformat(self):
- self.ic.reformat()
-
- def open(self):
- self.ic.open()
-
- def genlist(self):
- self.ic.printGeneratorList()
-
- def reset(self):
- self.ic.reset()
-
- def signwin(self):
- pfx = None
- pwd = None
- dist = False
- for o, a in self.opts:
- if o == '--pfx':
- pfx = a
- elif o == '--pwd':
- pwd = a
- elif o == '--dist':
- dist = True
- self.ic.signwin(pfx, pwd, dist)
-
- def signmac(self):
- self.ic.signmac()
diff --git a/ext/toolchain/shitindent.py b/ext/toolchain/shitindent.py
deleted file mode 100644
index a6df18d1..00000000
--- a/ext/toolchain/shitindent.py
+++ /dev/null
@@ -1,31 +0,0 @@
- def getDebianArch(self):
- if os.uname()[4][:3] == 'arm':
- return 'armhf'
-
- # os_bits should be loaded with '32bit' or '64bit'
- import platform
- (os_bits, other) = platform.architecture()
-
- # get platform based on current platform
- if os_bits == '32bit':
- return 'i386'
- elif os_bits == '64bit':
- return 'amd64'
- else:
- raise Exception("unknown os bits: " + os_bits)
-
- def getLinuxPlatform(self):
- if os.uname()[4][:3] == 'arm':
- return 'Linux-armv6l'
-
- # os_bits should be loaded with '32bit' or '64bit'
- import platform
- (os_bits, other) = platform.architecture()
-
- # get platform based on current platform
- if os_bits == '32bit':
- return 'Linux-i686'
- elif os_bits == '64bit':
- return 'Linux-x86_64'
- else:
- raise Exception("unknown os bits: " + os_bits)
\ No newline at end of file