[DEBUG] correct the library dependency order when compile binary or shared object

This commit is contained in:
Edouard DUPIN 2014-06-14 17:11:04 +02:00
parent d4fbbaff70
commit c37eca8168
2 changed files with 131 additions and 44 deletions

View File

@ -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)

View File

@ -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):