[DEBUG] correct the library dependency order when compile binary or shared object
This commit is contained in:
parent
d4fbbaff70
commit
c37eca8168
141
lutinHeritage.py
141
lutinHeritage.py
@ -3,9 +3,106 @@ import sys
|
|||||||
import lutinDebug as debug
|
import lutinDebug as debug
|
||||||
|
|
||||||
|
|
||||||
|
def append_to_list(listout, list):
|
||||||
|
if type(list) == type(str()):
|
||||||
|
if list not in listout:
|
||||||
|
listout.append(list)
|
||||||
|
else:
|
||||||
|
# mulyiple imput in the list ...
|
||||||
|
for elem in list:
|
||||||
|
if elem not in listout:
|
||||||
|
listout.append(elem)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class HeritageList:
|
||||||
|
def __init__(self, heritage = None):
|
||||||
|
self.flags_ld=[]
|
||||||
|
self.flags_cc=[]
|
||||||
|
self.flags_xx=[]
|
||||||
|
self.flags_m=[]
|
||||||
|
self.flags_mm=[]
|
||||||
|
# sources list:
|
||||||
|
self.src=[]
|
||||||
|
self.path=[]
|
||||||
|
|
||||||
|
self.listHeritage=[]
|
||||||
|
if heritage != None:
|
||||||
|
self.add_heritage(heritage)
|
||||||
|
|
||||||
|
def add_heritage(self, heritage):
|
||||||
|
if type(heritage) == type(None) or heritage.name == "":
|
||||||
|
return
|
||||||
|
for element in self.listHeritage:
|
||||||
|
if element.name == heritage.name:
|
||||||
|
return
|
||||||
|
self.listHeritage.append(heritage)
|
||||||
|
self.regenerateTree()
|
||||||
|
|
||||||
|
def add_heritage_list(self, heritage_list):
|
||||||
|
if type(heritage_list) == type(None):
|
||||||
|
return
|
||||||
|
for herit in heritage_list.listHeritage:
|
||||||
|
find = False
|
||||||
|
for element in self.listHeritage:
|
||||||
|
if element.name == herit.name:
|
||||||
|
find = True
|
||||||
|
if find == False:
|
||||||
|
self.listHeritage.append(herit)
|
||||||
|
self.regenerateTree()
|
||||||
|
|
||||||
|
def regenerateTree(self):
|
||||||
|
self.flags_ld=[]
|
||||||
|
self.flags_cc=[]
|
||||||
|
self.flags_xx=[]
|
||||||
|
self.flags_m=[]
|
||||||
|
self.flags_mm=[]
|
||||||
|
# sources list:
|
||||||
|
self.src=[]
|
||||||
|
self.path=[]
|
||||||
|
# reorder heritage list :
|
||||||
|
listHeritage = self.listHeritage
|
||||||
|
self.listHeritage = []
|
||||||
|
# first step : add all lib with no dependency:
|
||||||
|
for herit in listHeritage:
|
||||||
|
if len(herit.depends) == 0:
|
||||||
|
self.listHeritage.append(herit)
|
||||||
|
listHeritage.remove(herit)
|
||||||
|
while len(listHeritage) > 0:
|
||||||
|
currentHeritageSize = len(listHeritage)
|
||||||
|
debug.verbose("list heritage = " + str([[x.name, x.depends] for x in listHeritage]))
|
||||||
|
# Add element only when all dependence are resolved
|
||||||
|
for herit in listHeritage:
|
||||||
|
listDependsName = [y.name for y in self.listHeritage]
|
||||||
|
if all(x in listDependsName for x in herit.depends) == True:
|
||||||
|
listHeritage.remove(herit)
|
||||||
|
self.listHeritage.append(herit)
|
||||||
|
if currentHeritageSize == len(listHeritage):
|
||||||
|
debug.warning("Not resolve dependency between the library ==> can be a cyclic dependency !!!")
|
||||||
|
for herit in listHeritage:
|
||||||
|
self.listHeritage.append(herit)
|
||||||
|
listHeritage = []
|
||||||
|
debug.warning("new heritage list:")
|
||||||
|
for element in self.listHeritage:
|
||||||
|
debug.warning(" " + element.name + " " + str(element.depends))
|
||||||
|
debug.verbose("new heritage list:")
|
||||||
|
for element in self.listHeritage:
|
||||||
|
debug.verbose(" " + element.name + " " + str(element.depends))
|
||||||
|
for element in reversed(self.listHeritage):
|
||||||
|
append_to_list(self.flags_ld, element.flags_ld)
|
||||||
|
append_to_list(self.flags_cc, element.flags_cc)
|
||||||
|
append_to_list(self.flags_xx, element.flags_xx)
|
||||||
|
append_to_list(self.flags_m, element.flags_m)
|
||||||
|
append_to_list(self.flags_mm, element.flags_mm)
|
||||||
|
append_to_list(self.path, element.path)
|
||||||
|
append_to_list(self.src, element.src)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class heritage:
|
class heritage:
|
||||||
def __init__(self, module):
|
def __init__(self, module):
|
||||||
|
self.name=""
|
||||||
|
self.depends=[]
|
||||||
## Remove all variable to prevent error of multiple definition
|
## Remove all variable to prevent error of multiple definition
|
||||||
# all the parameter that the upper classe need when build
|
# all the parameter that the upper classe need when build
|
||||||
self.flags_ld=[]
|
self.flags_ld=[]
|
||||||
@ -21,47 +118,35 @@ class heritage:
|
|||||||
|
|
||||||
if type(module) != type(None):
|
if type(module) != type(None):
|
||||||
# all the parameter that the upper classe need when build
|
# all the parameter that the upper classe need when build
|
||||||
self.flags_ld=module.export_flags_ld
|
self.name = module.name
|
||||||
self.flags_cc=module.export_flags_cc
|
self.depends = module.depends
|
||||||
self.flags_xx=module.export_flags_xx
|
self.flags_ld = module.export_flags_ld
|
||||||
self.flags_m=module.export_flags_m
|
self.flags_cc = module.export_flags_cc
|
||||||
self.flags_mm=module.export_flags_mm
|
self.flags_xx = module.export_flags_xx
|
||||||
self.path=module.export_path
|
self.flags_m = module.export_flags_m
|
||||||
|
self.flags_mm = module.export_flags_mm
|
||||||
def append_and_check(self, listout, newElement):
|
self.path = module.export_path
|
||||||
for element in listout:
|
|
||||||
if element==newElement:
|
|
||||||
return
|
|
||||||
listout.append(newElement)
|
|
||||||
|
|
||||||
def append_to_internalList(self, listout, list):
|
|
||||||
if type(list) == type(str()):
|
|
||||||
self.append_and_check(listout, list)
|
|
||||||
else:
|
|
||||||
# mulyiple imput in the list ...
|
|
||||||
for elem in list:
|
|
||||||
self.append_and_check(listout, elem)
|
|
||||||
|
|
||||||
def add_flag_LD(self, list):
|
def add_flag_LD(self, list):
|
||||||
self.append_to_internalList(self.flags_ld, list)
|
append_to_list(self.flags_ld, list)
|
||||||
|
|
||||||
def add_flag_CC(self, list):
|
def add_flag_CC(self, list):
|
||||||
self.append_to_internalList(self.flags_cc, list)
|
append_to_list(self.flags_cc, list)
|
||||||
|
|
||||||
def add_flag_XX(self, list):
|
def add_flag_XX(self, list):
|
||||||
self.append_to_internalList(self.flags_xx, list)
|
append_to_list(self.flags_xx, list)
|
||||||
|
|
||||||
def add_flag_M(self, list):
|
def add_flag_M(self, list):
|
||||||
self.append_to_internalList(self.flags_m, list)
|
append_to_list(self.flags_m, list)
|
||||||
|
|
||||||
def add_flag_MM(self, list):
|
def add_flag_MM(self, list):
|
||||||
self.append_to_internalList(self.flags_mm, list)
|
append_to_list(self.flags_mm, list)
|
||||||
|
|
||||||
def add_import_path(self, list):
|
def add_import_path(self, list):
|
||||||
self.append_to_internalList(self.path, list)
|
append_to_list(self.path, list)
|
||||||
|
|
||||||
def add_sources(self, list):
|
def add_sources(self, list):
|
||||||
self.append_to_internalList(self.src, list)
|
append_to_list(self.src, list)
|
||||||
|
|
||||||
def need_update(self, list):
|
def need_update(self, list):
|
||||||
self.hasBeenUpdated=True
|
self.hasBeenUpdated=True
|
||||||
@ -70,7 +155,7 @@ class heritage:
|
|||||||
if type(other) == type(None):
|
if type(other) == type(None):
|
||||||
debug.verbose("input of the heriatege class is None !!!")
|
debug.verbose("input of the heriatege class is None !!!")
|
||||||
return
|
return
|
||||||
if other.hasBeenUpdated==True:
|
if other.hasBeenUpdated == True:
|
||||||
self.hasBeenUpdated = True
|
self.hasBeenUpdated = True
|
||||||
self.add_flag_LD(other.flags_ld)
|
self.add_flag_LD(other.flags_ld)
|
||||||
self.add_flag_CC(other.flags_cc)
|
self.add_flag_CC(other.flags_cc)
|
||||||
|
@ -425,7 +425,9 @@ class Module:
|
|||||||
def build(self, target, packageName):
|
def build(self, target, packageName):
|
||||||
# ckeck if not previously build
|
# ckeck if not previously build
|
||||||
if target.is_module_build(self.name)==True:
|
if target.is_module_build(self.name)==True:
|
||||||
return self.localHeritage
|
return self.subHeritageList
|
||||||
|
# create the packege heritage
|
||||||
|
self.localHeritage = heritage.heritage(self)
|
||||||
|
|
||||||
if packageName==None \
|
if packageName==None \
|
||||||
and ( self.type=="BINARY" \
|
and ( self.type=="BINARY" \
|
||||||
@ -438,11 +440,11 @@ class Module:
|
|||||||
|
|
||||||
# build dependency befor
|
# build dependency befor
|
||||||
listSubFileNeededTobuild = []
|
listSubFileNeededTobuild = []
|
||||||
subHeritage = heritage.heritage(None)
|
self.subHeritageList = heritage.HeritageList()
|
||||||
for dep in self.depends:
|
for dep in self.depends:
|
||||||
inherit = target.build(dep, packageName)
|
inheritList = target.build(dep, packageName)
|
||||||
# add at the heritage list :
|
# add at the heritage list :
|
||||||
subHeritage.add_sub(inherit)
|
self.subHeritageList.add_heritage_list(inheritList)
|
||||||
|
|
||||||
# build local sources
|
# build local sources
|
||||||
for file in self.src:
|
for file in self.src:
|
||||||
@ -450,7 +452,7 @@ class Module:
|
|||||||
fileExt = file.split(".")[-1]
|
fileExt = file.split(".")[-1]
|
||||||
if fileExt == "c" \
|
if fileExt == "c" \
|
||||||
or fileExt == "C":
|
or fileExt == "C":
|
||||||
resFile = self.compile_cc_to_o(file, packageName, target, subHeritage)
|
resFile = self.compile_cc_to_o(file, packageName, target, self.subHeritageList)
|
||||||
listSubFileNeededTobuild.append(resFile)
|
listSubFileNeededTobuild.append(resFile)
|
||||||
elif fileExt == "cpp" \
|
elif fileExt == "cpp" \
|
||||||
or fileExt == "CPP" \
|
or fileExt == "CPP" \
|
||||||
@ -458,15 +460,15 @@ class Module:
|
|||||||
or fileExt == "CXX" \
|
or fileExt == "CXX" \
|
||||||
or fileExt == "xx" \
|
or fileExt == "xx" \
|
||||||
or fileExt == "XX":
|
or fileExt == "XX":
|
||||||
resFile = self.compile_xx_to_o(file, packageName, target, subHeritage)
|
resFile = self.compile_xx_to_o(file, packageName, target, self.subHeritageList)
|
||||||
listSubFileNeededTobuild.append(resFile)
|
listSubFileNeededTobuild.append(resFile)
|
||||||
elif fileExt == "mm" \
|
elif fileExt == "mm" \
|
||||||
or fileExt == "MM":
|
or fileExt == "MM":
|
||||||
resFile = self.compile_mm_to_o(file, packageName, target, subHeritage)
|
resFile = self.compile_mm_to_o(file, packageName, target, self.subHeritageList)
|
||||||
listSubFileNeededTobuild.append(resFile)
|
listSubFileNeededTobuild.append(resFile)
|
||||||
elif fileExt == "m" \
|
elif fileExt == "m" \
|
||||||
or fileExt == "M":
|
or fileExt == "M":
|
||||||
resFile = self.compile_m_to_o(file, packageName, target, subHeritage)
|
resFile = self.compile_m_to_o(file, packageName, target, self.subHeritageList)
|
||||||
listSubFileNeededTobuild.append(resFile)
|
listSubFileNeededTobuild.append(resFile)
|
||||||
else:
|
else:
|
||||||
debug.verbose(" TODO : gcc " + self.originFolder + "/" + file)
|
debug.verbose(" TODO : gcc " + self.originFolder + "/" + file)
|
||||||
@ -478,10 +480,10 @@ class Module:
|
|||||||
# nothing to add ==> just dependence
|
# nothing to add ==> just dependence
|
||||||
None
|
None
|
||||||
elif self.type=='LIBRARY':
|
elif self.type=='LIBRARY':
|
||||||
resFile = self.link_to_a(listSubFileNeededTobuild, packageName, target, subHeritage)
|
resFile = self.link_to_a(listSubFileNeededTobuild, packageName, target, self.subHeritageList)
|
||||||
self.localHeritage.add_sources(resFile)
|
self.localHeritage.add_sources(resFile)
|
||||||
elif self.type=='BINARY':
|
elif self.type=='BINARY':
|
||||||
resFile = self.link_to_bin(listSubFileNeededTobuild, packageName, target, subHeritage)
|
resFile = self.link_to_bin(listSubFileNeededTobuild, packageName, target, self.subHeritageList)
|
||||||
# generate tree for this special binary
|
# generate tree for this special binary
|
||||||
target.clean_module_tree()
|
target.clean_module_tree()
|
||||||
self.build_tree(target, self.name)
|
self.build_tree(target, self.name)
|
||||||
@ -489,9 +491,9 @@ class Module:
|
|||||||
elif self.type=="PACKAGE":
|
elif self.type=="PACKAGE":
|
||||||
if target.name=="Android":
|
if target.name=="Android":
|
||||||
# special case for android wrapper :
|
# special case for android wrapper :
|
||||||
resFile = self.link_to_so(listSubFileNeededTobuild, packageName, target, subHeritage, "libewol")
|
resFile = self.link_to_so(listSubFileNeededTobuild, packageName, target, self.subHeritageList, "libewol")
|
||||||
else:
|
else:
|
||||||
resFile = self.link_to_bin(listSubFileNeededTobuild, packageName, target, subHeritage)
|
resFile = self.link_to_bin(listSubFileNeededTobuild, packageName, target, self.subHeritageList)
|
||||||
target.clean_module_tree()
|
target.clean_module_tree()
|
||||||
# generate tree for this special binary
|
# generate tree for this special binary
|
||||||
self.build_tree(target, self.name)
|
self.build_tree(target, self.name)
|
||||||
@ -502,9 +504,9 @@ class Module:
|
|||||||
else:
|
else:
|
||||||
debug.error("Dit not know the element type ... (impossible case) type=" + self.type)
|
debug.error("Dit not know the element type ... (impossible case) type=" + self.type)
|
||||||
|
|
||||||
self.localHeritage.add_sub(subHeritage)
|
self.subHeritageList.add_heritage(self.localHeritage)
|
||||||
# return local dependency ...
|
# return local dependency ...
|
||||||
return self.localHeritage
|
return self.subHeritageList
|
||||||
|
|
||||||
# call here to build the module
|
# call here to build the module
|
||||||
def build_tree(self, target, packageName):
|
def build_tree(self, target, packageName):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user