def clear_folders(): # Clear build folders if is_path(BUILD_DIR): command('rm -rf %s' % BUILD_DIR) if is_path(DIST_DIR): command('rm -rf %s' % DIST_DIR) if not is_path(RELEASE_DIR): os.makedirs(RELEASE_DIR)
def run_build(locally=False, stop_on_error=True): echo_msg('Project %s build started' % PROJECT, code=STDOUT_MAGENTA) echo_msg('=' * 35, code=STDOUT_MAGENTA) if not locally: set_build_stamp() if is_path(RELEASE_DIR): command('sudo rm -rf %s' % RELEASE_DIR) if is_path(LOCALES_DIR): command('sudo rm -rf %s' % LOCALES_DIR) if PROJECT == SK1: command('cd %s && python setup.py build_locales' % PROJECT_DIR) echo_msg('=' * 35, code=STDOUT_MAGENTA) for image in IMAGES if not locally else LOCAL_IMAGES: os_name = image.capitalize().replace('_', ' ') msg = 'Build on %s' % os_name echo_msg(msg + ' ' * (35 - len(msg)) + '...', newline=False) output = ' 1> /dev/null 2> /dev/null' if not DEBUG_MODE else '' cmd = '/vagrant/bbox.py build_package --project=%s' % PROJECT if image == 'packager': cmd = '/vagrant/bbox.py packaging --project=%s' % PROJECT if RELEASE: cmd += ' --release=1' if shell( 'docker run --rm -v %s:%s %s%s %s %s' % (PROJECT_DIR, VAGRANT_DIR, IMAGE_PREFIX, image, cmd, output), 2): echo_msg('[ FAIL ]', code=STDOUT_FAIL) if stop_on_error or not locally: sys.exit(1) else: echo_msg('[ OK ]', code=STDOUT_GREEN) if not locally: msg = 'Publishing result' msg = msg + ' ' * (35 - len(msg)) + '...' echo_msg(msg, newline=False) folder = PROJECT + '-release' if RELEASE else PROJECT if os.system('sshpass -e rsync -a --delete-after -e ' '\'ssh -o StrictHostKeyChecking=no -o ' 'UserKnownHostsFile=/dev/null -p 22\' ' './release/ `echo $RHOST`%s/ ' '1> /dev/null 2> /dev/null' % folder): echo_msg('[ FAIL ]', code=STDOUT_FAIL) sys.exit(1) echo_msg('[ OK ]', code=STDOUT_GREEN) echo_msg('=' * 35, code=STDOUT_MAGENTA)
def run_build(): echo_msg('BuildBox started', code=STDOUT_MAGENTA) echo_msg('=' * 30, code=STDOUT_MAGENTA) if VAGRANT_DIR != PROJECT_DIR: if is_path(VAGRANT_DIR): command('rm -f %s' % VAGRANT_DIR) command('ln -s %s %s' % (PROJECT_DIR, VAGRANT_DIR)) if is_path(RELEASE_DIR): command('rm -rf %s' % RELEASE_DIR) for image in IMAGES: os_name = image.capitalize().replace('_', ' ') echo_msg('Build on %s' % os_name, code=STDOUT_YELLOW) output = ' 1> /dev/null' if not DEBUG_MODE else '' if command('docker run --rm -v %s:%s %s%s %s' % (PROJECT_DIR, VAGRANT_DIR, IMAGE_PREFIX, image, output)): echo_msg('=' * 30 + '> FAIL', code=STDOUT_FAIL) else: echo_msg('=' * 30 + '> OK', code=STDOUT_GREEN) command('chmod -R 777 %s' % RELEASE_DIR) if VAGRANT_DIR != PROJECT_DIR: command('rm -f %s' % VAGRANT_DIR)
def build_msw_packages(): import wixpy distro_folder = os.path.join(RELEASE_DIR, 'MS_Windows') for arch in ['win32', 'win64']: echo_msg('=== Arch %s ===' % arch) portable_name = '%s-%s-%s-portable' % (APP_NAME, APP_VER, arch) if not RELEASE: portable_name = '%s-%s-%s-%s-portable' % \ (APP_NAME, APP_VER, TIMESTAMP, arch) portable_folder = os.path.join(PROJECT_DIR, portable_name) portable_libs = os.path.join(portable_folder, 'libs') if os.path.exists(portable_folder): shutil.rmtree(portable_folder, True) os.mkdir(portable_folder) if not is_path(distro_folder): os.makedirs(distro_folder) # Package building echo_msg('Creating portable package') portable = os.path.join(CACHE_DIR, arch, 'portable.zip') echo_msg('Extracting portable files from %s' % portable) ZipFile(portable, 'r').extractall(portable_folder) obsolete_folders = [ 'stdlib/test/', 'stdlib/lib2to3/tests/', 'stdlib/unittest/', 'stdlib/msilib/', 'stdlib/idlelib/', 'stdlib/ensurepip/', 'stdlib/distutils/' ] for folder in obsolete_folders: shutil.rmtree(os.path.join(portable_folder, folder), True) wx_zip = os.path.join(CACHE_DIR, arch, 'wx.zip') ZipFile(wx_zip, 'r').extractall(portable_libs) portable_exe_zip = os.path.join(CACHE_DIR, arch, '%s_portable.zip' % PROJECT) ZipFile(portable_exe_zip, 'r').extractall(portable_folder) for item in PKGS: src = os.path.join(SRC_DIR, item) echo_msg('Copying tree %s' % src) shutil.copytree(src, os.path.join(portable_libs, item)) build.compile_sources(portable_folder) clear_files(portable_folder, ['py', 'so', 'pyo']) for item in EXTENSIONS: filename = os.path.basename(item) src = os.path.join(CACHE_DIR, arch, 'pyd', filename) dst = os.path.join(portable_libs, item) shutil.copy(src, dst) # Portable package compressing portable_zip = os.path.join(distro_folder, portable_name + '.zip') ziph = ZipFile(portable_zip, 'w', ZIP_DEFLATED) echo_msg('Compressing into %s' % portable_zip) for root, dirs, files in os.walk(portable_folder): for item in files: path = os.path.join(root, item) local_path = path.split(portable_name)[1][1:] ziph.write(path, os.path.join(portable_name, local_path)) ziph.close() # MSI build echo_msg('Creating MSI package') clear_files(portable_folder, ['exe']) nonportable = os.path.join(CACHE_DIR, arch, '%s_msi.zip' % PROJECT) echo_msg('Extracting non-portable executables from %s' % nonportable) ZipFile(nonportable, 'r').extractall(portable_folder) msi_name = portable_name.replace('-portable', '') msi_data = {} msi_data.update(MSI_DATA) msi_data['_SourceDir'] = portable_folder if arch == 'win64': msi_data['Win64'] = 'yes' msi_data['_CheckX64'] = True msi_data['_OutputDir'] = distro_folder msi_data['_OutputName'] = msi_name + '_headless.msi' wixpy.build(msi_data) # Clearing shutil.rmtree(portable_folder, True) # Build clearing ##### shutil.rmtree(BUILD_DIR, True) for item in ['MANIFEST', 'src/script/sk1', 'setup.cfg']: item = os.path.join(PROJECT_DIR, item) if os.path.lexists(item): os.remove(item)
def build_package(): mint_folder = os.path.join(RELEASE_DIR, 'LinuxMint') eos_folder = os.path.join(RELEASE_DIR, 'elementaryOS') mx_folder = os.path.join(RELEASE_DIR, 'MX_Linux') copies = [] out = ' 1> /dev/null 2> /dev/null' if not DEBUG_MODE else '' clear_folders() if SYSFACTS.is_deb: echo_msg('Building DEB package') command('cd %s;python3 %s bdist_deb%s' % (PROJECT_DIR, SCRIPT, out)) old_name = bbox.get_package_name(DIST_DIR) prefix, suffix = old_name.split('_') new_name = prefix + bbox.get_marker(not RELEASE) + suffix prefix += '_' + bbox.TIMESTAMP if not RELEASE else '' if SYSFACTS.is_ubuntu and SYSFACTS.version == '14.04': copies.append((prefix + '_mint_17_' + suffix, mint_folder)) if SYSFACTS.is_64bit: copies.append( (prefix + '_elementary0.3_' + suffix, eos_folder)) elif SYSFACTS.is_ubuntu and SYSFACTS.version == '16.04': copies.append((prefix + '_mint_18_' + suffix, mint_folder)) if SYSFACTS.is_64bit: copies.append( (prefix + '_elementary0.4_' + suffix, eos_folder)) elif SYSFACTS.is_ubuntu and SYSFACTS.version == '18.04': copies.append((prefix + '_mint_19_' + suffix, mint_folder)) if SYSFACTS.is_64bit: copies.append( (prefix + '_elementary5.0_' + suffix, eos_folder)) elif SYSFACTS.is_ubuntu and SYSFACTS.version == '20.04': copies.append((prefix + '_mint_20_' + suffix, mint_folder)) elif SYSFACTS.is_debian: ver = SYSFACTS.version.split('.')[0] if ver == '8': copies.append((prefix + '_mx15_' + suffix, mx_folder)) copies.append((prefix + '_mx16_' + suffix, mx_folder)) elif ver == '9': copies.append((prefix + '_mx17_' + suffix, mx_folder)) copies.append((prefix + '_mx18_' + suffix, mx_folder)) elif ver == '10': copies.append((prefix + '_mx19_' + suffix, mx_folder)) elif SYSFACTS.is_rpm: echo_msg('Building RPM package') command('cd %s;python3 %s bdist_rpm%s' % (PROJECT_DIR, SCRIPT, out)) old_name = bbox.get_package_name(DIST_DIR) items = old_name.split('.') marker = bbox.get_marker(not RELEASE) new_name = '.'.join(items[:-2] + [ marker, ] + items[-2:]) else: echo_msg('Unsupported distro!', code=STDOUT_FAIL) sys.exit(1) distro_folder = os.path.join(RELEASE_DIR, SYSFACTS.hmarker) if not is_path(distro_folder): os.makedirs(distro_folder) old_name = os.path.join(DIST_DIR, old_name) package_name = os.path.join(RELEASE_DIR, distro_folder, new_name) command('cp %s %s' % (old_name, package_name)) # Package copies for name, folder in copies: if not is_path(folder): os.makedirs(folder) name = os.path.join(RELEASE_DIR, folder, name) command('cp %s %s' % (old_name, name)) if SYSFACTS.is_src: echo_msg('Creating source package') if os.path.isdir(DIST_DIR): shutil.rmtree(DIST_DIR, True) command('cd %s;python3 %s sdist %s' % (PROJECT_DIR, SCRIPT, out)) old_name = bbox.get_package_name(DIST_DIR) marker = '_%s' % bbox.TIMESTAMP if not RELEASE else '' new_name = old_name.replace('.tar.gz', '%s.tar.gz' % marker) old_name = os.path.join(DIST_DIR, old_name) package_name = os.path.join(RELEASE_DIR, new_name) command('cp %s %s' % (old_name, package_name)) # ArchLinux PKGBUILD # if os.path.isdir(PKGBUILD_DIR): # shutil.rmtree(PKGBUILD_DIR, True) # os.mkdir(PKGBUILD_DIR) # os.chdir(PKGBUILD_DIR) # # tarball = os.path.join(PKGBUILD_DIR, new_name) # command('cp %s %s' % (package_name, tarball)) # # dest = 'PKGBUILD' # src = os.path.join(ARCH_DIR, '%s-%s' % (dest, APP_NAME)) # command('cp %s %s' % (src, dest)) # command("sed -i 's/VERSION/%s/g' %s" % (APP_VER, dest)) # command("sed -i 's/TARBALL/%s/g' %s" % (new_name, dest)) # # dest = 'README' # src = os.path.join(ARCH_DIR, '%s-%s' % (dest, APP_NAME)) # command('cp %s %s' % (src, dest)) # # pkg_name = new_name.replace('.tar.gz', '.archlinux.pkgbuild.zip') # arch_folder = os.path.join(RELEASE_DIR, 'ArchLinux') # os.makedirs(arch_folder) # pkg_name = os.path.join(arch_folder, pkg_name) # ziph = ZipFile(pkg_name, 'w', ZIP_DEFLATED) # for item in [new_name, 'PKGBUILD', 'README']: # path = os.path.join(PKGBUILD_DIR, item) # ziph.write(path, item) # ziph.close() # shutil.rmtree(PKGBUILD_DIR, True) clear_folders()
def build_msw_packages(): import wixpy distro_folder = os.path.join(RELEASE_DIR, 'MS_Windows') for arch in ['win32', 'win64']: echo_msg('=== Arch %s ===' % arch) portable_name = '%s-%s-%s-portable' % (APP_NAME, APP_VER, arch) if not RELEASE: portable_name = '%s-%s-%s-%s-portable' % \ (APP_NAME, APP_VER, TIMESTAMP, arch) portable_folder = os.path.join(PROJECT_DIR, portable_name) portable_libs = os.path.join(portable_folder, 'libs') if os.path.exists(portable_folder): shutil.rmtree(portable_folder, True) os.mkdir(portable_folder) if not is_path(distro_folder): os.makedirs(distro_folder) # Package building echo_msg('Creating portable package') portable = os.path.join(CACHE_DIR, arch, 'portable.zip') echo_msg('Extracting portable files from %s' % portable) ZipFile(portable, 'r').extractall(portable_folder) obsolete_folders = [ 'stdlib/test/', 'stdlib/lib2to3/tests/', 'stdlib/unittest/', 'stdlib/msilib/', 'stdlib/idlelib/', 'stdlib/ensurepip/', 'stdlib/distutils/' ] for folder in obsolete_folders: shutil.rmtree(os.path.join(portable_folder, folder), True) for item in PKGS: src = os.path.join(SRC_DIR, item) echo_msg('Copying tree %s' % src) shutil.copytree(src, os.path.join(portable_libs, item)) build.compile_sources(portable_folder) clear_files(portable_folder, ['py', 'so', 'pyo']) for item in EXTENSIONS: filename = os.path.basename(item) src = os.path.join(CACHE_DIR, arch, 'pyd', filename) dst = os.path.join(portable_libs, item) shutil.copy(src, dst) # MSI build echo_msg('Creating MSI package') clear_files(portable_folder, ['exe']) # Readme file readme = README_TEMPLATE % bbox.TIMESTAMP[:4] readme_path = os.path.join(portable_folder, 'readme.txt') with open(readme_path, 'wb') as fp: mark = '' if RELEASE else ' build %s' % bbox.TIMESTAMP fp.write('%s %s%s' % (APP_FULL_NAME, APP_VER, mark)) fp.write('\r\n\r\n') fp.write(readme.replace('\n', '\r\n')) # License file src = os.path.join(CACHE_DIR, 'common', 'agpl-3.0.rtf') dst = os.path.join(portable_folder, 'agpl-3.0.rtf') shutil.copy(src, dst) # Exe files nonportable = os.path.join(CACHE_DIR, arch, '%s.zip' % PROJECT) echo_msg('Extracting non-portable executables from %s' % nonportable) ZipFile(nonportable, 'r').extractall(portable_folder) msi_name = portable_name.replace('-portable', '') msi_data = {} msi_data.update(MSI_DATA) msi_data['_SourceDir'] = portable_folder if arch == 'win64': msi_data['Win64'] = 'yes' msi_data['_CheckX64'] = True msi_data['_OutputDir'] = distro_folder msi_data['_OutputName'] = msi_name + '_headless.msi' wixpy.build(msi_data) # Clearing shutil.rmtree(portable_folder, True) # Build clearing ##### shutil.rmtree(BUILD_DIR, True) for item in ['MANIFEST', 'src/script/uniconvertor', 'setup.cfg']: item = os.path.join(PROJECT_DIR, item) if os.path.lexists(item): os.remove(item)
def build_macos_dmg(): distro_folder = os.path.join(RELEASE_DIR, 'macOS') arch = 'macOS_10.9_Mavericks' echo_msg('=== Build for %s ===' % arch) pkg_name = '%s-%s-%s_and_newer' % (APP_NAME, APP_VER, arch) if not RELEASE: pkg_name = '%s-%s-%s-%s_and_newer' % \ (APP_NAME, APP_VER, TIMESTAMP, arch) pkg_folder = os.path.join(PROJECT_DIR, 'package') app_folder = os.path.join(pkg_folder, 'opt/uniconvertor') py_pkgs = os.path.join(pkg_folder, 'opt/uniconvertor/pkgs') if os.path.exists(pkg_folder): shutil.rmtree(pkg_folder, True) os.mkdir(pkg_folder) if not is_path(distro_folder): os.makedirs(distro_folder) # Package building echo_msg('Creating macOS package') pkg_common_dir = os.path.join(CACHE_DIR, 'common') pkg_cache_dir = os.path.join(CACHE_DIR, 'macos') pkg_cache = os.path.join(pkg_cache_dir, 'cache.zip') echo_msg('Extracting portable files from %s' % pkg_cache) ZipFile(pkg_cache, 'r').extractall(pkg_folder) for item in PKGS: src = os.path.join(SRC_DIR, item) echo_msg('Copying tree %s' % src) shutil.copytree(src, os.path.join(py_pkgs, item)) build.compile_sources(py_pkgs) clear_files(py_pkgs, ['py', 'pyo']) clear_files('%s/uc2' % py_pkgs, ['so']) for item in EXTENSIONS: item = item.replace('.pyd', '.so') filename = os.path.basename(item) src = os.path.join(CACHE_DIR, 'macos', 'so', filename) dst = os.path.join(py_pkgs, item) shutil.copy(src, dst) # Launcher src = os.path.join(CACHE_DIR, 'macos', 'uniconvertor') dst = os.path.join('%s/bin' % app_folder, 'uniconvertor') shutil.copy(src, dst) # Readme file readme = README_TEMPLATE % bbox.TIMESTAMP[:4] readme_path = os.path.join(app_folder, 'readme.txt') with open(readme_path, 'wb') as fp: mark = '' if RELEASE else ' build %s' % bbox.TIMESTAMP fp.write('%s %s%s' % (APP_FULL_NAME, APP_VER, mark)) fp.write('\n\n') fp.write(readme) # Uninstall.txt uninstall = os.path.join(app_folder, 'UNINSTALL.txt') with open(uninstall, 'wb') as fp: fp.write(MAC_UNINSTALL) # License file src = os.path.join(CACHE_DIR, 'common', 'agpl-3.0.rtf') dst = os.path.join(app_folder, 'agpl-3.0.rtf') shutil.copy(src, dst) # PKG and DMG build echo_msg('Creating DMG image') pkg.PkgBuilder({ 'src_dir': pkg_folder, # path to distribution folder 'build_dir': './build_dir', # path for build 'install_dir': '/', # where to install app 'identifier': 'org.sK1Project.UniConvertor', # domain.Publisher.AppName 'app_name': '%s %s' % (APP_FULL_NAME, APP_VER), # pretty app name 'app_ver': APP_VER, # app version 'pkg_name': '%s_%s.pkg' % (APP_FULL_NAME, APP_VER), # package name 'preinstall': os.path.join(pkg_cache_dir, 'preinstall'), 'postinstall': os.path.join(pkg_cache_dir, 'postinstall'), 'license': os.path.join(pkg_common_dir, 'agpl-3.0.rtf'), 'welcome': os.path.join(pkg_cache_dir, 'welcome.rtf'), 'background': os.path.join(pkg_cache_dir, 'background.png'), 'check_version': '10.9', 'dmg': { 'targets': ['./build_dir/%s_%s.pkg' % (APP_FULL_NAME, APP_VER), uninstall], 'dmg_filename': '%s.dmg' % pkg_name, 'volume_name': '%s %s' % (APP_FULL_NAME, APP_VER), 'dist_dir': distro_folder, }, 'remove_build': True, }) shutil.rmtree(pkg_folder, True)
def build_msw_packages(): echo_msg('Creating portable package') distro_folder = os.path.join(RELEASE_DIR, 'MS_Windows') out = ' 1> /dev/null 2> /dev/null' if not DEBUG_MODE else '' clear_folders() if os.path.isdir(DIST_DIR): shutil.rmtree(DIST_DIR, True) command('cd %s;python2 %s build %s' % (PROJECT_DIR, SCRIPT, out)) libdir = os.path.join(BUILD_DIR, 'lib.linux-x86_64-2.7') build.compile_sources(libdir) clear_files(libdir) clear_files(libdir, 'so') for arch in ['win32', 'win64']: portable_name = '%s-%s-%s-portable' % (APP_NAME, APP_VER, arch) if not RELEASE: portable_name = '%s-%s-%s-%s-portable' % \ (APP_NAME, APP_VER, TIMESTAMP, arch) portable_folder = os.path.join(PROJECT_DIR, portable_name) if os.path.exists(portable_folder): shutil.rmtree(portable_folder, True) os.mkdir(portable_folder) portable = os.path.join('/%s-devres' % arch, 'portable.zip') echo_msg('Extracting portable files from %s' % portable) ZipFile(portable, 'r').extractall(portable_folder) build.compile_sources(portable_folder) clear_files(portable_folder) portable_libs = os.path.join(portable_folder, 'libs') for item in PKGS: src = os.path.join(libdir, item) echo_msg('Copying tree %s' % src) shutil.copytree(src, os.path.join(portable_libs, item)) for item in EXTENSIONS: filename = os.path.basename(item) src = os.path.join('/%s-devres' % arch, 'pyd', filename) dst = os.path.join(portable_libs, item) shutil.copy(src, dst) if not is_path(distro_folder): os.makedirs(distro_folder) portable_zip = os.path.join(distro_folder, portable_name + '.zip') ziph = ZipFile(portable_zip, 'w', ZIP_DEFLATED) echo_msg('Compressing into %s' % portable_zip) for root, dirs, files in os.walk(portable_folder): for item in files: path = os.path.join(root, item) local_path = path.split(portable_name)[1][1:] ziph.write(path, os.path.join(portable_name, local_path)) ziph.close() shutil.rmtree(portable_folder, True) # Build clearing ##### shutil.rmtree(BUILD_DIR, True) for item in ['MANIFEST', 'MANIFEST.in', 'src/script/sk1', 'src/script/uniconvertor', 'setup.cfg']: item = os.path.join(PROJECT_DIR, item) if os.path.lexists(item): os.remove(item)