#!/usr/bin/env python3
import importlib
import os
import shutil
import sys
import zipapp
from argparse import ArgumentParser
from openpilot . common . basedir import BASEDIR
ENTRYPOINT = ' main '
INTERPRETER = ' /usr/bin/env python3 '
def copy_directory ( src_dir , dst_dir ) :
"""
Copy all files from source directory to destination directory , following symlinks .
Args :
src_dir ( str ) : Path to source directory
dst_dir ( str ) : Path to destination directory
"""
# Ensure source directory exists
if not os . path . exists ( src_dir ) :
raise FileNotFoundError ( f " Source directory ' { src_dir } ' does not exist " )
# Create destination directory if it doesn't exist
os . makedirs ( dst_dir , exist_ok = True )
# Walk through source directory
for root , _ , files in os . walk ( src_dir , followlinks = True ) :
# Calculate relative path from source directory
rel_path = os . path . relpath ( root , src_dir )
# Create corresponding directory in destination
dst_root = os . path . join ( dst_dir , rel_path )
os . makedirs ( dst_root , exist_ok = True )
# Copy each file
for file in files :
src_file = os . path . join ( root , file )
dst_file = os . path . join ( dst_root , file )
# Copy file, preserving metadata and following symlinks
shutil . copy2 ( src_file , dst_file , follow_symlinks = True )
if __name__ == ' __main__ ' :
parser = ArgumentParser ( prog = ' pack-raylib.py ' , description = ' Package a raylib UI into a portable executable. ' , epilog = ' comma.ai ' )
parser . add_argument ( ' module ' )
parser . add_argument ( ' -o ' , ' --output ' , help = ' output file ' )
args = parser . parse_args ( )
try :
mod = importlib . import_module ( args . module )
except ModuleNotFoundError :
print ( f ' { args . module } not found, typo? ' )
sys . exit ( 1 )
if not hasattr ( mod , ENTRYPOINT ) :
print ( f ' { args . module } does not have a { ENTRYPOINT } () function ' )
sys . exit ( 1 )
import tempfile
with tempfile . TemporaryDirectory ( ) as tmp :
copy_directory ( BASEDIR + ' /openpilot ' , tmp )
entry = f ' { args . module } : { ENTRYPOINT } '
zipapp . create_archive ( tmp , target = args . output , interpreter = INTERPRETER , main = entry )