1*10465441SEvalZero# 2*10465441SEvalZero# File : mkdir.py 3*10465441SEvalZero# This file is part of RT-Thread RTOS 4*10465441SEvalZero# COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team 5*10465441SEvalZero# 6*10465441SEvalZero# This program is free software; you can redistribute it and/or modify 7*10465441SEvalZero# it under the terms of the GNU General Public License as published by 8*10465441SEvalZero# the Free Software Foundation; either version 2 of the License, or 9*10465441SEvalZero# (at your option) any later version. 10*10465441SEvalZero# 11*10465441SEvalZero# This program is distributed in the hope that it will be useful, 12*10465441SEvalZero# but WITHOUT ANY WARRANTY; without even the implied warranty of 13*10465441SEvalZero# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*10465441SEvalZero# GNU General Public License for more details. 15*10465441SEvalZero# 16*10465441SEvalZero# You should have received a copy of the GNU General Public License along 17*10465441SEvalZero# with this program; if not, write to the Free Software Foundation, Inc., 18*10465441SEvalZero# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19*10465441SEvalZero# 20*10465441SEvalZero# Change Logs: 21*10465441SEvalZero# Date Author Notes 22*10465441SEvalZero# 2017-10-04 Bernard The first version 23*10465441SEvalZero 24*10465441SEvalZeroimport os 25*10465441SEvalZeroimport shutil 26*10465441SEvalZero 27*10465441SEvalZerofrom shutil import ignore_patterns 28*10465441SEvalZero 29*10465441SEvalZerodef do_copy_file(src, dst): 30*10465441SEvalZero # check source file 31*10465441SEvalZero if not os.path.exists(src): 32*10465441SEvalZero return 33*10465441SEvalZero 34*10465441SEvalZero path = os.path.dirname(dst) 35*10465441SEvalZero # mkdir if path not exist 36*10465441SEvalZero if not os.path.exists(path): 37*10465441SEvalZero os.makedirs(path) 38*10465441SEvalZero 39*10465441SEvalZero shutil.copy2(src, dst) 40*10465441SEvalZero 41*10465441SEvalZerodef do_copy_folder(src_dir, dst_dir, ignore=None): 42*10465441SEvalZero import shutil 43*10465441SEvalZero # check source directory 44*10465441SEvalZero if not os.path.exists(src_dir): 45*10465441SEvalZero return 46*10465441SEvalZero 47*10465441SEvalZero try: 48*10465441SEvalZero if os.path.exists(dst_dir): 49*10465441SEvalZero shutil.rmtree(dst_dir) 50*10465441SEvalZero except: 51*10465441SEvalZero print('Deletes folder: %s failed.' % dst_dir) 52*10465441SEvalZero return 53*10465441SEvalZero 54*10465441SEvalZero shutil.copytree(src_dir, dst_dir, ignore = ignore) 55*10465441SEvalZero 56*10465441SEvalZerosource_ext = ['c', 'h', 's', 'S', 'cpp', 'xpm'] 57*10465441SEvalZerosource_list = [] 58*10465441SEvalZero 59*10465441SEvalZerodef walk_children(child): 60*10465441SEvalZero global source_list 61*10465441SEvalZero global source_ext 62*10465441SEvalZero 63*10465441SEvalZero # print child 64*10465441SEvalZero full_path = child.rfile().abspath 65*10465441SEvalZero file_type = full_path.rsplit('.',1)[1] 66*10465441SEvalZero #print file_type 67*10465441SEvalZero if file_type in source_ext: 68*10465441SEvalZero if full_path not in source_list: 69*10465441SEvalZero source_list.append(full_path) 70*10465441SEvalZero 71*10465441SEvalZero children = child.all_children() 72*10465441SEvalZero if children != []: 73*10465441SEvalZero for item in children: 74*10465441SEvalZero walk_children(item) 75*10465441SEvalZero 76*10465441SEvalZerodef walk_kconfig(RTT_ROOT, source_list): 77*10465441SEvalZero for parent, dirnames, filenames in os.walk(RTT_ROOT): 78*10465441SEvalZero if 'bsp' in parent: 79*10465441SEvalZero continue 80*10465441SEvalZero if '.git' in parent: 81*10465441SEvalZero continue 82*10465441SEvalZero if 'tools' in parent: 83*10465441SEvalZero continue 84*10465441SEvalZero 85*10465441SEvalZero if 'Kconfig' in filenames: 86*10465441SEvalZero pathfile = os.path.join(parent, 'Kconfig') 87*10465441SEvalZero source_list.append(pathfile) 88*10465441SEvalZero if 'KConfig' in filenames: 89*10465441SEvalZero pathfile = os.path.join(parent, 'KConfig') 90*10465441SEvalZero source_list.append(pathfile) 91*10465441SEvalZero 92*10465441SEvalZerodef bsp_copy_files(bsp_root, dist_dir): 93*10465441SEvalZero # copy BSP files 94*10465441SEvalZero do_copy_folder(os.path.join(bsp_root), dist_dir, 95*10465441SEvalZero ignore_patterns('build', 'dist', '*.pyc', '*.old', '*.map', 'rtthread.bin', '.sconsign.dblite', '*.elf', '*.axf', 'cconfig.h')) 96*10465441SEvalZero 97*10465441SEvalZerodef bsp_update_sconstruct(dist_dir): 98*10465441SEvalZero with open(os.path.join(dist_dir, 'SConstruct'), 'r') as f: 99*10465441SEvalZero data = f.readlines() 100*10465441SEvalZero with open(os.path.join(dist_dir, 'SConstruct'), 'w') as f: 101*10465441SEvalZero for line in data: 102*10465441SEvalZero if line.find('RTT_ROOT') != -1: 103*10465441SEvalZero if line.find('sys.path') != -1: 104*10465441SEvalZero f.write('# set RTT_ROOT\n') 105*10465441SEvalZero f.write('if not os.getenv("RTT_ROOT"): \n RTT_ROOT="rt-thread"\n\n') 106*10465441SEvalZero f.write(line) 107*10465441SEvalZero 108*10465441SEvalZerodef bsp_update_kconfig(dist_dir): 109*10465441SEvalZero # change RTT_ROOT in Kconfig 110*10465441SEvalZero if not os.path.isfile(os.path.join(dist_dir, 'Kconfig')): 111*10465441SEvalZero return 112*10465441SEvalZero 113*10465441SEvalZero with open(os.path.join(dist_dir, 'Kconfig'), 'r') as f: 114*10465441SEvalZero data = f.readlines() 115*10465441SEvalZero with open(os.path.join(dist_dir, 'Kconfig'), 'w') as f: 116*10465441SEvalZero found = 0 117*10465441SEvalZero for line in data: 118*10465441SEvalZero if line.find('RTT_ROOT') != -1: 119*10465441SEvalZero found = 1 120*10465441SEvalZero if line.find('default') != -1 and found: 121*10465441SEvalZero position = line.find('default') 122*10465441SEvalZero line = line[0:position] + 'default "rt-thread"\n' 123*10465441SEvalZero found = 0 124*10465441SEvalZero f.write(line) 125*10465441SEvalZero 126*10465441SEvalZerodef bsp_update_kconfig_library(dist_dir): 127*10465441SEvalZero # change RTT_ROOT in Kconfig 128*10465441SEvalZero if not os.path.isfile(os.path.join(dist_dir, 'Kconfig')): 129*10465441SEvalZero return 130*10465441SEvalZero 131*10465441SEvalZero with open(os.path.join(dist_dir, 'Kconfig'), 'r') as f: 132*10465441SEvalZero data = f.readlines() 133*10465441SEvalZero with open(os.path.join(dist_dir, 'Kconfig'), 'w') as f: 134*10465441SEvalZero found = 0 135*10465441SEvalZero for line in data: 136*10465441SEvalZero if line.find('RTT_ROOT') != -1: 137*10465441SEvalZero found = 1 138*10465441SEvalZero if line.find('../libraries') != -1 and found: 139*10465441SEvalZero position = line.find('../libraries') 140*10465441SEvalZero line = line[0:position] + 'libraries/Kconfig"\n' 141*10465441SEvalZero found = 0 142*10465441SEvalZero f.write(line) 143*10465441SEvalZero 144*10465441SEvalZerodef bs_update_ide_project(bsp_root, rtt_root): 145*10465441SEvalZero import subprocess 146*10465441SEvalZero # default update the projects which have template file 147*10465441SEvalZero tgt_dict = {'mdk4':('keil', 'armcc'), 148*10465441SEvalZero 'mdk5':('keil', 'armcc'), 149*10465441SEvalZero 'iar':('iar', 'iar'), 150*10465441SEvalZero 'vs':('msvc', 'cl'), 151*10465441SEvalZero 'vs2012':('msvc', 'cl'), 152*10465441SEvalZero 'cdk':('gcc', 'gcc')} 153*10465441SEvalZero 154*10465441SEvalZero scons_env = os.environ.copy() 155*10465441SEvalZero scons_env['RTT_ROOT'] = rtt_root 156*10465441SEvalZero 157*10465441SEvalZero for item in tgt_dict: 158*10465441SEvalZero child = subprocess.Popen('scons --target=' + item, cwd=bsp_root, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 159*10465441SEvalZero stdout, stderr = child.communicate() 160*10465441SEvalZero if child.returncode == 0: 161*10465441SEvalZero print('update %s project' % item) 162*10465441SEvalZero 163*10465441SEvalZerodef zip_dist(dist_dir, dist_name): 164*10465441SEvalZero import zipfile 165*10465441SEvalZero 166*10465441SEvalZero zip_filename = os.path.join(dist_dir) 167*10465441SEvalZero zip = zipfile.ZipFile(zip_filename + '.zip', 'w') 168*10465441SEvalZero pre_len = len(os.path.dirname(dist_dir)) 169*10465441SEvalZero 170*10465441SEvalZero for parent, dirnames, filenames in os.walk(dist_dir): 171*10465441SEvalZero for filename in filenames: 172*10465441SEvalZero pathfile = os.path.join(parent, filename) 173*10465441SEvalZero arcname = pathfile[pre_len:].strip(os.path.sep) 174*10465441SEvalZero zip.write(pathfile, arcname) 175*10465441SEvalZero 176*10465441SEvalZero zip.close() 177*10465441SEvalZero 178*10465441SEvalZerodef MkDist_Strip(program, BSP_ROOT, RTT_ROOT, Env): 179*10465441SEvalZero global source_list 180*10465441SEvalZero 181*10465441SEvalZero print('make distribution and strip useless files....') 182*10465441SEvalZero 183*10465441SEvalZero dist_name = os.path.basename(BSP_ROOT) 184*10465441SEvalZero dist_dir = os.path.join(BSP_ROOT, 'dist-strip', dist_name) 185*10465441SEvalZero target_path = os.path.join(dist_dir, 'rt-thread') 186*10465441SEvalZero 187*10465441SEvalZero print('=> %s' % os.path.basename(BSP_ROOT)) 188*10465441SEvalZero bsp_copy_files(BSP_ROOT, dist_dir) 189*10465441SEvalZero 190*10465441SEvalZero # copy stm32 bsp libiary files 191*10465441SEvalZero if os.path.basename(os.path.dirname(BSP_ROOT)) == 'stm32': 192*10465441SEvalZero print("=> copy stm32 bsp library") 193*10465441SEvalZero library_path = os.path.join(os.path.dirname(BSP_ROOT), 'libraries') 194*10465441SEvalZero library_dir = os.path.join(dist_dir, 'libraries') 195*10465441SEvalZero bsp_copy_files(os.path.join(library_path, 'HAL_Drivers'), os.path.join(library_dir, 'HAL_Drivers')) 196*10465441SEvalZero bsp_copy_files(os.path.join(library_path, Env['bsp_lib_type']), os.path.join(library_dir, Env['bsp_lib_type'])) 197*10465441SEvalZero shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) 198*10465441SEvalZero 199*10465441SEvalZero # do bsp special dist handle 200*10465441SEvalZero if 'dist_handle' in Env: 201*10465441SEvalZero print("=> start dist handle") 202*10465441SEvalZero dist_handle = Env['dist_handle'] 203*10465441SEvalZero dist_handle(BSP_ROOT) 204*10465441SEvalZero 205*10465441SEvalZero # get all source files from program 206*10465441SEvalZero for item in program: 207*10465441SEvalZero walk_children(item) 208*10465441SEvalZero source_list.sort() 209*10465441SEvalZero 210*10465441SEvalZero # copy the source files without libcpu and components/libc in RT-Thread 211*10465441SEvalZero target_list = [] 212*10465441SEvalZero libcpu_dir = os.path.join(RTT_ROOT, 'libcpu').lower() 213*10465441SEvalZero libc_dir = os.path.join(RTT_ROOT, 'components', 'libc', 'compilers').lower() 214*10465441SEvalZero sal_dir = os.path.join(RTT_ROOT, 'components', 'net', 'sal_socket').lower() 215*10465441SEvalZero sources_include_sal = False 216*10465441SEvalZero for src in source_list: 217*10465441SEvalZero if src.lower().startswith(BSP_ROOT.lower()): 218*10465441SEvalZero continue 219*10465441SEvalZero 220*10465441SEvalZero # skip libc and libcpu dir 221*10465441SEvalZero if src.lower().startswith(libcpu_dir): 222*10465441SEvalZero continue 223*10465441SEvalZero if src.lower().startswith(libc_dir): 224*10465441SEvalZero continue 225*10465441SEvalZero if src.lower().startswith(sal_dir): 226*10465441SEvalZero sources_include_sal = True 227*10465441SEvalZero continue 228*10465441SEvalZero 229*10465441SEvalZero if src.lower().startswith(RTT_ROOT.lower()): 230*10465441SEvalZero target_list.append(src) 231*10465441SEvalZero source_list = target_list 232*10465441SEvalZero 233*10465441SEvalZero # get source directory 234*10465441SEvalZero src_dir = [] 235*10465441SEvalZero for src in source_list: 236*10465441SEvalZero src = src.replace(RTT_ROOT, '') 237*10465441SEvalZero if src[0] == os.sep or src[0] == '/': 238*10465441SEvalZero src = src[1:] 239*10465441SEvalZero 240*10465441SEvalZero path = os.path.dirname(src) 241*10465441SEvalZero sub_path = path.split(os.sep) 242*10465441SEvalZero full_path = RTT_ROOT 243*10465441SEvalZero for item in sub_path: 244*10465441SEvalZero full_path = os.path.join(full_path, item) 245*10465441SEvalZero if full_path not in src_dir: 246*10465441SEvalZero src_dir.append(full_path) 247*10465441SEvalZero 248*10465441SEvalZero # add all of SConscript files 249*10465441SEvalZero for item in src_dir: 250*10465441SEvalZero source_list.append(os.path.join(item, 'SConscript')) 251*10465441SEvalZero 252*10465441SEvalZero # add all of Kconfig files 253*10465441SEvalZero walk_kconfig(RTT_ROOT, source_list) 254*10465441SEvalZero 255*10465441SEvalZero # copy all files to target directory 256*10465441SEvalZero source_list.sort() 257*10465441SEvalZero for src in source_list: 258*10465441SEvalZero dst = src.replace(RTT_ROOT, '') 259*10465441SEvalZero if dst[0] == os.sep or dst[0] == '/': 260*10465441SEvalZero dst = dst[1:] 261*10465441SEvalZero 262*10465441SEvalZero print('=> %s' % dst) 263*10465441SEvalZero dst = os.path.join(target_path, dst) 264*10465441SEvalZero do_copy_file(src, dst) 265*10465441SEvalZero 266*10465441SEvalZero # copy tools directory 267*10465441SEvalZero print('=> tools') 268*10465441SEvalZero do_copy_folder(os.path.join(RTT_ROOT, 'tools'), os.path.join(target_path, 'tools'), ignore_patterns('*.pyc')) 269*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'Kconfig'), os.path.join(target_path, 'Kconfig')) 270*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'AUTHORS'), os.path.join(target_path, 'AUTHORS')) 271*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'COPYING'), os.path.join(target_path, 'COPYING')) 272*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'README.md'), os.path.join(target_path, 'README.md')) 273*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'README_zh.md'), os.path.join(target_path, 'README_zh.md')) 274*10465441SEvalZero 275*10465441SEvalZero print('=> %s' % os.path.join('components', 'libc', 'compilers')) 276*10465441SEvalZero do_copy_folder(os.path.join(RTT_ROOT, 'components', 'libc', 'compilers'), os.path.join(target_path, 'components', 'libc', 'compilers')) 277*10465441SEvalZero 278*10465441SEvalZero if sources_include_sal: 279*10465441SEvalZero print('=> %s' % os.path.join('components', 'net', 'sal_socket')) 280*10465441SEvalZero do_copy_folder(os.path.join(RTT_ROOT, 'components', 'net', 'sal_socket'), os.path.join(target_path, 'components', 'net', 'sal_socket')) 281*10465441SEvalZero 282*10465441SEvalZero # copy all libcpu/ARCH directory 283*10465441SEvalZero import rtconfig 284*10465441SEvalZero print('=> %s' % (os.path.join('libcpu', rtconfig.ARCH, rtconfig.CPU))) 285*10465441SEvalZero do_copy_folder(os.path.join(RTT_ROOT, 'libcpu', rtconfig.ARCH, rtconfig.CPU), os.path.join(target_path, 'libcpu', rtconfig.ARCH, rtconfig.CPU)) 286*10465441SEvalZero if os.path.exists(os.path.join(RTT_ROOT, 'libcpu', rtconfig.ARCH, 'common')): 287*10465441SEvalZero print('=> %s' % (os.path.join('libcpu', rtconfig.ARCH, 'common'))) 288*10465441SEvalZero do_copy_folder(os.path.join(RTT_ROOT, 'libcpu', rtconfig.ARCH, 'common'), os.path.join(target_path, 'libcpu', rtconfig.ARCH, 'common')) 289*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'libcpu', 'Kconfig'), os.path.join(target_path, 'libcpu', 'Kconfig')) 290*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'libcpu', 'SConscript'), os.path.join(target_path, 'libcpu', 'SConscript')) 291*10465441SEvalZero 292*10465441SEvalZero # change RTT_ROOT in SConstruct 293*10465441SEvalZero bsp_update_sconstruct(dist_dir) 294*10465441SEvalZero # change RTT_ROOT in Kconfig 295*10465441SEvalZero bsp_update_kconfig(dist_dir) 296*10465441SEvalZero bsp_update_kconfig_library(dist_dir) 297*10465441SEvalZero # update all project files 298*10465441SEvalZero bs_update_ide_project(dist_dir, target_path) 299*10465441SEvalZero 300*10465441SEvalZero # make zip package 301*10465441SEvalZero zip_dist(dist_dir, dist_name) 302*10465441SEvalZero 303*10465441SEvalZero print('done!') 304*10465441SEvalZero 305*10465441SEvalZerodef MkDist(program, BSP_ROOT, RTT_ROOT, Env): 306*10465441SEvalZero print('make distribution....') 307*10465441SEvalZero 308*10465441SEvalZero dist_name = os.path.basename(BSP_ROOT) 309*10465441SEvalZero dist_dir = os.path.join(BSP_ROOT, 'dist', dist_name) 310*10465441SEvalZero 311*10465441SEvalZero target_path = os.path.join(dist_dir, 'rt-thread') 312*10465441SEvalZero 313*10465441SEvalZero # copy BSP files 314*10465441SEvalZero print('=> %s' % os.path.basename(BSP_ROOT)) 315*10465441SEvalZero bsp_copy_files(BSP_ROOT, dist_dir) 316*10465441SEvalZero 317*10465441SEvalZero # copy stm32 bsp libiary files 318*10465441SEvalZero if os.path.basename(os.path.dirname(BSP_ROOT)) == 'stm32': 319*10465441SEvalZero print("=> copy stm32 bsp library") 320*10465441SEvalZero library_path = os.path.join(os.path.dirname(BSP_ROOT), 'libraries') 321*10465441SEvalZero library_dir = os.path.join(dist_dir, 'libraries') 322*10465441SEvalZero bsp_copy_files(os.path.join(library_path, 'HAL_Drivers'), os.path.join(library_dir, 'HAL_Drivers')) 323*10465441SEvalZero bsp_copy_files(os.path.join(library_path, Env['bsp_lib_type']), os.path.join(library_dir, Env['bsp_lib_type'])) 324*10465441SEvalZero shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) 325*10465441SEvalZero 326*10465441SEvalZero # do bsp special dist handle 327*10465441SEvalZero if 'dist_handle' in Env: 328*10465441SEvalZero print("=> start dist handle") 329*10465441SEvalZero dist_handle = Env['dist_handle'] 330*10465441SEvalZero dist_handle(BSP_ROOT) 331*10465441SEvalZero 332*10465441SEvalZero # copy tools directory 333*10465441SEvalZero print('=> components') 334*10465441SEvalZero do_copy_folder(os.path.join(RTT_ROOT, 'components'), os.path.join(target_path, 'components')) 335*10465441SEvalZero 336*10465441SEvalZero # skip documentation directory 337*10465441SEvalZero # skip examples 338*10465441SEvalZero 339*10465441SEvalZero # copy include directory 340*10465441SEvalZero print('=> include') 341*10465441SEvalZero do_copy_folder(os.path.join(RTT_ROOT, 'include'), os.path.join(target_path, 'include')) 342*10465441SEvalZero 343*10465441SEvalZero # copy all libcpu/ARCH directory 344*10465441SEvalZero print('=> libcpu') 345*10465441SEvalZero import rtconfig 346*10465441SEvalZero do_copy_folder(os.path.join(RTT_ROOT, 'libcpu', rtconfig.ARCH), os.path.join(target_path, 'libcpu', rtconfig.ARCH)) 347*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'libcpu', 'Kconfig'), os.path.join(target_path, 'libcpu', 'Kconfig')) 348*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'libcpu', 'SConscript'), os.path.join(target_path, 'libcpu', 'SConscript')) 349*10465441SEvalZero 350*10465441SEvalZero # copy src directory 351*10465441SEvalZero print('=> src') 352*10465441SEvalZero do_copy_folder(os.path.join(RTT_ROOT, 'src'), os.path.join(target_path, 'src')) 353*10465441SEvalZero 354*10465441SEvalZero # copy tools directory 355*10465441SEvalZero print('=> tools') 356*10465441SEvalZero do_copy_folder(os.path.join(RTT_ROOT, 'tools'), os.path.join(target_path, 'tools'), ignore_patterns('*.pyc')) 357*10465441SEvalZero 358*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'Kconfig'), os.path.join(target_path, 'Kconfig')) 359*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'AUTHORS'), os.path.join(target_path, 'AUTHORS')) 360*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'COPYING'), os.path.join(target_path, 'COPYING')) 361*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'README.md'), os.path.join(target_path, 'README.md')) 362*10465441SEvalZero do_copy_file(os.path.join(RTT_ROOT, 'README_zh.md'), os.path.join(target_path, 'README_zh.md')) 363*10465441SEvalZero 364*10465441SEvalZero # change RTT_ROOT in SConstruct 365*10465441SEvalZero bsp_update_sconstruct(dist_dir) 366*10465441SEvalZero # change RTT_ROOT in Kconfig 367*10465441SEvalZero bsp_update_kconfig(dist_dir) 368*10465441SEvalZero bsp_update_kconfig_library(dist_dir) 369*10465441SEvalZero # update all project files 370*10465441SEvalZero bs_update_ide_project(dist_dir, target_path) 371*10465441SEvalZero 372*10465441SEvalZero # make zip package 373*10465441SEvalZero zip_dist(dist_dir, dist_name) 374*10465441SEvalZero 375*10465441SEvalZero print('done!') 376*10465441SEvalZero 377