meta-st-stm32mp/recipes-extended/m4projects/files/parse_project_config.py

180 lines
3.9 KiB
Python

import os
import sys
import xml.etree.ElementTree as ET
from sys import argv as arg
#
# the goal is to parse SW4STM32 project configs files to get
# list of files to compile
# cflags
# ldflags
print "start"
# arg1: path of the project
prj=arg[1]
# arg2: name of the build configuration
buildconfig=arg[2]
# arg3: root of the compilation
myroot=arg[3]
confdir=myroot+"/out/"+buildconfig+"/conf"
print "prj: "+prj
print "myroot: "+myroot
print "confdir: "+confdir
print "buildconfig: "+buildconfig
os.chdir(prj)
proj_tree = ET.parse(".project")
cproj_tree = ET.parse(".cproject")
#os.chdir(myroot)
if os.path.exists(confdir)!=True:
os.mkdir(confdir)
if prj.find("(")!=-1:
print "bad prj path"
sys.stderr.write("bad prj path: "+prj+"\n")
exit(1)
#
# convert path and checks that path is valid
#
def fullpath(filename):
# get absolute path
p=os.path.abspath(filename);
# workaround: there is a mistake in some projects
p=p.replace("STM32_USB_HOST_Library","STM32_USB_Host_Library")
# some path contain windows style
p=p.replace("\\","/")
# containts space at the end
p=p.replace(" ","")
# check if path is valid
#print "check path: "+p
if os.path.exists(p)!=True:
print "prj: "+prj
print "original path: "+filename
sys.stderr.write("error check path: "+p+" fails\n")
exit(1);
return p
#
# get the source code file list
#
print "file list"
f=open(confdir+"/config.in", 'w')
root = proj_tree.getroot()
f.write("CSRC += \\\n")
for i in root.iter('link'):
a=i.find('locationURI')
if a==None:
a=i.find('location')
if a==None:
print "could not find any file"
exit(1)
if a.text is None:
print "no text"
else:
#print "text:"+a.text
temp=a.text
if ((temp.find(".txt")==-1) & (temp.find(".gdb")==-1) & (temp.find(".launch")==-1) & (temp.find(".sh")==-1) & (temp.find("README")==-1)):
temp=temp.replace("PARENT-1-PROJECT_LOC/", "../")
temp=temp.replace("PARENT-2-PROJECT_LOC/", "../../")
temp=temp.replace("PARENT-3-PROJECT_LOC/", "../../../")
temp=temp.replace("PARENT-4-PROJECT_LOC/", "../../../../")
temp=temp.replace("PARENT-5-PROJECT_LOC/", "../../../../../")
temp=temp.replace("PARENT-6-PROJECT_LOC/", "../../../../../../")
temp=temp.replace("PARENT-7-PROJECT_LOC/", "../../../../../../../")
temp=temp.replace("PROJECT_LOC/", "../")
#print temp
temp=fullpath(temp)
f.write(temp+" \\\n")
f.write("\n")
cflags=""
ldlibs=""
ldscript=""
root = cproj_tree.getroot()
count=0
for j in root.iter('configuration'):
temp=j.get('name')
if temp == buildconfig:
for i in j.iter('option'):
a=i.get('superClass')
if a == 'gnu.c.compiler.option.include.paths':
for j in i.iter('listOptionValue'):
temp=j.get('value')
if temp != "":
temp=temp.replace("\\","/")
#workaround remove first occurency of "../"
temp=temp.replace("../", "",1)
temp=fullpath(temp)
#print temp
cflags=cflags+" -I"+temp+" \\\n"
if a == 'gnu.c.compiler.option.preprocessor.def.symbols':
for j in i.iter('listOptionValue'):
temp=j.get('value')
if temp != "":
#print temp
cflags=cflags+" -D"+temp+" \\\n"
if a == 'fr.ac6.managedbuild.tool.gnu.cross.c.linker.script':
temp=i.get('value')
temp=temp.replace("../", "",1)
temp=fullpath(temp)
#print temp
ldscript=temp
if a == 'gnu.c.link.option.paths':
for j in i.iter('listOptionValue'):
temp=j.get('value')
temp=temp.replace("../", "",1)
temp=fullpath(temp)
ldlibs=ldlibs+" -L"+temp+"/"
if a == 'gnu.c.link.option.libs':
for j in i.iter('listOptionValue'):
temp=j.get('value')
ldlibs=ldlibs+" -l"+temp
#workaround for STM327x6G_EVAL
#cflags=cflags+" -DUSE_IOEXPANDER"
print "cflags="+cflags
f.write("CFLAGS += "+cflags+"\n")
f.write("\n")
print "ldlibs="+ldlibs
f.write("LDLIBS += "+ldlibs+"\n")
f.write("\n")
f.write("LDSCRIPT += "+ldscript+"\n")
f.write("\n")
f.close();
print "exit"