mirror of
https://github.com/platformio/platformio-core.git
synced 2025-07-30 10:07:14 +02:00
Avoid infinite loop when we've already searched for dependencies
This commit is contained in:
@ -78,10 +78,11 @@ class LibBuilderBase(object):
|
|||||||
|
|
||||||
def __init__(self, env, path):
|
def __init__(self, env, path):
|
||||||
self.env = env.Clone()
|
self.env = env.Clone()
|
||||||
|
self.envorigin = env
|
||||||
self.path = env.subst(path)
|
self.path = env.subst(path)
|
||||||
self._manifest = self.load_manifest()
|
self._manifest = self.load_manifest()
|
||||||
self._is_dependent = False
|
self._is_dependent = False
|
||||||
self._deps = []
|
self._deps = tuple()
|
||||||
self._scanner_visited = tuple()
|
self._scanner_visited = tuple()
|
||||||
self._built_node = None
|
self._built_node = None
|
||||||
|
|
||||||
@ -138,11 +139,6 @@ class LibBuilderBase(object):
|
|||||||
def dependencies(self):
|
def dependencies(self):
|
||||||
return self._deps
|
return self._deps
|
||||||
|
|
||||||
def depends_on(self, lb):
|
|
||||||
assert isinstance(lb, LibBuilderBase)
|
|
||||||
if lb not in self._deps:
|
|
||||||
self._deps.append(lb)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def dependent(self):
|
def dependent(self):
|
||||||
return self._is_dependent
|
return self._is_dependent
|
||||||
@ -192,7 +188,7 @@ class LibBuilderBase(object):
|
|||||||
def _get_found_includes(self, lib_builders, search_paths=None):
|
def _get_found_includes(self, lib_builders, search_paths=None):
|
||||||
inc_dirs = tuple()
|
inc_dirs = tuple()
|
||||||
used_inc_dirs = tuple()
|
used_inc_dirs = tuple()
|
||||||
for lb in [self] + lib_builders:
|
for lb in (self, ) + lib_builders:
|
||||||
items = tuple(self.env.Dir(d) for d in lb.get_inc_dirs())
|
items = tuple(self.env.Dir(d) for d in lb.get_inc_dirs())
|
||||||
if lb.dependent:
|
if lb.dependent:
|
||||||
used_inc_dirs += items
|
used_inc_dirs += items
|
||||||
@ -208,6 +204,17 @@ class LibBuilderBase(object):
|
|||||||
result += (inc, )
|
result += (inc, )
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def depends_on(self, lb, lib_builders, search_paths=None):
|
||||||
|
assert isinstance(lb, LibBuilderBase)
|
||||||
|
if lb not in self._deps:
|
||||||
|
self._deps += (lb, )
|
||||||
|
|
||||||
|
# avoid infinite loop when we've already searched for dependencies
|
||||||
|
for lb_ in lib_builders:
|
||||||
|
if lb in lb_._deps:
|
||||||
|
return
|
||||||
|
lb.search_dependencies(lib_builders, search_paths)
|
||||||
|
|
||||||
def search_dependencies(self, lib_builders, search_paths=None):
|
def search_dependencies(self, lib_builders, search_paths=None):
|
||||||
self._is_dependent = True
|
self._is_dependent = True
|
||||||
lib_inc_map = {}
|
lib_inc_map = {}
|
||||||
@ -221,8 +228,7 @@ class LibBuilderBase(object):
|
|||||||
|
|
||||||
for lb, lb_src_files in lib_inc_map.items():
|
for lb, lb_src_files in lib_inc_map.items():
|
||||||
if lb != self and lb not in self.dependencies:
|
if lb != self and lb not in self.dependencies:
|
||||||
self.depends_on(lb)
|
self.depends_on(lb, lib_builders, lb_src_files)
|
||||||
lb.search_dependencies(lib_builders, lb_src_files)
|
|
||||||
|
|
||||||
def build(self):
|
def build(self):
|
||||||
libs = []
|
libs = []
|
||||||
@ -262,8 +268,7 @@ class ProjectAsLibBuilder(LibBuilderBase):
|
|||||||
for lib_name in self.env.get("LIB_FORCE", []):
|
for lib_name in self.env.get("LIB_FORCE", []):
|
||||||
for lb in lib_builders:
|
for lb in lib_builders:
|
||||||
if lb.name == lib_name and lb not in self.dependencies:
|
if lb.name == lib_name and lb not in self.dependencies:
|
||||||
self.depends_on(lb)
|
self.depends_on(lb, lib_builders)
|
||||||
lb.search_dependencies(lib_builders)
|
|
||||||
break
|
break
|
||||||
return LibBuilderBase.search_dependencies(self, lib_builders,
|
return LibBuilderBase.search_dependencies(self, lib_builders,
|
||||||
search_paths)
|
search_paths)
|
||||||
@ -391,7 +396,7 @@ class PlatformIOLibBuilder(LibBuilderBase):
|
|||||||
|
|
||||||
|
|
||||||
def GetLibBuilders(env):
|
def GetLibBuilders(env):
|
||||||
items = []
|
items = tuple()
|
||||||
env_frameworks = [
|
env_frameworks = [
|
||||||
f.lower().strip() for f in env.get("PIOFRAMEWORK", "").split(",")
|
f.lower().strip() for f in env.get("PIOFRAMEWORK", "").split(",")
|
||||||
]
|
]
|
||||||
@ -421,7 +426,7 @@ def GetLibBuilders(env):
|
|||||||
sys.stderr.write("Framework incompatible library %s\n" %
|
sys.stderr.write("Framework incompatible library %s\n" %
|
||||||
lb.path)
|
lb.path)
|
||||||
continue
|
continue
|
||||||
items.append(lb)
|
items += (lb, )
|
||||||
return items
|
return items
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user