codeblocks.py 4.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#
# File      : codeblocks.py
# This file is part of RT-Thread RTOS
# COPYRIGHT (C) 2006 - 2015, 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
# 2015-01-20     Bernard      Add copyright information
#

wuyangyong's avatar
wuyangyong 已提交
25 26 27 28 29 30 31 32 33
import os
import sys
import string
import building

import xml.etree.ElementTree as etree
from xml.etree.ElementTree import SubElement
from utils import _make_path_relative
from utils import xml_indent
B
bernard 已提交
34 35 36

import utils

wuyangyong's avatar
wuyangyong 已提交
37 38 39
fs_encoding = sys.getfilesystemencoding()

def CB_AddHeadFiles(program, elem, project_path):
B
bernard 已提交
40 41
    utils.source_ext = []
    utils.source_ext = ["h"]
wuyangyong's avatar
wuyangyong 已提交
42
    for item in program:
B
bernard 已提交
43 44 45
        utils.walk_children(item)    
    utils.source_list.sort()
    # print utils.source_list
wuyangyong's avatar
wuyangyong 已提交
46
    
B
bernard 已提交
47
    for f in utils.source_list:
wuyangyong's avatar
wuyangyong 已提交
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
        path = _make_path_relative(project_path, f)
        Unit = SubElement(elem, 'Unit')
        Unit.set('filename', path.decode(fs_encoding))

def CB_AddCFiles(ProjectFiles, parent, gname, files, project_path):
    for f in files:
        fn = f.rfile()
        name = fn.name
        path = os.path.dirname(fn.abspath)

        path = _make_path_relative(project_path, path)
        path = os.path.join(path, name)

        Unit = SubElement(parent, 'Unit')
        Unit.set('filename', path.decode(fs_encoding))
        Option = SubElement(Unit, 'Option')
        Option.set('compilerVar', "CC")

def CBProject(target, script, program):
    project_path = os.path.dirname(os.path.abspath(target))
wuyangyong's avatar
wuyangyong 已提交
68 69 70 71 72

    if os.path.isfile('template.cbp'):
        tree = etree.parse('template.cbp')
    else:
        tree = etree.parse(os.path.join(os.path.dirname(__file__), 'template.cbp'))
wuyangyong's avatar
wuyangyong 已提交
73 74 75
    
    root = tree.getroot()
    
76
    out = open(target, 'w')
wuyangyong's avatar
wuyangyong 已提交
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
    out.write('<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>\n')
    
    ProjectFiles = []
    
    # SECTION 1. add "*.c|*.h" files group
    for elem in tree.iter(tag='Project'):
        # print elem.tag, elem.attrib
        break
    # add c files
    for group in script:
        group_xml = CB_AddCFiles(ProjectFiles, elem, group['name'], group['src'], project_path)
    # add h files
    CB_AddHeadFiles(program, elem, project_path)

    # SECTION 2. 
    # write head include path
93
    if 'CPPPATH' in building.Env:
wuyangyong's avatar
wuyangyong 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
        cpp_path = building.Env['CPPPATH']
        paths  = set()
        for path in cpp_path:
            inc = _make_path_relative(project_path, os.path.normpath(path))
            paths.add(inc) #.replace('\\', '/')
    
        paths = [i for i in paths]
        paths.sort()
        # write include path, definitions
        for elem in tree.iter(tag='Compiler'):
            break
        for path in paths:
            Add = SubElement(elem, 'Add')
            Add.set('directory', path)

109
        for macro in building.Env.get('CPPDEFINES', []):
wuyangyong's avatar
wuyangyong 已提交
110
            Add = SubElement(elem, 'Add')
H
heyuanjie 已提交
111 112
            for d in macro:
                Add.set('option', "-D"+d)
wuyangyong's avatar
wuyangyong 已提交
113 114 115 116
        
        # write link flags
    '''
        # write lib dependence 
117
        if 'LIBS' in building.Env:
wuyangyong's avatar
wuyangyong 已提交
118 119 120 121 122 123 124 125
            for elem in tree.iter(tag='Tool'):
                if elem.attrib['Name'] == 'VCLinkerTool':
                    break
            libs_with_extention = [i+'.lib' for i in building.Env['LIBS']]
            libs = ' '.join(libs_with_extention)
            elem.set('AdditionalDependencies', libs)
    
        # write lib include path
126
        if 'LIBPATH' in building.Env:
wuyangyong's avatar
wuyangyong 已提交
127 128 129 130 131 132 133 134 135 136 137 138 139 140
            lib_path = building.Env['LIBPATH']
            paths  = set()
            for path in lib_path:
                inc = _make_path_relative(project_path, os.path.normpath(path))
                paths.add(inc) #.replace('\\', '/')
        
            paths = [i for i in paths]
            paths.sort()
            lib_paths = ';'.join(paths)
            elem.set('AdditionalLibraryDirectories', lib_paths)
    '''
    xml_indent(root)
    out.write(etree.tostring(root, encoding='utf-8'))
    out.close()