mirror of
https://github.com/uqbar-dao/nectar.git
synced 2024-12-22 08:01:47 +03:00
build: break out package building into its own script
This commit is contained in:
parent
b5c9f60794
commit
d8070e3303
146
scripts/build-package.py
Executable file
146
scripts/build-package.py
Executable file
@ -0,0 +1,146 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
import io
|
||||
import os
|
||||
from pathlib import Path
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import zipfile
|
||||
|
||||
def get_features(args):
|
||||
# Join the features into a comma-separated string
|
||||
features = ','.join(args.features)
|
||||
return features
|
||||
|
||||
def zip_directory(directory_path):
|
||||
buffer = io.BytesIO()
|
||||
with zipfile.ZipFile(buffer, 'w', zipfile.ZIP_DEFLATED) as zip_file:
|
||||
for root, dirs, files in os.walk(directory_path):
|
||||
# Adding directories explicitly to ensure they are included in the zip
|
||||
for dir in dirs:
|
||||
dir_path = os.path.join(root, dir)
|
||||
arcname = os.path.relpath(dir_path, start=directory_path)
|
||||
# Create a ZipInfo object for the directory
|
||||
zi = zipfile.ZipInfo(arcname + '/')
|
||||
permissions = 0o755
|
||||
zi.external_attr = permissions << 16 | 0x10 # MS-DOS directory flag
|
||||
zi.date_time = (2023, 6, 19, 0, 0, 0)
|
||||
zip_file.writestr(zi, '')
|
||||
for file in files:
|
||||
file_path = os.path.join(root, file)
|
||||
arcname = os.path.relpath(file_path, start=directory_path)
|
||||
# Get file info
|
||||
st = os.stat(file_path)
|
||||
# Create ZipInfo object
|
||||
zi = zipfile.ZipInfo(arcname)
|
||||
# Set permissions
|
||||
permissions = st.st_mode
|
||||
zi.external_attr = permissions << 16
|
||||
# Set date_time
|
||||
zi.date_time = (2023, 6, 19, 0, 0, 0)
|
||||
# Read file data
|
||||
with open(file_path, 'rb') as f:
|
||||
file_data = f.read()
|
||||
zip_file.writestr(zi, file_data)
|
||||
zip_contents = buffer.getvalue()
|
||||
return zip_contents
|
||||
|
||||
def build_and_zip_package(entry_path, parent_pkg_path, features):
|
||||
# Build the package
|
||||
build_cmd = ['kit', 'build', entry_path, '--no-ui', '--skip-deps-check']
|
||||
if features:
|
||||
build_cmd += ['--features', features]
|
||||
result = subprocess.run(build_cmd, cwd=entry_path)
|
||||
if result.returncode != 0:
|
||||
raise Exception(f'Failed to build package at {entry_path}')
|
||||
|
||||
# Now zip up the parent_pkg_path directory
|
||||
zip_filename = f'{os.path.basename(entry_path)}.zip'
|
||||
zip_contents = zip_directory(parent_pkg_path)
|
||||
|
||||
return (str(entry_path), zip_filename, zip_contents)
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='Build and zip Rust packages.')
|
||||
parser.add_argument('--features', nargs='*', default=[], help='List of features to compile packages with')
|
||||
parser.add_argument('--skip-build-frontend', action='store_true', help='Skip building the frontend')
|
||||
args = parser.parse_args()
|
||||
|
||||
script_path = Path(os.path.abspath(__file__))
|
||||
top_level_dir = script_path.parent.parent
|
||||
kinode_dir = top_level_dir / 'kinode'
|
||||
packages_dir = kinode_dir / 'packages'
|
||||
|
||||
if args.skip_build_frontend:
|
||||
print("skipping frontend builds")
|
||||
else:
|
||||
# Build core frontends
|
||||
core_frontends = [
|
||||
'src/register-ui',
|
||||
'packages/app_store/ui',
|
||||
'packages/homepage/ui',
|
||||
# chess when brought in
|
||||
]
|
||||
|
||||
# For each frontend, execute build.sh
|
||||
for frontend in core_frontends:
|
||||
frontend_path = kinode_dir / frontend
|
||||
build_script = frontend_path / 'build.sh'
|
||||
if not build_script.exists():
|
||||
print(f'Build script not found for frontend: {frontend} at {build_script}')
|
||||
continue
|
||||
result = subprocess.run(['sh', './build.sh'], cwd=frontend_path)
|
||||
if result.returncode != 0:
|
||||
raise Exception(f'Failed to build frontend: {frontend}')
|
||||
|
||||
features = get_features(args)
|
||||
|
||||
results = []
|
||||
for entry in os.scandir(packages_dir):
|
||||
if not entry.is_dir():
|
||||
continue
|
||||
entry_path = Path(entry.path)
|
||||
child_pkg_path = entry_path / 'pkg'
|
||||
if not child_pkg_path.exists():
|
||||
continue
|
||||
result = build_and_zip_package(str(entry_path), str(child_pkg_path), features)
|
||||
results.append(result)
|
||||
|
||||
# Process results
|
||||
bootstrapped_processes = []
|
||||
bootstrapped_processes.append('pub static BOOTSTRAPPED_PROCESSES: &[(&str, &[u8], &[u8])] = &[')
|
||||
|
||||
target_dir = top_level_dir / 'target'
|
||||
target_packages_dir = target_dir / 'packages'
|
||||
if not target_packages_dir.exists():
|
||||
os.makedirs(target_packages_dir)
|
||||
|
||||
for (entry_path, zip_filename, zip_contents) in results:
|
||||
# Save zip_contents to zip_path
|
||||
zip_path = target_packages_dir / zip_filename
|
||||
with open(zip_path, 'wb') as f:
|
||||
f.write(zip_contents)
|
||||
|
||||
metadata_path = os.path.join(entry_path, 'metadata.json')
|
||||
|
||||
# Update bootstrapped_processes
|
||||
bootstrapped_processes.append(
|
||||
f' ("{zip_filename}", include_bytes!("{metadata_path}"), include_bytes!("{zip_path}")),'
|
||||
)
|
||||
|
||||
bootstrapped_processes.append('];')
|
||||
|
||||
bootstrapped_processes_path = target_packages_dir / 'bootstrapped_processes.rs'
|
||||
with open(bootstrapped_processes_path, 'w') as f:
|
||||
f.write('\n'.join(bootstrapped_processes))
|
||||
|
||||
zip_contents = zip_directory(target_packages_dir)
|
||||
zip_path = target_dir / 'packages.zip'
|
||||
|
||||
with open(zip_path, 'wb') as f:
|
||||
f.write(zip_contents)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Reference in New Issue
Block a user