def main(): arguments = parse_arguments() tempdir_base = tempfile.mkdtemp() tempdir = os.path.join(tempdir_base, os.path.basename(arguments.binary_directory)) try: common.copytree(arguments.binary_directory, tempdir, symlinks=True, ignore=common.is_debug) if common.is_mac_platform(): app_path = [ app for app in os.listdir(tempdir) if app.endswith('.app') ][0] common.codesign(os.path.join(tempdir, app_path)) os.symlink('/Applications', os.path.join(tempdir, 'Applications')) shutil.copy( os.path.join(arguments.source_directory, 'LICENSE.GPL3-EXCEPT'), tempdir) dmg_cmd = [ 'hdiutil', 'create', '-srcfolder', tempdir, '-volname', arguments.dmg_volumename, '-format', 'UDBZ', arguments.target_diskimage, '-ov', '-scrub', '-size', '1500m', '-verbose' ] subprocess.check_call(dmg_cmd) # sleep a few seconds to make sure disk image is fully unmounted etc time.sleep(5) finally: shutil.rmtree(tempdir_base)
def deploy_qt(args, paths): if common.is_mac_platform(): script = os.path.join(paths.src, 'scripts', 'deployqtHelper_mac.sh') app = os.path.join(paths.install, args.app_target) # TODO this is wrong if Qt is set up non-standard # TODO integrate deployqtHelper_mac.sh into deployqt.py, finally qt_bins = os.path.join(paths.qt, 'bin') qt_translations = os.path.join(paths.qt, 'translations') qt_plugins = os.path.join(paths.qt, 'plugins') qt_imports = os.path.join(paths.qt, 'imports') qt_qml = os.path.join(paths.qt, 'qml') env = dict(os.environ) if paths.llvm: env['LLVM_INSTALL_DIR'] = paths.llvm common.check_print_call([ script, app, qt_bins, qt_translations, qt_plugins, qt_imports, qt_qml ], paths.build, env=env) else: cmd_args = [ 'python', '-u', os.path.join(paths.src, 'scripts', 'deployqt.py'), '-i' ] if paths.elfutils: cmd_args.extend(['--elfutils-path', paths.elfutils]) if paths.llvm: cmd_args.extend(['--llvm-path', paths.llvm]) exe = os.path.join(paths.install, 'bin', args.app_target) common.check_print_call( cmd_args + [exe, os.path.join(paths.qt, 'bin', 'qmake')], paths.build)
def package_qtcreator(args, paths): if not args.no_zip: common.check_print_call([ '7z', 'a', '-mmt2', os.path.join(paths.result, 'qtcreator.7z'), '*' ], paths.install) common.check_print_call([ '7z', 'a', '-mmt2', os.path.join(paths.result, 'qtcreator_dev.7z'), '*' ], paths.dev_install) if common.is_windows_platform(): common.check_print_call([ '7z', 'a', '-mmt2', os.path.join(paths.result, 'wininterrupt.7z'), '*' ], paths.wininterrupt_install) if not args.no_cdb: common.check_print_call([ '7z', 'a', '-mmt2', os.path.join(paths.result, 'qtcreatorcdbext.7z'), '*' ], paths.qtcreatorcdbext_install) if common.is_mac_platform(): if args.keychain_unlock_script: common.check_print_call([args.keychain_unlock_script], paths.install) if not args.no_dmg: common.check_print_call([ 'python', '-u', os.path.join(paths.src, 'scripts', 'makedmg.py'), 'qt-creator.dmg', 'Qt Creator', paths.src, paths.install ], paths.result)
def get_args(): parser = argparse.ArgumentParser(description='Deploy Qt Creator dependencies for packaging') parser.add_argument('-i', '--ignore-errors', help='For backward compatibility', action='store_true', default=False) parser.add_argument('--elfutils-path', help='Path to elfutils installation for use by perfprofiler (Windows, Linux)') # TODO remove defaulting to LLVM_INSTALL_DIR when we no longer build qmake based packages parser.add_argument('--llvm-path', help='Path to LLVM installation', default=os.environ.get('LLVM_INSTALL_DIR')) parser.add_argument('qtcreator_binary', help='Path to Qt Creator binary (or the app bundle on macOS)') parser.add_argument('qmake_binary', help='Path to qmake binary') args = parser.parse_args() args.qtcreator_binary = os.path.abspath(args.qtcreator_binary) if common.is_mac_platform(): if not args.qtcreator_binary.lower().endswith(".app"): args.qtcreator_binary = args.qtcreator_binary + ".app" check = os.path.isdir else: check = os.path.isfile if common.is_windows_platform() and not args.qtcreator_binary.lower().endswith(".exe"): args.qtcreator_binary = args.qtcreator_binary + ".exe" if not check(args.qtcreator_binary): print('Cannot find Qt Creator binary.') sys.exit(1) args.qmake_binary = which(args.qmake_binary) if not args.qmake_binary: print('Cannot find qmake binary.') sys.exit(2) return args
def get_arguments(): parser = argparse.ArgumentParser(description='Build Qt Creator for packaging') parser.add_argument('--src', help='path to sources', required=True) parser.add_argument('--build', help='path that should be used for building', required=True) parser.add_argument('--qt-path', help='Path to Qt', required=True) parser.add_argument('--build-type', help='Build type to pass to CMake (defaults to RelWithDebInfo)', default='RelWithDebInfo') # clang codemodel parser.add_argument('--llvm-path', help='Path to LLVM installation for Clang code model', default=os.environ.get('LLVM_INSTALL_DIR')) # perfparser parser.add_argument('--elfutils-path', help='Path to elfutils installation for use by perfprofiler (Windows, Linux)') # signing parser.add_argument('--keychain-unlock-script', help='Path to script for unlocking the keychain used for signing (macOS)') # cdbextension parser.add_argument('--python-path', help='Path to python libraries for use by cdbextension (Windows)') parser.add_argument('--app-target', help='File name of the executable / app bundle', default=('Qt Creator.app' if common.is_mac_platform() else 'qtcreator')) parser.add_argument('--python3', help='File path to python3 executable for generating translations', default=default_python3()) parser.add_argument('--no-cdb', help='Skip cdbextension and the python dependency packaging step (Windows)', action='store_true', default=(not common.is_windows_platform())) parser.add_argument('--no-docs', help='Skip documentation generation', action='store_true', default=False) parser.add_argument('--no-build-date', help='Does not show build date in about dialog, for reproducible builds', action='store_true', default=False) parser.add_argument('--no-dmg', help='Skip disk image creation (macOS)', action='store_true', default=False) parser.add_argument('--no-zip', help='Skip creation of 7zip files for install and developer package', action='store_true', default=False) parser.add_argument('--with-tests', help='Enable building of tests', action='store_true', default=False) parser.add_argument('--add-path', help='Prepends a CMAKE_PREFIX_PATH to the build', action='append', dest='prefix_paths', default=[]) parser.add_argument('--add-module-path', help='Prepends a CMAKE_MODULE_PATH to the build', action='append', dest='module_paths', default=[]) parser.add_argument('--add-make-arg', help='Passes the argument to the make tool.', action='append', dest='make_args', default=[]) parser.add_argument('--add-config', help=('Adds the argument to the CMake configuration call. ' 'Use "--add-config=-DSOMEVAR=SOMEVALUE" if the argument begins with a dash.'), action='append', dest='config_args', default=[]) parser.add_argument('--zip-infix', help='Adds an infix to generated zip files, use e.g. for a build number.', default='') args = parser.parse_args() args.with_debug_info = args.build_type == 'RelWithDebInfo' return args
def get_arguments(): parser = argparse.ArgumentParser( description='Build Qt Creator for packaging') parser.add_argument('--src', help='path to sources', required=True) parser.add_argument('--build', help='path that should be used for building', required=True) parser.add_argument('--qt-path', help='Path to Qt', required=True) parser.add_argument('--debug', help='Enable debug builds', action='store_true', default=False) # clang codemodel parser.add_argument('--llvm-path', help='Path to LLVM installation for Clang code model', default=os.environ.get('LLVM_INSTALL_DIR')) # perfparser parser.add_argument( '--elfutils-path', help= 'Path to elfutils installation for use by perfprofiler (Windows, Linux)' ) # signing parser.add_argument( '--keychain-unlock-script', help= 'Path to script for unlocking the keychain used for signing (macOS)') # cdbextension parser.add_argument( '--python-path', help='Path to python libraries for use by cdbextension (Windows)') parser.add_argument('--app-target', help='File name of the executable / app bundle', default=('Qt Creator.app' if common.is_mac_platform() else 'qtcreator')) parser.add_argument( '--python3', help='File path to python3 executable for generating translations', default=default_python3()) parser.add_argument( '--no-cdb', help= 'Skip cdbextension and the python dependency packaging step (Windows)', action='store_true', default=(not common.is_windows_platform())) parser.add_argument('--no-docs', help='Skip documentation generation', action='store_true', default=False) return parser.parse_args()
def main(): args = get_args() if common.is_mac_platform(): deploy_mac(args) return (qt_install_info, qt_install) = get_qt_install_info(args.qmake_binary) qtcreator_binary_path = os.path.dirname(args.qtcreator_binary) install_dir = os.path.abspath(os.path.join(qtcreator_binary_path, '..')) if common.is_linux_platform(): qt_deploy_prefix = os.path.join(install_dir, 'lib', 'Qt') else: qt_deploy_prefix = os.path.join(install_dir, 'bin') chrpath_bin = None if common.is_linux_platform(): chrpath_bin = which('chrpath') if chrpath_bin == None: print("Cannot find required binary 'chrpath'.") sys.exit(2) plugins = [ 'assetimporters', 'accessible', 'codecs', 'designer', 'iconengines', 'imageformats', 'platformthemes', 'platforminputcontexts', 'platforms', 'printsupport', 'qmltooling', 'sqldrivers', 'styles', 'xcbglintegrations', 'wayland-decoration-client', 'wayland-graphics-integration-client', 'wayland-shell-integration', 'tls' ] if common.is_windows_platform(): global debug_build debug_build = is_debug(args.qtcreator_binary) if common.is_windows_platform(): copy_qt_libs(qt_deploy_prefix, qt_install.bin, qt_install.bin, qt_install.plugins, qt_install.qml, plugins) else: copy_qt_libs(qt_deploy_prefix, qt_install.bin, qt_install.lib, qt_install.plugins, qt_install.qml, plugins) copy_translations(install_dir, qt_install.translations) if args.llvm_path: deploy_libclang(install_dir, args.llvm_path, chrpath_bin) if args.elfutils_path: deploy_elfutils(install_dir, chrpath_bin, args) if not common.is_windows_platform(): print("fixing rpaths...") common.fix_rpaths(install_dir, os.path.join(qt_deploy_prefix, 'lib'), qt_install_info, chrpath_bin) add_qt_conf(os.path.join(install_dir, 'libexec', 'qtcreator'), qt_deploy_prefix) # e.g. for qml2puppet add_qt_conf(os.path.join(qt_deploy_prefix, 'bin'), qt_deploy_prefix) # e.g. qtdiag add_qt_conf(os.path.join(install_dir, 'bin'), qt_deploy_prefix)
def deploy_elfutils(qtc_install_dir, chrpath_bin, args): if common.is_mac_platform(): return def lib_name(name, version): return ('lib' + name + '.so.' + version if common.is_linux_platform() else name + '.dll') version = '1' libs = ['elf', 'dw'] elfutils_lib_path = os.path.join(args.elfutils_path, 'lib') if common.is_linux_platform(): install_path = os.path.join(qtc_install_dir, 'lib', 'elfutils') backends_install_path = install_path elif common.is_windows_platform(): install_path = os.path.join(qtc_install_dir, 'bin') backends_install_path = os.path.join(qtc_install_dir, 'lib', 'elfutils') libs.append('eu_compat') if not os.path.exists(install_path): os.makedirs(install_path) if not os.path.exists(backends_install_path): os.makedirs(backends_install_path) # copy main libs libs = [ os.path.join(elfutils_lib_path, lib_name(lib, version)) for lib in libs ] for lib in libs: print(lib, '->', install_path) shutil.copy(lib, install_path) # fix rpath if common.is_linux_platform(): relative_path = os.path.relpath(backends_install_path, install_path) subprocess.check_call([ chrpath_bin, '-r', os.path.join('$ORIGIN', relative_path), os.path.join(install_path, lib_name('dw', version)) ]) # copy backend files # only non-versioned, we never dlopen the versioned ones files = glob(os.path.join(elfutils_lib_path, 'elfutils', '*ebl_*.*')) versioned_files = glob( os.path.join(elfutils_lib_path, 'elfutils', '*ebl_*.*-*.*.*')) unversioned_files = [file for file in files if file not in versioned_files] for file in unversioned_files: print(file, '->', backends_install_path) shutil.copy(file, backends_install_path)
def main(): arguments = parse_arguments() tempdir_base = tempfile.mkdtemp() tempdir = os.path.join(tempdir_base, os.path.basename(arguments.binary_directory)) try: common.copytree(arguments.binary_directory, tempdir, symlinks=True, ignore=common.is_debug) if common.is_mac_platform(): app_path = [app for app in os.listdir(tempdir) if app.endswith('.app')][0] common.codesign(os.path.join(tempdir, app_path)) os.symlink('/Applications', os.path.join(tempdir, 'Applications')) shutil.copy(os.path.join(arguments.source_directory, 'LICENSE.GPL3-EXCEPT'), tempdir) dmg_cmd = ['hdiutil', 'create', '-srcfolder', tempdir, '-volname', arguments.dmg_volumename, '-format', 'UDBZ', arguments.target_diskimage, '-ov', '-scrub', '-size', '1g', '-verbose'] subprocess.check_call(dmg_cmd) # sleep a few seconds to make sure disk image is fully unmounted etc time.sleep(5) finally: shutil.rmtree(tempdir_base)
def package_qtcreator(args, paths): if not args.no_zip: if not args.no_qtcreator: common.check_print_call([ '7z', 'a', '-mmt' + args.zip_threads, os.path.join(paths.result, 'qtcreator' + args.zip_infix + '.7z'), zipPatternForApp(paths) ], paths.install) common.check_print_call([ '7z', 'a', '-mmt' + args.zip_threads, os.path.join(paths.result, 'qtcreator' + args.zip_infix + '_dev.7z'), '*' ], paths.dev_install) if args.with_debug_info: common.check_print_call([ '7z', 'a', '-mmt' + args.zip_threads, os.path.join(paths.result, 'qtcreator' + args.zip_infix + '-debug.7z'), '*' ], paths.debug_install) if common.is_windows_platform(): common.check_print_call([ '7z', 'a', '-mmt' + args.zip_threads, os.path.join(paths.result, 'wininterrupt' + args.zip_infix + '.7z'), '*' ], paths.wininterrupt_install) if not args.no_cdb: common.check_print_call([ '7z', 'a', '-mmt' + args.zip_threads, os.path.join(paths.result, 'qtcreatorcdbext' + args.zip_infix + '.7z'), '*' ], paths.qtcreatorcdbext_install) if common.is_mac_platform() and not args.no_dmg and not args.no_qtcreator: if args.keychain_unlock_script: common.check_print_call([args.keychain_unlock_script], paths.install) common.check_print_call([ 'python', '-u', os.path.join(paths.src, 'scripts', 'makedmg.py'), 'qt-creator' + args.zip_infix + '.dmg', 'Qt Creator', paths.src, paths.install ], paths.result)
def deploy_qt(args, paths): if common.is_mac_platform(): script = os.path.join(paths.src, 'scripts', 'deployqtHelper_mac.sh') app = os.path.join(paths.install, args.app_target) # TODO this is wrong if Qt is set up non-standard # TODO integrate deployqtHelper_mac.sh into deployqt.py, finally qt_bins = os.path.join(paths.qt, 'bin') qt_translations = os.path.join(paths.qt, 'translations') qt_plugins = os.path.join(paths.qt, 'plugins') qt_imports = os.path.join(paths.qt, 'imports') qt_qml = os.path.join(paths.qt, 'qml') common.check_print_call([ script, app, qt_bins, qt_translations, qt_plugins, qt_imports, qt_qml ], paths.build) else: exe = os.path.join(paths.install, 'bin', args.app_target) common.check_print_call([ 'python', '-u', os.path.join(paths.src, 'scripts', 'deployqt.py'), '-i', exe, os.path.join(paths.qt, 'bin', 'qmake') ], paths.build)
plugins = ['egldeviceintegrations', 'iconengines', 'imageformats', 'platforms', 'printsupport', 'sqldrivers', 'xcbglintegrations'] #OPENMV-DIFF# imports = ['Qt', 'QtWebKit'] if common.is_windows_platform(): global debug_build debug_build = is_debug_build(install_dir) if common.is_windows_platform(): copy_qt_libs(qt_deploy_prefix, QT_INSTALL_BINS, QT_INSTALL_PLUGINS, QT_INSTALL_IMPORTS, QT_INSTALL_QML, plugins, imports) else: copy_qt_libs(qt_deploy_prefix, QT_INSTALL_LIBS, QT_INSTALL_PLUGINS, QT_INSTALL_IMPORTS, QT_INSTALL_QML, plugins, imports) copy_translations(install_dir, QT_INSTALL_TRANSLATIONS) if "LLVM_INSTALL_DIR" in os.environ: deploy_libclang(install_dir, os.environ["LLVM_INSTALL_DIR"], chrpath_bin) if not common.is_windows_platform(): print "fixing rpaths..." common.fix_rpaths(install_dir, os.path.join(qt_deploy_prefix, 'lib'), qt_install_info, chrpath_bin) #OPENMV-DIFF# #add_qt_conf(os.path.join(install_dir, 'libexec', 'qtcreator'), qt_deploy_prefix) # e.g. for qml2puppet #OPENMV-DIFF# add_qt_conf(os.path.join(install_dir, 'bin'), qt_deploy_prefix) if __name__ == "__main__": if common.is_mac_platform(): print "Mac OS is not supported by this script, please use macqtdeploy!" sys.exit(2) else: main()
def zipPatternForApp(paths): # workaround for QTBUG-95845 if not common.is_mac_platform(): return '*' apps = [d for d in os.listdir(paths.install) if d.endswith('.app')] return apps[0] if apps else '*'
'wayland-graphics-integration-client', 'wayland-shell-integration', ] imports = ['Qt', 'QtWebKit'] if common.is_windows_platform(): global debug_build debug_build = is_debug(qtcreator_binary) if common.is_windows_platform(): copy_qt_libs(qt_deploy_prefix, QT_INSTALL_BINS, QT_INSTALL_BINS, QT_INSTALL_PLUGINS, QT_INSTALL_IMPORTS, QT_INSTALL_QML, plugins, imports) else: copy_qt_libs(qt_deploy_prefix, QT_INSTALL_BINS, QT_INSTALL_LIBS, QT_INSTALL_PLUGINS, QT_INSTALL_IMPORTS, QT_INSTALL_QML, plugins, imports) copy_translations(install_dir, QT_INSTALL_TRANSLATIONS) if "LLVM_INSTALL_DIR" in os.environ: deploy_libclang(install_dir, os.environ["LLVM_INSTALL_DIR"], chrpath_bin) if not common.is_windows_platform(): print("fixing rpaths...") common.fix_rpaths(install_dir, os.path.join(qt_deploy_prefix, 'lib'), qt_install_info, chrpath_bin) add_qt_conf(os.path.join(install_dir, 'libexec', 'qtcreator'), qt_deploy_prefix) # e.g. for qml2puppet add_qt_conf(os.path.join(qt_deploy_prefix, 'bin'), qt_deploy_prefix) # e.g. qtdiag add_qt_conf(os.path.join(install_dir, 'bin'), qt_deploy_prefix) if __name__ == "__main__": if common.is_mac_platform(): print("macOS is not supported by this script, please use macqtdeploy!") sys.exit(2) else: main()
def build(args, paths): if not os.path.exists(paths.build): os.makedirs(paths.build) if not os.path.exists(paths.result): os.makedirs(paths.result) prefix_paths = [os.path.abspath(fp) for fp in args.prefix_paths] + [paths.qt_creator, paths.qt] if common.is_mac_platform(): # --qtc-path may be # "/path/Qt Creator.app/Contents/Resources", # "/path/Qt Creator.app", or # "/path", # so add some variants to the prefix path prefix_paths += [os.path.join(paths.qt_creator, 'Contents', 'Resources'), os.path.join(paths.qt_creator, 'Qt Creator.app', 'Contents', 'Resources')] prefix_paths = [common.to_posix_path(fp) for fp in prefix_paths] separate_debug_info_option = 'ON' if args.with_debug_info else 'OFF' cmake_args = ['cmake', '-DCMAKE_PREFIX_PATH=' + ';'.join(prefix_paths), '-DCMAKE_BUILD_TYPE=' + args.build_type, '-DQTC_SEPARATE_DEBUG_INFO=' + separate_debug_info_option, '-DCMAKE_INSTALL_PREFIX=' + common.to_posix_path(paths.install), '-G', 'Ninja'] # force MSVC on Windows, because it looks for GCC in the PATH first, # even if MSVC is first mentioned in the PATH... # TODO would be nicer if we only did this if cl.exe is indeed first in the PATH if common.is_windows_platform(): cmake_args += ['-DCMAKE_C_COMPILER=cl', '-DCMAKE_CXX_COMPILER=cl'] # TODO this works around a CMake bug https://gitlab.kitware.com/cmake/cmake/issues/20119 cmake_args += ['-DBUILD_WITH_PCH=OFF'] if args.with_docs: cmake_args += ['-DWITH_DOCS=ON'] ide_revision = common.get_commit_SHA(paths.src) if ide_revision: cmake_args += ['-DQTC_PLUGIN_REVISION=' + ide_revision] with open(os.path.join(paths.result, args.name + '.7z.git_sha'), 'w') as f: f.write(ide_revision) cmake_args += args.config_args common.check_print_call(cmake_args + [paths.src], paths.build) build_args = ['cmake', '--build', '.'] if args.make_args: build_args += ['--'] + args.make_args common.check_print_call(build_args, paths.build) if args.with_docs: common.check_print_call(['cmake', '--build', '.', '--target', 'docs'], paths.build) common.check_print_call(['cmake', '--install', '.', '--prefix', paths.install, '--strip'], paths.build) if args.with_docs: common.check_print_call(['cmake', '--install', '.', '--prefix', paths.install, '--component', 'qch_docs'], paths.build) common.check_print_call(['cmake', '--install', '.', '--prefix', paths.install, '--component', 'html_docs'], paths.build) if args.deploy: common.check_print_call(['cmake', '--install', '.', '--prefix', paths.install, '--component', 'Dependencies'], paths.build) common.check_print_call(['cmake', '--install', '.', '--prefix', paths.dev_install, '--component', 'Devel'], paths.build) if args.with_debug_info: common.check_print_call(['cmake', '--install', '.', '--prefix', paths.debug_install, '--component', 'DebugInfo'], paths.build)
def package_qtcreator(args, paths): if not args.no_zip: if not args.no_qtcreator: common.check_print_call([ '7z', 'a', '-mmt' + args.zip_threads, os.path.join(paths.result, 'qtcreator' + args.zip_infix + '.7z'), zipPatternForApp(paths) ], paths.install) common.check_print_call([ '7z', 'a', '-mmt' + args.zip_threads, os.path.join(paths.result, 'qtcreator' + args.zip_infix + '_dev.7z'), '*' ], paths.dev_install) if args.with_debug_info: common.check_print_call([ '7z', 'a', '-mmt' + args.zip_threads, os.path.join(paths.result, 'qtcreator' + args.zip_infix + '-debug.7z'), '*' ], paths.debug_install) if common.is_windows_platform(): common.check_print_call([ '7z', 'a', '-mmt' + args.zip_threads, os.path.join(paths.result, 'wininterrupt' + args.zip_infix + '.7z'), '*' ], paths.wininterrupt_install) if not args.no_cdb: common.check_print_call([ '7z', 'a', '-mmt' + args.zip_threads, os.path.join(paths.result, 'qtcreatorcdbext' + args.zip_infix + '.7z'), '*' ], paths.qtcreatorcdbext_install) if common.is_mac_platform() and not args.no_qtcreator: if args.keychain_unlock_script: common.check_print_call([args.keychain_unlock_script], paths.install) if os.environ.get('SIGNING_IDENTITY'): signed_install_path = paths.install + '-signed' common.copytree(paths.install, signed_install_path, symlinks=True) apps = [ d for d in os.listdir(signed_install_path) if d.endswith('.app') ] if apps: app = apps[0] common.codesign(os.path.join(signed_install_path, app)) if not args.no_zip: common.check_print_call([ '7z', 'a', '-mmt' + args.zip_threads, os.path.join( paths.result, 'qtcreator' + args.zip_infix + '-signed.7z'), app ], signed_install_path) if not args.no_dmg: common.check_print_call([ 'python', '-u', os.path.join(paths.src, 'scripts', 'makedmg.py'), 'qt-creator' + args.zip_infix + '.dmg', 'Qt Creator', paths.src, paths.install ], paths.result)