Sfoglia il codice sorgente

[Tools] Add scons --dist command.

bernard 7 anni fa
parent
commit
6f6dd80103
2 ha cambiato i file con 324 aggiunte e 163 eliminazioni
  1. 19 163
      tools/building.py
  2. 305 0
      tools/mkdist.py

+ 19 - 163
tools/building.py

@@ -179,6 +179,11 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
                       action='store_true',
                       default=False,
                       help='copy header of rt-thread directory to local.')
+    AddOption('--dist',
+                      dest = 'make-dist',
+                      action = 'store_true',
+                      default=False,
+                      help = 'make distribution')
     AddOption('--cscope',
                       dest='cscope',
                       action='store_true',
@@ -502,7 +507,9 @@ def DefineGroup(name, src, depend, **parameters):
     if GetOption('cleanlib') and os.path.exists(os.path.join(group['path'], GroupLibFullName(name, Env))):
         if group['src'] != []:
             print 'Remove library:', GroupLibFullName(name, Env)
-            do_rm_file(os.path.join(group['path'], GroupLibFullName(name, Env)))
+            fn = os.path.join(group['path'], GroupLibFullName(name, Env))
+            if os.path.exists(fn):
+                os.unlink(fn)
 
     # check whether exist group library
     if not GetOption('buildlib') and os.path.exists(os.path.join(group['path'], GroupLibFullName(name, Env))):
@@ -692,11 +699,19 @@ def EndBuilding(target, program = None):
         from ua import PrepareUA
         PrepareUA(Projects, Rtt_Root, str(Dir('#')))
 
+    BSP_ROOT = Dir('#').abspath
     if GetOption('copy') and program != None:
-        MakeCopy(program)
+        from mkdist import MakeCopy
+        MakeCopy(program, BSP_ROOT, Rtt_Root, Env)
+        exit(0)
     if GetOption('copy-header') and program != None:
-        MakeCopyHeader(program)
-
+        from mkdist import MakeCopyHeader
+        MakeCopyHeader(program, BSP_ROOT, Rtt_Root, Env)
+        exit(0)
+    if GetOption('make-dist') and program != None:
+        from mkdist import MkDist
+        MkDist(program, BSP_ROOT, Rtt_Root, Env)
+        exit(0)
     if GetOption('cscope'):
         from cscope import CscopeDatabase
         CscopeDatabase(Projects)
@@ -761,163 +776,4 @@ def PackageSConscript(package):
 
     return BuildPackage(package)
 
-def file_path_exist(path, *args):
-    return os.path.exists(os.path.join(path, *args))
-
-def do_rm_file(src):
-    if os.path.exists(src):
-       os.unlink(src)
-
-def do_copy_file(src, dst):
-    import shutil
-    # 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):
-    import shutil
-    # check source directory
-    if not os.path.exists(src_dir):
-        return
-
-    if os.path.exists(dst_dir):
-        shutil.rmtree(dst_dir)
-
-    shutil.copytree(src_dir, dst_dir)
-
-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 MakeCopy(program):
-    global source_list
-    global Rtt_Root
-    global Env
-
-    target_path = os.path.join(Dir('#').abspath, 'rt-thread')
-
-    if Env['PLATFORM'] == 'win32':
-        RTT_ROOT = Rtt_Root.lower()
-    else:
-        RTT_ROOT = Rtt_Root
-
-    if target_path.startswith(RTT_ROOT):
-        return
-
-    for item in program:
-        walk_children(item)
-
-    source_list.sort()
-
-    # filte source file in RT-Thread
-    target_list = []
-    for src in source_list:
-        if Env['PLATFORM'] == 'win32':
-            src = src.lower()
-
-        if src.startswith(RTT_ROOT):
-            target_list.append(src)
-
-    source_list = target_list
-    # get source path
-    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)
-
-    for item in src_dir:
-        source_list.append(os.path.join(item, 'SConscript'))
-
-    for src in source_list:
-        dst = src.replace(RTT_ROOT, '')
-        if dst[0] == os.sep or dst[0] == '/':
-            dst = dst[1:]
-        print '=> ', 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"))
-    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'))
-
-def MakeCopyHeader(program):
-    global source_ext
-    source_ext = []
-    source_ext = ["h", "xpm"]
-    global source_list
-    global Rtt_Root
-    global Env
-
-    target_path = os.path.join(Dir('#').abspath, 'rt-thread')
-
-    if Env['PLATFORM'] == 'win32':
-        RTT_ROOT = Rtt_Root.lower()
-    else:
-        RTT_ROOT = Rtt_Root
-
-    if target_path.startswith(RTT_ROOT):
-        return
-
-    for item in program:
-        walk_children(item)
-
-    source_list.sort()
-
-    # filte source file in RT-Thread
-    target_list = []
-    for src in source_list:
-        if Env['PLATFORM'] == 'win32':
-            src = src.lower()
-
-        if src.startswith(RTT_ROOT):
-            target_list.append(src)
-
-    source_list = target_list
-
-    for src in source_list:
-        dst = src.replace(RTT_ROOT, '')
-        if dst[0] == os.sep or dst[0] == '/':
-            dst = dst[1:]
-        print '=> ', 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"))
-    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'))

+ 305 - 0
tools/mkdist.py

@@ -0,0 +1,305 @@
+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 MakeCopy(program, BSP_ROOT, RTT_ROOT, Env):
+    global source_list
+
+    target_path = os.path.join(BSP_ROOT, 'rt-thread')
+
+    if target_path.startswith(RTT_ROOT):
+        print('please use scons --dist to make a distribution')
+        return
+
+    for item in program:
+        walk_children(item)
+
+    source_list.sort()
+
+    # fill source file in RT-Thread
+    target_list = []
+    for src in source_list:
+        if Env['PLATFORM'] == 'win32':
+            src = src.lower()
+
+        if src.startswith(RTT_ROOT):
+            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)
+
+    for item in src_dir:
+        source_list.append(os.path.join(item, 'SConscript'))
+    walk_kconfig(RTT_ROOT, source_list)
+
+    for src in source_list:
+        dst = src.replace(RTT_ROOT, '')
+        if dst[0] == os.sep or dst[0] == '/':
+            dst = dst[1:]
+        print '=> ', 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('=> libc')
+    do_copy_folder(os.path.join(RTT_ROOT, "components", 'libc', 'compilers'), os.path.join(target_path, "components", 'libc', 'compilers'))
+
+    print('done!')
+
+def MakeCopyHeader(program, BSP_ROOT, RTT_ROOT, Env):
+    global source_list
+    global source_ext
+    source_ext = []
+    source_ext = ["h", "xpm"]
+
+    target_path = os.path.join(BSP_ROOT, 'rt-thread')
+
+    if target_path.startswith(RTT_ROOT):
+        print('please use scons --dist to make a distribution')
+        return
+
+    for item in program:
+        walk_children(item)
+
+    source_list.sort()
+
+    # fill source file in RT-Thread
+    target_list = []
+    for src in source_list:
+        if Env['PLATFORM'] == 'win32':
+            src = src.lower()
+
+        if src.startswith(RTT_ROOT):
+            target_list.append(src)
+
+    source_list = target_list
+
+    for src in source_list:
+        dst = src.replace(RTT_ROOT, '')
+        if dst[0] == os.sep or dst[0] == '/':
+            dst = dst[1:]
+        print '=> ', 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('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)
+
+    # 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'))
+
+    global source_list
+
+    target_path = os.path.join(dist_dir, 'rt-thread')
+
+    for item in program:
+        walk_children(item)
+
+    source_list.sort()
+
+    # copy the source files in RT-Thread
+    target_list = []
+    for src in source_list:
+        if src.lower().startswith(BSP_ROOT.lower()):
+            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)
+
+    for item in src_dir:
+        source_list.append(os.path.join(item, 'SConscript'))
+
+    # add all of Kconfig files
+    walk_kconfig(RTT_ROOT, source_list)
+
+    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('=> libc')
+    do_copy_folder(os.path.join(RTT_ROOT, "components", 'libc', 'compilers'), os.path.join(target_path, "components", 'libc', 'compilers'))
+
+    # change RTT_ROOT in SConstruct
+    try:
+        sconstruct = file(os.path.join(BSP_ROOT, 'SConstruct'))
+        out = file(os.path.join(dist_dir, 'SConstruct'), 'w')
+
+        for line in sconstruct:
+            if line.find('RTT_ROOT') != -1:
+                if line.find('sys.path') != -1:
+                    out.write('# set RTT_ROOT\n')
+                    out.write("if not os.getenv('RTT_ROOT'): \n    RTT_ROOT='rt-thread'\n\n")
+
+            out.write(line)
+    except :
+        print('')
+
+    # change RTT_ROOT in KConfig
+    try:
+        if os.path.exists(os.path.join(BSP_ROOT, 'Kconfig')):
+            Kconfig = file(os.path.join(BSP_ROOT, 'Kconfig'))
+            out = file(os.path.join(dist_dir, 'Kconfig'), 'w')
+
+            found = 0
+            for line in Kconfig:
+                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
+
+                out.write(line)
+
+            out.close()
+    except :
+        print('')
+
+    # make zip package
+    import zipfile
+    
+    zip_filename = os.path.join(BSP_ROOT, 'dist', dist_name)
+    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()
+
+    print('done!')