xref: /nrf52832-nimble/rt-thread/tools/cdk.py (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero#
2*10465441SEvalZero# File      : keil.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# 2017-10-16     Tanek        Add CDK IDE support
23*10465441SEvalZero#
24*10465441SEvalZero
25*10465441SEvalZeroimport os
26*10465441SEvalZeroimport sys
27*10465441SEvalZeroimport string
28*10465441SEvalZero
29*10465441SEvalZeroimport xml.etree.ElementTree as etree
30*10465441SEvalZerofrom xml.etree.ElementTree import SubElement
31*10465441SEvalZerofrom utils import _make_path_relative
32*10465441SEvalZerofrom utils import xml_indent
33*10465441SEvalZero
34*10465441SEvalZerodef SDKAddGroup(ProjectFiles, parent, name, files, project_path):
35*10465441SEvalZero    # don't add an empty group
36*10465441SEvalZero    if len(files) == 0:
37*10465441SEvalZero        return
38*10465441SEvalZero
39*10465441SEvalZero    group = SubElement(parent, 'VirtualDirectory', attrib={'Name': name})
40*10465441SEvalZero
41*10465441SEvalZero    for f in files:
42*10465441SEvalZero        fn = f.rfile()
43*10465441SEvalZero        name = fn.name
44*10465441SEvalZero        path = os.path.dirname(fn.abspath)
45*10465441SEvalZero
46*10465441SEvalZero        basename = os.path.basename(path)
47*10465441SEvalZero        path = _make_path_relative(project_path, path)
48*10465441SEvalZero        elm_attr_name = os.path.join(path, name)
49*10465441SEvalZero
50*10465441SEvalZero        file = SubElement(group, 'File', attrib={'Name': elm_attr_name})
51*10465441SEvalZero
52*10465441SEvalZero    return group
53*10465441SEvalZero
54*10465441SEvalZerodef _CDKProject(tree, target, script):
55*10465441SEvalZero
56*10465441SEvalZero    project_path = os.path.dirname(os.path.abspath(target))
57*10465441SEvalZero
58*10465441SEvalZero    root = tree.getroot()
59*10465441SEvalZero    out = open(target, 'w')
60*10465441SEvalZero    out.write('<?xml version="1.0" encoding="UTF-8"?>\n')
61*10465441SEvalZero
62*10465441SEvalZero    CPPPATH = []
63*10465441SEvalZero    CPPDEFINES = []
64*10465441SEvalZero    LINKFLAGS = ''
65*10465441SEvalZero    CCFLAGS = ''
66*10465441SEvalZero    ProjectFiles = []
67*10465441SEvalZero
68*10465441SEvalZero    for child in root:
69*10465441SEvalZero        if child.tag == 'VirtualDirectory':
70*10465441SEvalZero            root.remove(child)
71*10465441SEvalZero
72*10465441SEvalZero    for group in script:
73*10465441SEvalZero        group_tree = SDKAddGroup(ProjectFiles, root, group['name'], group['src'], project_path)
74*10465441SEvalZero
75*10465441SEvalZero        # get each include path
76*10465441SEvalZero        if 'CPPPATH' in group and group['CPPPATH']:
77*10465441SEvalZero            if CPPPATH:
78*10465441SEvalZero                CPPPATH += group['CPPPATH']
79*10465441SEvalZero            else:
80*10465441SEvalZero                CPPPATH += group['CPPPATH']
81*10465441SEvalZero
82*10465441SEvalZero        # get each group's definitions
83*10465441SEvalZero        if 'CPPDEFINES' in group and group['CPPDEFINES']:
84*10465441SEvalZero            if CPPDEFINES:
85*10465441SEvalZero                CPPDEFINES += group['CPPDEFINES']
86*10465441SEvalZero            else:
87*10465441SEvalZero                CPPDEFINES += group['CPPDEFINES']
88*10465441SEvalZero
89*10465441SEvalZero        # get each group's cc flags
90*10465441SEvalZero        if 'CCFLAGS' in group and group['CCFLAGS']:
91*10465441SEvalZero            if CCFLAGS:
92*10465441SEvalZero                CCFLAGS += ' ' + group['CCFLAGS']
93*10465441SEvalZero            else:
94*10465441SEvalZero                CCFLAGS += group['CCFLAGS']
95*10465441SEvalZero
96*10465441SEvalZero        # get each group's link flags
97*10465441SEvalZero        if 'LINKFLAGS' in group and group['LINKFLAGS']:
98*10465441SEvalZero            if LINKFLAGS:
99*10465441SEvalZero                LINKFLAGS += ' ' + group['LINKFLAGS']
100*10465441SEvalZero            else:
101*10465441SEvalZero                LINKFLAGS += group['LINKFLAGS']
102*10465441SEvalZero
103*10465441SEvalZero        # todo: cdk add lib
104*10465441SEvalZero
105*10465441SEvalZero    # write include path, definitions and link flags
106*10465441SEvalZero    text = ';'.join([_make_path_relative(project_path, os.path.normpath(i)) for i in CPPPATH])
107*10465441SEvalZero    IncludePath = tree.find('BuildConfigs/BuildConfig/Compiler/IncludePath')
108*10465441SEvalZero    IncludePath.text = text
109*10465441SEvalZero    IncludePath = tree.find('BuildConfigs/BuildConfig/Asm/IncludePath')
110*10465441SEvalZero    IncludePath.text = text
111*10465441SEvalZero
112*10465441SEvalZero    Define = tree.find('BuildConfigs/BuildConfig/Compiler/Define')
113*10465441SEvalZero    Define.text = ', '.join(set(CPPDEFINES))
114*10465441SEvalZero
115*10465441SEvalZero    CC_Misc = tree.find('BuildConfigs/BuildConfig/Compiler/OtherFlags')
116*10465441SEvalZero    CC_Misc.text = CCFLAGS
117*10465441SEvalZero
118*10465441SEvalZero    LK_Misc = tree.find('BuildConfigs/BuildConfig/Linker/OtherFlags')
119*10465441SEvalZero    LK_Misc.text = LINKFLAGS
120*10465441SEvalZero
121*10465441SEvalZero    xml_indent(root)
122*10465441SEvalZero    out.write(etree.tostring(root, encoding='utf-8'))
123*10465441SEvalZero    out.close()
124*10465441SEvalZero
125*10465441SEvalZerodef CDKProject(target, script):
126*10465441SEvalZero    template_tree = etree.parse('template.cdkproj')
127*10465441SEvalZero
128*10465441SEvalZero    _CDKProject(template_tree, target, script)
129