diff --git a/cmake.py b/cmake.py new file mode 100644 index 0000000..fcbd6f0 --- /dev/null +++ b/cmake.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- + +import os +import datetime +import platform +from jinja2 import Environment, FileSystemLoader + +class CMake (object): + + def __init__(self, data): + + self.context = {} + + def populateCMake (self): + """ Generate CMakeList.txt file for building the project + """ + + # For debug run cmake -DCMAKE_BUILD_TYPE=Debug or Release + cmake = {} + fpu = '-mfpu=fpv5-sp-d16 -mfloat-abi=softfp' + fpu = '' + + core = '-mcpu=cortex-m4' + + cmake['version'] = '3.1' + cmake['project'] = self.root.Project.attrib['Name'] + cmake['incs'] = [] + cmake['incs'].append('inc') + cmake['srcs'] = [] + cmake['srcs'].append({'path':'src','var':'DIR_SRC'}) + + cmake['cxx'] = 'false' + + cmake['c_flags'] = '-g -Wextra -Wshadow -Wimplicit-function-declaration -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes -fno-common -ffunction-sections -fdata-sections -MD -Wall -Wundef -mthumb ' + core + ' ' + fpu + + cmake['cxx_flags'] = '-Wextra -Wshadow -Wredundant-decls -Weffc++ -fno-common -ffunction-sections -fdata-sections -MD -Wall -Wundef -mthumb ' + core + ' ' + fpu + + cmake['asm_flags'] = '-g -mthumb ' + core + ' ' + fpu + ' -x assembler-with-cpp' + cmake['linker_flags'] = '-g -Wl,--gc-sections -Wl,-Map=' + cmake['project'] + '.map --static -nostartfiles -Wl,--start-group -specs=nosys.specs -lc -lgcc -lnosys -Wl,--end-group -mthumb ' + core + ' ' + fpu + cmake['linker_script'] = 'stm32.ld' + cmake['linker_path'] = 'libopencm3/lib' + cmake['defines'] = [] + cmake['defines'].append(self.root.MCU.attrib['Family']) + cmake['libs'] = [] + cmake['libs'].append({'name':'opencm3_' + self.root.MCU.attrib['Family'].lower(),'path':'libopencm3/lib'}) + + self.context['cmake'] = cmake + + self.generateFile(self,'CMakeLists.txt') + + print ('Created file CMakeLists.txt') + + def generateFile (self, pathSrc, pathDst='', author='Pegasus', version='v1.0.0', licence='licence.txt', template_dir='../PegasusTemplates'): + + if (pathDst == ''): + pathDst = pathSrc + + self.context['file'] = os.path.basename(pathSrc) + self.context['author'] = author + self.context['date'] = datetime.date.today().strftime('%d, %b %Y') + self.context['version'] = version + self.context['licence'] = licence + + env = Environment(loader=FileSystemLoader(template_dir),trim_blocks=True,lstrip_blocks=True) + template = env.get_template(pathSrc) + + generated_code = template.render(self.context) + + if platform.system() == 'Window': + + with open(pathDst, 'wb') as f: + f.write(generated_code) + + elif platform.system() == 'Linux': + + with open(pathDst, 'wb') as f: + f.write(str.encode(generated_code)) + else: + # Different OS than Windows or Linux + pass + + \ No newline at end of file diff --git a/ewpproject.py b/ewpproject.py index ac12aee..939710c 100644 --- a/ewpproject.py +++ b/ewpproject.py @@ -6,6 +6,7 @@ class EWPProject (object): def __init__(self, path, xmlFile): + self.project = {} self.path = path self.xmlFile = xmlFile xmltree = objectify.parse(xmlFile) @@ -13,15 +14,16 @@ class EWPProject (object): def parseProject(self): - self.projectName = self.root.configuration.name + self.project['name'] = self.root.configuration.name - self.chip = '' + self.project['chip'] = '' - #TODO: parse into tree structure - self.searchGroups(self.root) + #TODO: parse into tree structure + self.project['srcs'] = [] + self.searchGroups(self.root, self.project['srcs']) - self.defines = [] - self.includes = [] + self.project['defs'] = [] + self.project['incs'] = [] for element in self.root.configuration.getchildren(): @@ -30,34 +32,59 @@ class EWPProject (object): if e.tag == 'option': if e.name.text == 'OGChipSelectEditMenu': - self.chip = e.state + self.project['chip'] = e.state elif e.name.text == 'CCDefines': for d in e.getchildren(): if d.tag == 'state' and d.text != None: - self.defines.append(d.text) + self.project['defs'].append(d.text) elif e.name.text == 'CCIncludePath2': for d in e.getchildren(): if d.tag == 'state' and d.text != None: - self.includes.append(d.text) + self.project['incs'].append(d.text) - for i in range(0, len(self.includes)): - self.includes[i] = self.includes[i].replace('$PROJ_DIR$', self.path) + for i in range(0, len(self.project['incs'])): + self.project['incs'][i] = self.project['incs'][i].replace('$PROJ_DIR$', self.path) def displaySummary(self): - print ('Project Name:' + self.projectName) - print ('Project chip:' + self.chip) - print ('Project includes: ' + ' '.join(self.includes)) - print ('Project defines: ' + ' '.join(self.defines)) + print ('Project Name:' + self.project['name']) + print ('Project chip:' + self.project['chip']) + print ('Project includes: ' + ' '.join(self.project['incs'])) + print ('Project defines: ' + ' '.join(self.project['defs'])) - def searchGroups(self, xml): + #print ('Groups: ') + #print (self.sources) + #for src in self.sources: + # self.printGroups(src) + + + def printGroups(self, group): + + print ('Group name:' + group['name']) + + for file in group['files']: + print ('File: ' + file) + + for g in group['groups']: + self.printGroups(g) + + def searchGroups(self, xml, sources): + + group = {} + group['name'] = '' + group['files'] = [] + group['groups'] = [] for element in xml.getchildren(): if element.tag == 'group': - self.searchGroups(element) + group['name'] = element.name + print ('File: ' + group['name']) + self.searchGroups(element,group['groups']) + sources.append(group) elif element.tag == 'file': - print (element.name) + print ('File: ' + element.name) + group['files'].append(element.name) \ No newline at end of file diff --git a/uvprojxproject.py b/uvprojxproject.py index 2dcb414..5c9d90c 100644 --- a/uvprojxproject.py +++ b/uvprojxproject.py @@ -21,7 +21,6 @@ class UVPROJXProject (object): self.sources = [] for element in self.root.Targets.Target.Groups.getchildren(): - print ('GroupName: ' + element.GroupName.text) if hasattr(element,'Files'): for file in element.Files.getchildren():