377 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			377 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#
 | 
						|
# File      : mkdir.py
 | 
						|
# This file is part of RT-Thread RTOS
 | 
						|
# COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
 | 
						|
#
 | 
						|
#  This program is free software; you can redistribute it and/or modify
 | 
						|
#  it under the terms of the GNU General Public License as published by
 | 
						|
#  the Free Software Foundation; either version 2 of the License, or
 | 
						|
#  (at your option) any later version.
 | 
						|
#
 | 
						|
#  This program is distributed in the hope that it will be useful,
 | 
						|
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
#  GNU General Public License for more details.
 | 
						|
#
 | 
						|
#  You should have received a copy of the GNU General Public License along
 | 
						|
#  with this program; if not, write to the Free Software Foundation, Inc.,
 | 
						|
#  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
						|
#
 | 
						|
# Change Logs:
 | 
						|
# Date           Author       Notes
 | 
						|
# 2017-10-04     Bernard      The first version
 | 
						|
 | 
						|
import os
 | 
						|
import shutil
 | 
						|
 | 
						|
from shutil import ignore_patterns
 | 
						|
 | 
						|
def do_copy_file(src, dst):
 | 
						|
    # check source file
 | 
						|
    if not os.path.exists(src):
 | 
						|
        return
 | 
						|
 | 
						|
    path = os.path.dirname(dst)
 | 
						|
    # mkdir if path not exist
 | 
						|
    if not os.path.exists(path):
 | 
						|
        os.makedirs(path)
 | 
						|
 | 
						|
    shutil.copy2(src, dst)
 | 
						|
 | 
						|
def do_copy_folder(src_dir, dst_dir, ignore=None):
 | 
						|
    import shutil
 | 
						|
    # check source directory
 | 
						|
    if not os.path.exists(src_dir):
 | 
						|
        return
 | 
						|
 | 
						|
    try:
 | 
						|
        if os.path.exists(dst_dir):
 | 
						|
            shutil.rmtree(dst_dir)
 | 
						|
    except:
 | 
						|
        print('Deletes folder: %s failed.' % dst_dir)
 | 
						|
        return
 | 
						|
 | 
						|
    shutil.copytree(src_dir, dst_dir, ignore = ignore)
 | 
						|
 | 
						|
source_ext = ['c', 'h', 's', 'S', 'cpp', 'xpm']
 | 
						|
source_list = []
 | 
						|
 | 
						|
def walk_children(child):
 | 
						|
    global source_list
 | 
						|
    global source_ext
 | 
						|
 | 
						|
    # print child
 | 
						|
    full_path = child.rfile().abspath
 | 
						|
    file_type  = full_path.rsplit('.',1)[1]
 | 
						|
    #print file_type
 | 
						|
    if file_type in source_ext:
 | 
						|
        if full_path not in source_list:
 | 
						|
            source_list.append(full_path)
 | 
						|
 | 
						|
    children = child.all_children()
 | 
						|
    if children != []:
 | 
						|
        for item in children:
 | 
						|
            walk_children(item)
 | 
						|
 | 
						|
def walk_kconfig(RTT_ROOT, source_list):
 | 
						|
    for parent, dirnames, filenames in os.walk(RTT_ROOT):
 | 
						|
        if 'bsp' in parent:
 | 
						|
            continue
 | 
						|
        if '.git' in parent:
 | 
						|
            continue
 | 
						|
        if 'tools' in parent:
 | 
						|
            continue
 | 
						|
 | 
						|
        if 'Kconfig' in filenames:
 | 
						|
            pathfile = os.path.join(parent, 'Kconfig')
 | 
						|
            source_list.append(pathfile)
 | 
						|
        if 'KConfig' in filenames:
 | 
						|
            pathfile = os.path.join(parent, 'KConfig')
 | 
						|
            source_list.append(pathfile)
 | 
						|
 | 
						|
def bsp_copy_files(bsp_root, dist_dir):
 | 
						|
    # copy BSP files
 | 
						|
    do_copy_folder(os.path.join(bsp_root), dist_dir,
 | 
						|
        ignore_patterns('build', 'dist', '*.pyc', '*.old', '*.map', 'rtthread.bin', '.sconsign.dblite', '*.elf', '*.axf', 'cconfig.h'))
 | 
						|
 | 
						|
def bsp_update_sconstruct(dist_dir):
 | 
						|
    with open(os.path.join(dist_dir, 'SConstruct'), 'r') as f:
 | 
						|
        data = f.readlines()
 | 
						|
    with open(os.path.join(dist_dir, 'SConstruct'), 'w') as f:
 | 
						|
        for line in data:
 | 
						|
            if line.find('RTT_ROOT') != -1:
 | 
						|
                if line.find('sys.path') != -1:
 | 
						|
                    f.write('# set RTT_ROOT\n')
 | 
						|
                    f.write('if not os.getenv("RTT_ROOT"): \n    RTT_ROOT="rt-thread"\n\n')
 | 
						|
            f.write(line)
 | 
						|
 | 
						|
def bsp_update_kconfig(dist_dir):
 | 
						|
    # change RTT_ROOT in Kconfig
 | 
						|
    if not os.path.isfile(os.path.join(dist_dir, 'Kconfig')):
 | 
						|
        return
 | 
						|
 | 
						|
    with open(os.path.join(dist_dir, 'Kconfig'), 'r') as f:
 | 
						|
        data = f.readlines()
 | 
						|
    with open(os.path.join(dist_dir, 'Kconfig'), 'w') as f:
 | 
						|
        found = 0
 | 
						|
        for line in data:
 | 
						|
            if line.find('RTT_ROOT') != -1:
 | 
						|
                found = 1
 | 
						|
            if line.find('default') != -1 and found:
 | 
						|
                position = line.find('default')
 | 
						|
                line = line[0:position] + 'default "rt-thread"\n'
 | 
						|
                found = 0
 | 
						|
            f.write(line)
 | 
						|
            
 | 
						|
def bsp_update_kconfig_library(dist_dir):
 | 
						|
    # change RTT_ROOT in Kconfig
 | 
						|
    if not os.path.isfile(os.path.join(dist_dir, 'Kconfig')):
 | 
						|
        return
 | 
						|
 | 
						|
    with open(os.path.join(dist_dir, 'Kconfig'), 'r') as f:
 | 
						|
        data = f.readlines()
 | 
						|
    with open(os.path.join(dist_dir, 'Kconfig'), 'w') as f:
 | 
						|
        found = 0
 | 
						|
        for line in data:
 | 
						|
            if line.find('RTT_ROOT') != -1:
 | 
						|
                found = 1
 | 
						|
            if line.find('../libraries') != -1 and found:
 | 
						|
                position = line.find('../libraries')
 | 
						|
                line = line[0:position] + 'libraries/Kconfig"\n'
 | 
						|
                found = 0
 | 
						|
            f.write(line)
 | 
						|
 | 
						|
def bs_update_ide_project(bsp_root, rtt_root):
 | 
						|
    import subprocess
 | 
						|
    # default update the projects which have template file
 | 
						|
    tgt_dict = {'mdk4':('keil', 'armcc'),
 | 
						|
                'mdk5':('keil', 'armcc'),
 | 
						|
                'iar':('iar', 'iar'),
 | 
						|
                'vs':('msvc', 'cl'),
 | 
						|
                'vs2012':('msvc', 'cl'),
 | 
						|
                'cdk':('gcc', 'gcc')}
 | 
						|
 | 
						|
    scons_env = os.environ.copy()
 | 
						|
    scons_env['RTT_ROOT'] = rtt_root
 | 
						|
 | 
						|
    for item in tgt_dict:
 | 
						|
        child = subprocess.Popen('scons --target=' + item, cwd=bsp_root, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
 | 
						|
        stdout, stderr = child.communicate()
 | 
						|
        if child.returncode == 0:
 | 
						|
            print('update %s project' % item)
 | 
						|
 | 
						|
def zip_dist(dist_dir, dist_name):
 | 
						|
    import zipfile
 | 
						|
 | 
						|
    zip_filename = os.path.join(dist_dir)
 | 
						|
    zip = zipfile.ZipFile(zip_filename + '.zip', 'w')
 | 
						|
    pre_len = len(os.path.dirname(dist_dir))
 | 
						|
 | 
						|
    for parent, dirnames, filenames in os.walk(dist_dir):
 | 
						|
        for filename in filenames:
 | 
						|
            pathfile = os.path.join(parent, filename)
 | 
						|
            arcname = pathfile[pre_len:].strip(os.path.sep)
 | 
						|
            zip.write(pathfile, arcname)
 | 
						|
 | 
						|
    zip.close()
 | 
						|
 | 
						|
def MkDist_Strip(program, BSP_ROOT, RTT_ROOT, Env):
 | 
						|
    global source_list
 | 
						|
 | 
						|
    print('make distribution and strip useless files....')
 | 
						|
 | 
						|
    dist_name = os.path.basename(BSP_ROOT)
 | 
						|
    dist_dir  = os.path.join(BSP_ROOT, 'dist-strip', dist_name)
 | 
						|
    target_path = os.path.join(dist_dir, 'rt-thread')
 | 
						|
 | 
						|
    print('=> %s' % os.path.basename(BSP_ROOT))
 | 
						|
    bsp_copy_files(BSP_ROOT, dist_dir)
 | 
						|
 | 
						|
    # copy stm32 bsp libiary files
 | 
						|
    if os.path.basename(os.path.dirname(BSP_ROOT)) == 'stm32':
 | 
						|
        print("=> copy stm32 bsp library")
 | 
						|
        library_path = os.path.join(os.path.dirname(BSP_ROOT), 'libraries')
 | 
						|
        library_dir  = os.path.join(dist_dir, 'libraries')
 | 
						|
        bsp_copy_files(os.path.join(library_path, 'HAL_Drivers'), os.path.join(library_dir, 'HAL_Drivers'))
 | 
						|
        bsp_copy_files(os.path.join(library_path, Env['bsp_lib_type']), os.path.join(library_dir, Env['bsp_lib_type']))
 | 
						|
        shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig'))
 | 
						|
 | 
						|
    # do bsp special dist handle
 | 
						|
    if 'dist_handle' in Env:       
 | 
						|
        print("=> start dist handle")
 | 
						|
        dist_handle = Env['dist_handle']
 | 
						|
        dist_handle(BSP_ROOT)
 | 
						|
        
 | 
						|
    # get all source files from program
 | 
						|
    for item in program:
 | 
						|
        walk_children(item)
 | 
						|
    source_list.sort()
 | 
						|
 | 
						|
    # copy the source files without libcpu and components/libc in RT-Thread
 | 
						|
    target_list = []
 | 
						|
    libcpu_dir = os.path.join(RTT_ROOT, 'libcpu').lower()
 | 
						|
    libc_dir = os.path.join(RTT_ROOT, 'components', 'libc', 'compilers').lower()
 | 
						|
    sal_dir = os.path.join(RTT_ROOT, 'components', 'net', 'sal_socket').lower()
 | 
						|
    sources_include_sal = False
 | 
						|
    for src in source_list:
 | 
						|
        if src.lower().startswith(BSP_ROOT.lower()):
 | 
						|
            continue
 | 
						|
 | 
						|
        # skip libc and libcpu dir
 | 
						|
        if src.lower().startswith(libcpu_dir):
 | 
						|
            continue
 | 
						|
        if src.lower().startswith(libc_dir):
 | 
						|
            continue
 | 
						|
        if src.lower().startswith(sal_dir):
 | 
						|
            sources_include_sal = True
 | 
						|
            continue
 | 
						|
 | 
						|
        if src.lower().startswith(RTT_ROOT.lower()):
 | 
						|
            target_list.append(src)
 | 
						|
    source_list = target_list
 | 
						|
 | 
						|
    # get source directory
 | 
						|
    src_dir = []
 | 
						|
    for src in source_list:
 | 
						|
        src = src.replace(RTT_ROOT, '')
 | 
						|
        if src[0] == os.sep or src[0] == '/':
 | 
						|
            src = src[1:]
 | 
						|
 | 
						|
        path = os.path.dirname(src)
 | 
						|
        sub_path = path.split(os.sep)
 | 
						|
        full_path = RTT_ROOT
 | 
						|
        for item in sub_path:
 | 
						|
            full_path = os.path.join(full_path, item)
 | 
						|
            if full_path not in src_dir:
 | 
						|
                src_dir.append(full_path)
 | 
						|
 | 
						|
    # add all of SConscript files
 | 
						|
    for item in src_dir:
 | 
						|
        source_list.append(os.path.join(item, 'SConscript'))
 | 
						|
 | 
						|
    # add all of Kconfig files
 | 
						|
    walk_kconfig(RTT_ROOT, source_list)
 | 
						|
 | 
						|
    # copy all files to target directory
 | 
						|
    source_list.sort()
 | 
						|
    for src in source_list:
 | 
						|
        dst = src.replace(RTT_ROOT, '')
 | 
						|
        if dst[0] == os.sep or dst[0] == '/':
 | 
						|
            dst = dst[1:]
 | 
						|
 | 
						|
        print('=> %s' % dst)
 | 
						|
        dst = os.path.join(target_path, dst)
 | 
						|
        do_copy_file(src, dst)
 | 
						|
 | 
						|
    # copy tools directory
 | 
						|
    print('=> tools')
 | 
						|
    do_copy_folder(os.path.join(RTT_ROOT, 'tools'), os.path.join(target_path, 'tools'), ignore_patterns('*.pyc'))
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'Kconfig'), os.path.join(target_path, 'Kconfig'))
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'AUTHORS'), os.path.join(target_path, 'AUTHORS'))
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'COPYING'), os.path.join(target_path, 'COPYING'))
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'README.md'), os.path.join(target_path, 'README.md'))
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'README_zh.md'), os.path.join(target_path, 'README_zh.md'))
 | 
						|
 | 
						|
    print('=> %s' % os.path.join('components', 'libc', 'compilers'))
 | 
						|
    do_copy_folder(os.path.join(RTT_ROOT, 'components', 'libc', 'compilers'), os.path.join(target_path, 'components', 'libc', 'compilers'))
 | 
						|
 | 
						|
    if sources_include_sal:
 | 
						|
        print('=> %s' % os.path.join('components', 'net', 'sal_socket'))
 | 
						|
        do_copy_folder(os.path.join(RTT_ROOT, 'components', 'net', 'sal_socket'), os.path.join(target_path, 'components', 'net', 'sal_socket'))
 | 
						|
 | 
						|
    # copy all libcpu/ARCH directory
 | 
						|
    import rtconfig
 | 
						|
    print('=> %s' % (os.path.join('libcpu', rtconfig.ARCH, rtconfig.CPU)))
 | 
						|
    do_copy_folder(os.path.join(RTT_ROOT, 'libcpu', rtconfig.ARCH, rtconfig.CPU), os.path.join(target_path, 'libcpu', rtconfig.ARCH, rtconfig.CPU))
 | 
						|
    if os.path.exists(os.path.join(RTT_ROOT, 'libcpu', rtconfig.ARCH, 'common')):
 | 
						|
        print('=> %s' % (os.path.join('libcpu', rtconfig.ARCH, 'common')))
 | 
						|
        do_copy_folder(os.path.join(RTT_ROOT, 'libcpu', rtconfig.ARCH, 'common'), os.path.join(target_path, 'libcpu', rtconfig.ARCH, 'common'))
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'libcpu', 'Kconfig'), os.path.join(target_path, 'libcpu', 'Kconfig'))
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'libcpu', 'SConscript'), os.path.join(target_path, 'libcpu', 'SConscript'))
 | 
						|
 | 
						|
    # change RTT_ROOT in SConstruct
 | 
						|
    bsp_update_sconstruct(dist_dir)
 | 
						|
    # change RTT_ROOT in Kconfig
 | 
						|
    bsp_update_kconfig(dist_dir)
 | 
						|
    bsp_update_kconfig_library(dist_dir)
 | 
						|
    # update all project files
 | 
						|
    bs_update_ide_project(dist_dir, target_path)
 | 
						|
 | 
						|
    # make zip package
 | 
						|
    zip_dist(dist_dir, dist_name)
 | 
						|
 | 
						|
    print('done!')
 | 
						|
 | 
						|
def MkDist(program, BSP_ROOT, RTT_ROOT, Env):
 | 
						|
    print('make distribution....')
 | 
						|
 | 
						|
    dist_name = os.path.basename(BSP_ROOT)
 | 
						|
    dist_dir  = os.path.join(BSP_ROOT, 'dist', dist_name)
 | 
						|
 | 
						|
    target_path = os.path.join(dist_dir, 'rt-thread')
 | 
						|
 | 
						|
    # copy BSP files
 | 
						|
    print('=> %s' % os.path.basename(BSP_ROOT))
 | 
						|
    bsp_copy_files(BSP_ROOT, dist_dir)
 | 
						|
 | 
						|
    # copy stm32 bsp libiary files
 | 
						|
    if os.path.basename(os.path.dirname(BSP_ROOT)) == 'stm32':
 | 
						|
        print("=> copy stm32 bsp library")
 | 
						|
        library_path = os.path.join(os.path.dirname(BSP_ROOT), 'libraries')
 | 
						|
        library_dir  = os.path.join(dist_dir, 'libraries')
 | 
						|
        bsp_copy_files(os.path.join(library_path, 'HAL_Drivers'), os.path.join(library_dir, 'HAL_Drivers'))
 | 
						|
        bsp_copy_files(os.path.join(library_path, Env['bsp_lib_type']), os.path.join(library_dir, Env['bsp_lib_type']))
 | 
						|
        shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig'))
 | 
						|
 | 
						|
    # do bsp special dist handle
 | 
						|
    if 'dist_handle' in Env:
 | 
						|
        print("=> start dist handle")
 | 
						|
        dist_handle = Env['dist_handle']
 | 
						|
        dist_handle(BSP_ROOT)
 | 
						|
 | 
						|
    # copy tools directory
 | 
						|
    print('=> components')
 | 
						|
    do_copy_folder(os.path.join(RTT_ROOT, 'components'), os.path.join(target_path, 'components'))
 | 
						|
 | 
						|
    # skip documentation directory
 | 
						|
    # skip examples
 | 
						|
 | 
						|
    # copy include directory
 | 
						|
    print('=> include')
 | 
						|
    do_copy_folder(os.path.join(RTT_ROOT, 'include'), os.path.join(target_path, 'include'))
 | 
						|
 | 
						|
    # copy all libcpu/ARCH directory
 | 
						|
    print('=> libcpu')
 | 
						|
    import rtconfig
 | 
						|
    do_copy_folder(os.path.join(RTT_ROOT, 'libcpu', rtconfig.ARCH), os.path.join(target_path, 'libcpu', rtconfig.ARCH))
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'libcpu', 'Kconfig'), os.path.join(target_path, 'libcpu', 'Kconfig'))
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'libcpu', 'SConscript'), os.path.join(target_path, 'libcpu', 'SConscript'))
 | 
						|
 | 
						|
    # copy src directory
 | 
						|
    print('=> src')
 | 
						|
    do_copy_folder(os.path.join(RTT_ROOT, 'src'), os.path.join(target_path, 'src'))
 | 
						|
 | 
						|
    # copy tools directory
 | 
						|
    print('=> tools')
 | 
						|
    do_copy_folder(os.path.join(RTT_ROOT, 'tools'), os.path.join(target_path, 'tools'), ignore_patterns('*.pyc'))
 | 
						|
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'Kconfig'), os.path.join(target_path, 'Kconfig'))
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'AUTHORS'), os.path.join(target_path, 'AUTHORS'))
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'COPYING'), os.path.join(target_path, 'COPYING'))
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'README.md'), os.path.join(target_path, 'README.md'))
 | 
						|
    do_copy_file(os.path.join(RTT_ROOT, 'README_zh.md'), os.path.join(target_path, 'README_zh.md'))
 | 
						|
 | 
						|
    # change RTT_ROOT in SConstruct
 | 
						|
    bsp_update_sconstruct(dist_dir)
 | 
						|
    # change RTT_ROOT in Kconfig
 | 
						|
    bsp_update_kconfig(dist_dir)
 | 
						|
    bsp_update_kconfig_library(dist_dir)
 | 
						|
    # update all project files
 | 
						|
    bs_update_ide_project(dist_dir, target_path)
 | 
						|
 | 
						|
    # make zip package
 | 
						|
    zip_dist(dist_dir, dist_name)
 | 
						|
 | 
						|
    print('done!')
 | 
						|
 |