| @@ -0,0 +1,50 @@ | |||
| import sys | |||
| import json | |||
| import os | |||
| import glob | |||
| import zipfile | |||
| import shutil | |||
| import build | |||
| PACKAGES_DIR = "../packages" | |||
| MANIFESTS_DIR = "manifests" | |||
| plugin_packages = sys.argv[1:] | |||
| slugs = set() | |||
| for package_src in plugin_packages: | |||
| # Open ZIP | |||
| z = zipfile.ZipFile(package_src) | |||
| manifest_src = [f for f in z.namelist() if f.endswith("/plugin.json")][0] | |||
| # Read manifest | |||
| with z.open(manifest_src) as f: | |||
| manifest = json.load(f) | |||
| # Review manifest | |||
| print(json.dumps(manifest, indent=" ")) | |||
| input() | |||
| # Write manifest | |||
| slug = os.path.split(manifest_src)[0] | |||
| manifest_dest = os.path.join(MANIFESTS_DIR, slug + ".json") | |||
| with open(manifest_dest, "w") as f: | |||
| json.dump(manifest, f, indent=" ") | |||
| # Move package | |||
| package_dest = os.path.join(PACKAGES_DIR, os.path.basename(package_src)) | |||
| shutil.move(package_src, package_dest) | |||
| build.system(f"touch '{package_dest}'") | |||
| slugs.add(slug) | |||
| # Upload packages | |||
| build.system(f"cd {PACKAGES_DIR} && make upload") | |||
| # Commit repository | |||
| build.system("git add manifests") | |||
| slugs_list = ", ".join(slugs) | |||
| build.system(f"git commit -m 'Update manifest for {slugs_list}'") | |||
| build.system("git push") | |||
| @@ -27,43 +27,52 @@ def delete_stage(): | |||
| def build_mac(plugin_dir): | |||
| print(f"Building {plugin_dir} for mac") | |||
| env = f'CC=x86_64-apple-darwin15-clang CXX=x86_64-apple-darwin15-clang++-libc++ STRIP=x86_64-apple-darwin15-strip RACK_DIR={RACK_SDK}' | |||
| make = f'{env} make -j$(nproc) -C {plugin_dir}' | |||
| system(f'{make} clean') | |||
| system(f'{make} cleandep') | |||
| system(f'{make} dep') | |||
| system(f'{make} dist') | |||
| stage_package(plugin_dir) | |||
| system(f'{make} clean') | |||
| print(f"Built {plugin_dir} for mac") | |||
| def build_win(plugin_dir): | |||
| print(f"Building {plugin_dir} for win") | |||
| env = f'CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ STRIP=x86_64-w64-mingw32-strip RACK_DIR={RACK_SDK}' | |||
| make = f'{env} make -j$(nproc) -C {plugin_dir}' | |||
| system(f'{make} clean') | |||
| system(f'{make} cleandep') | |||
| system(f'{make} dep') | |||
| system(f'{make} dist') | |||
| stage_package(plugin_dir) | |||
| system(f'{make} clean') | |||
| print(f"Built {plugin_dir} for win") | |||
| def build_lin(plugin_dir): | |||
| print(f"Building {plugin_dir} for lin") | |||
| make = f'make -j$(nproc)' | |||
| plugin_abs = os.path.abspath(plugin_dir) | |||
| # TODO Make this Docker image publicly available | |||
| # It's essentially just Ubuntu 16.04 with plugin build dependencies installed, the workdir, and a user account set up so it matches my own machine's UID to solve file permissions issues. | |||
| docker = f'docker run --rm -v {RACK_SDK}:/Rack-SDK -v {plugin_abs}:/workdir -w /workdir -u vortico -e RACK_DIR=/Rack-SDK rackplugin:1' | |||
| system(f'{docker} {make} clean') | |||
| system(f'{docker} {make} cleandep') | |||
| system(f'{docker} {make} dep') | |||
| system(f'{docker} {make} dist') | |||
| stage_package(plugin_dir) | |||
| system(f'{docker} {make} clean') | |||
| print(f"Built {plugin_dir} for lin") | |||
| def build(plugin_dir): | |||
| try: | |||
| build_lin(plugin_dir) | |||
| build_win(plugin_dir) | |||
| build_mac(plugin_dir) | |||
| build_win(plugin_dir) | |||
| move_stage() | |||
| finally: | |||
| delete_stage() | |||
| @@ -1,69 +0,0 @@ | |||
| import os | |||
| import sys | |||
| RACK_SDK = os.path.abspath("Rack-SDK") | |||
| def system(cmd): | |||
| if os.system(cmd): | |||
| raise Exception(f"Failed command: {cmd}") | |||
| def stage_package(plugin_dir): | |||
| system('mkdir -p stage') | |||
| system(f'mv {plugin_dir}/dist/*.zip stage/') | |||
| def delete_stage(): | |||
| system(f'rm -rf stage') | |||
| def build_mac(plugin_dir): | |||
| env = f'CC=x86_64-apple-darwin15-clang CXX=x86_64-apple-darwin15-clang++-libc++ STRIP=x86_64-apple-darwin15-strip RACK_DIR={RACK_SDK}' | |||
| make = f'{env} make -j$(nproc) -C {plugin_dir}' | |||
| system(f'{make} clean') | |||
| system(f'{make} dist') | |||
| stage_package(plugin_dir) | |||
| system(f'{make} clean') | |||
| def build_win(plugin_dir): | |||
| env = f'CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ STRIP=x86_64-w64-mingw32-strip RACK_DIR={RACK_SDK}' | |||
| make = f'{env} make -j$(nproc) -C {plugin_dir}' | |||
| system(f'{make} clean') | |||
| system(f'{make} dist') | |||
| stage_package(plugin_dir) | |||
| system(f'{make} clean') | |||
| def build_lin(plugin_dir): | |||
| env = f'-e RACK_DIR=/Rack-SDK' | |||
| make = f'make -j$(nproc)' | |||
| plugin_abs = os.path.abspath(plugin_dir) | |||
| # TODO Make this Docker image publicly available | |||
| # It's essentially just Ubuntu 16.04 with plugin build dependencies installed, the workdir, and a user account set up so it matches my own machine's UID to solve file permissions issues. | |||
| docker = f'docker run --rm -v {RACK_SDK}:/Rack-SDK -v {plugin_abs}:/workdir -w /workdir -u vortico {env} a0b9c87ec456' | |||
| system(f'{docker} {make} clean') | |||
| system(f'{docker} {make} dist') | |||
| stage_package(plugin_dir) | |||
| system(f'{docker} {make} clean') | |||
| def build(plugin_dir): | |||
| try: | |||
| build_lin(plugin_dir) | |||
| build_win(plugin_dir) | |||
| build_mac(plugin_dir) | |||
| except Exception as e: | |||
| delete_stage() | |||
| print(e) | |||
| return False | |||
| return True | |||
| if __name__ == "__main__": | |||
| plugin_dir = sys.argv[1] | |||
| if not plugin_dir: | |||
| raise "No plugin_dir given" | |||
| build(plugin_dir) | |||
| @@ -1,70 +0,0 @@ | |||
| import sys | |||
| import os | |||
| import glob | |||
| import json | |||
| import time | |||
| import build_plugin | |||
| build_plugin.system("git pull") | |||
| build_plugin.system("git submodule update --init --recursive") | |||
| plugin_dirs = sys.argv[1:] | |||
| if not plugin_dirs: | |||
| plugin_dirs = glob.glob("repos/*") | |||
| built_slugs = [] | |||
| for plugin_dir in plugin_dirs: | |||
| slug = os.path.basename(plugin_dir) | |||
| manifest_filename = f"manifests/{slug}.json" | |||
| with open(manifest_filename, "r") as f: | |||
| manifest = json.load(f) | |||
| # We need a repoVersion to build | |||
| if 'repoVersion' not in manifest: | |||
| continue | |||
| # Skip if update is not needed | |||
| if 'latestVersion' in manifest and manifest['latestVersion'] == manifest['repoVersion']: | |||
| continue | |||
| # Build repo | |||
| success = build_plugin.build(plugin_dir) | |||
| if not success: | |||
| print(f"{slug} failed") | |||
| input() | |||
| continue | |||
| build_plugin.system('mv -vi stage/* ../packages/') | |||
| build_plugin.delete_stage() | |||
| # Update build information | |||
| manifest['latestVersion'] = manifest['repoVersion'] | |||
| manifest['buildTimestamp'] = round(time.time()) | |||
| manifest['status'] = "available" | |||
| with open(manifest_filename, "w") as f: | |||
| json.dump(manifest, f, indent=" ") | |||
| built_slugs.append(slug) | |||
| os.system("qutebrowser \"https://github.com/VCVRack/library/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+" + slug + "\" &") | |||
| if not built_slugs: | |||
| raise Exception("Nothing to build") | |||
| # Upload packages | |||
| build_plugin.system("cd ../packages && make upload") | |||
| # Commit repository | |||
| build_plugin.system("git add -u") | |||
| build_plugin.system("git commit -m 'Update builds'") | |||
| build_plugin.system("git push") | |||
| print() | |||
| print("Built " + ", ".join(built_slugs)) | |||
| @@ -67,7 +67,8 @@ build.system("cd ../packages && make upload") | |||
| # Commit repository | |||
| build.system("git add manifests") | |||
| build.system("git commit -m 'Update builds'") | |||
| built_slugs_list = ", ".join(built_slugs) | |||
| build.system(f"git commit -m 'Update build for {built_slugs_list}'") | |||
| build.system("git push") | |||