xref: /nrf52832-nimble/rt-thread/tools/codeblocks.py (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero#
2*10465441SEvalZero# File      : codeblocks.py
3*10465441SEvalZero# This file is part of RT-Thread RTOS
4*10465441SEvalZero# COPYRIGHT (C) 2006 - 2015, 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# 2015-01-20     Bernard      Add copyright information
23*10465441SEvalZero#
24*10465441SEvalZero
25*10465441SEvalZeroimport os
26*10465441SEvalZeroimport sys
27*10465441SEvalZeroimport string
28*10465441SEvalZeroimport building
29*10465441SEvalZero
30*10465441SEvalZeroimport xml.etree.ElementTree as etree
31*10465441SEvalZerofrom xml.etree.ElementTree import SubElement
32*10465441SEvalZerofrom utils import _make_path_relative
33*10465441SEvalZerofrom utils import xml_indent
34*10465441SEvalZero
35*10465441SEvalZeroimport utils
36*10465441SEvalZero
37*10465441SEvalZerofs_encoding = sys.getfilesystemencoding()
38*10465441SEvalZero
39*10465441SEvalZerodef CB_AddHeadFiles(program, elem, project_path):
40*10465441SEvalZero    utils.source_ext = []
41*10465441SEvalZero    utils.source_ext = ["h"]
42*10465441SEvalZero    for item in program:
43*10465441SEvalZero        utils.walk_children(item)
44*10465441SEvalZero    utils.source_list.sort()
45*10465441SEvalZero    # print utils.source_list
46*10465441SEvalZero
47*10465441SEvalZero    for f in utils.source_list:
48*10465441SEvalZero        path = _make_path_relative(project_path, f)
49*10465441SEvalZero        Unit = SubElement(elem, 'Unit')
50*10465441SEvalZero        Unit.set('filename', path.decode(fs_encoding))
51*10465441SEvalZero
52*10465441SEvalZerodef CB_AddCFiles(ProjectFiles, parent, gname, files, project_path):
53*10465441SEvalZero    for f in files:
54*10465441SEvalZero        fn = f.rfile()
55*10465441SEvalZero        name = fn.name
56*10465441SEvalZero        path = os.path.dirname(fn.abspath)
57*10465441SEvalZero
58*10465441SEvalZero        path = _make_path_relative(project_path, path)
59*10465441SEvalZero        path = os.path.join(path, name)
60*10465441SEvalZero
61*10465441SEvalZero        Unit = SubElement(parent, 'Unit')
62*10465441SEvalZero        Unit.set('filename', path.decode(fs_encoding))
63*10465441SEvalZero        Option = SubElement(Unit, 'Option')
64*10465441SEvalZero        Option.set('compilerVar', "CC")
65*10465441SEvalZero
66*10465441SEvalZerodef CBProject(target, script, program):
67*10465441SEvalZero    project_path = os.path.dirname(os.path.abspath(target))
68*10465441SEvalZero
69*10465441SEvalZero    if os.path.isfile('template.cbp'):
70*10465441SEvalZero        tree = etree.parse('template.cbp')
71*10465441SEvalZero    else:
72*10465441SEvalZero        tree = etree.parse(os.path.join(os.path.dirname(__file__), 'template.cbp'))
73*10465441SEvalZero
74*10465441SEvalZero    root = tree.getroot()
75*10465441SEvalZero
76*10465441SEvalZero    out = open(target, 'w')
77*10465441SEvalZero    out.write('<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>\n')
78*10465441SEvalZero
79*10465441SEvalZero    ProjectFiles = []
80*10465441SEvalZero
81*10465441SEvalZero    # SECTION 1. add "*.c|*.h" files group
82*10465441SEvalZero    for elem in tree.iter(tag='Project'):
83*10465441SEvalZero        # print elem.tag, elem.attrib
84*10465441SEvalZero        break
85*10465441SEvalZero    # add c files
86*10465441SEvalZero    for group in script:
87*10465441SEvalZero        group_xml = CB_AddCFiles(ProjectFiles, elem, group['name'], group['src'], project_path)
88*10465441SEvalZero    # add h files
89*10465441SEvalZero    CB_AddHeadFiles(program, elem, project_path)
90*10465441SEvalZero
91*10465441SEvalZero    # SECTION 2.
92*10465441SEvalZero    # write head include path
93*10465441SEvalZero    if 'CPPPATH' in building.Env:
94*10465441SEvalZero        cpp_path = building.Env['CPPPATH']
95*10465441SEvalZero        paths  = set()
96*10465441SEvalZero        for path in cpp_path:
97*10465441SEvalZero            inc = _make_path_relative(project_path, os.path.normpath(path))
98*10465441SEvalZero            paths.add(inc) #.replace('\\', '/')
99*10465441SEvalZero
100*10465441SEvalZero        paths = [i for i in paths]
101*10465441SEvalZero        paths.sort()
102*10465441SEvalZero        # write include path, definitions
103*10465441SEvalZero        for elem in tree.iter(tag='Compiler'):
104*10465441SEvalZero            break
105*10465441SEvalZero        for path in paths:
106*10465441SEvalZero            Add = SubElement(elem, 'Add')
107*10465441SEvalZero            Add.set('directory', path)
108*10465441SEvalZero
109*10465441SEvalZero        for macro in building.Env.get('CPPDEFINES', []):
110*10465441SEvalZero            Add = SubElement(elem, 'Add')
111*10465441SEvalZero            for d in macro:
112*10465441SEvalZero                Add.set('option', "-D"+d)
113*10465441SEvalZero
114*10465441SEvalZero        # write link flags
115*10465441SEvalZero    '''
116*10465441SEvalZero        # write lib dependence
117*10465441SEvalZero        if 'LIBS' in building.Env:
118*10465441SEvalZero            for elem in tree.iter(tag='Tool'):
119*10465441SEvalZero                if elem.attrib['Name'] == 'VCLinkerTool':
120*10465441SEvalZero                    break
121*10465441SEvalZero            libs_with_extention = [i+'.lib' for i in building.Env['LIBS']]
122*10465441SEvalZero            libs = ' '.join(libs_with_extention)
123*10465441SEvalZero            elem.set('AdditionalDependencies', libs)
124*10465441SEvalZero
125*10465441SEvalZero        # write lib include path
126*10465441SEvalZero        if 'LIBPATH' in building.Env:
127*10465441SEvalZero            lib_path = building.Env['LIBPATH']
128*10465441SEvalZero            paths  = set()
129*10465441SEvalZero            for path in lib_path:
130*10465441SEvalZero                inc = _make_path_relative(project_path, os.path.normpath(path))
131*10465441SEvalZero                paths.add(inc) #.replace('\\', '/')
132*10465441SEvalZero
133*10465441SEvalZero            paths = [i for i in paths]
134*10465441SEvalZero            paths.sort()
135*10465441SEvalZero            lib_paths = ';'.join(paths)
136*10465441SEvalZero            elem.set('AdditionalLibraryDirectories', lib_paths)
137*10465441SEvalZero    '''
138*10465441SEvalZero    xml_indent(root)
139*10465441SEvalZero    out.write(etree.tostring(root, encoding='utf-8'))
140*10465441SEvalZero    out.close()
141