Add option to configure library Compatible Mode using library.json

This commit is contained in:
Ivan Kravets
2017-11-25 21:51:16 +02:00
parent 5ca472050c
commit 9fc5aecb64
3 changed files with 48 additions and 23 deletions

View File

@ -14,6 +14,8 @@ PlatformIO 3.0
* Improved handling of library dependencies defined as VCS or SemVer in
`Project Configuration File "platformio.ini" <http://docs.platformio.org/en/latest/projectconf/section_env_general.html#platform>`__
(`issue #1155 <https://github.com/platformio/platformio-core/issues/1155>`_)
* Added option to configure library `Compatible Mode <http://docs.platformio.org/en/latest/librarymanager/ldf.html#compatibility-mode>`__
using `library.json <http://docs.platformio.org/page/librarymanager/config.html>`__
* Fixed "Super-Quick (Mac / Linux)" installer script
(`issue #1017 <https://github.com/platformio/platformio-core/issues/1017>`_)
* Fixed issue with "IOError" in VSCode when processing a project

2
docs

Submodule docs updated: 19f487e4c4...d14eee3254

View File

@ -83,6 +83,9 @@ class LibBuilderBase(object):
LDF_MODES = ["off", "chain", "deep", "chain+", "deep+"]
LDF_MODE_DEFAULT = "chain"
COMPAT_MODES = [0, 1, 2]
COMPAT_MODE_DEFAULT = 1
CLASSIC_SCANNER = SCons.Scanner.C.CScanner()
ADVANCED_SCANNER = SCons.Scanner.C.CScanner(advanced=True)
INC_DIRS_CACHE = None
@ -94,8 +97,6 @@ class LibBuilderBase(object):
self.verbose = verbose
self._manifest = manifest if manifest else self.load_manifest()
self._ldf_mode = self.validate_ldf_mode(
self.env.get("LIB_LDF_MODE", self.LDF_MODE_DEFAULT))
self._is_dependent = False
self._is_built = False
self._depbuilders = list()
@ -172,21 +173,15 @@ class LibBuilderBase(object):
def lib_archive(self):
return self.env.get("LIB_ARCHIVE", "") != "false"
@staticmethod
def validate_ldf_mode(mode):
if isinstance(mode, basestring):
mode = mode.strip().lower()
if mode in LibBuilderBase.LDF_MODES:
return mode
try:
return LibBuilderBase.LDF_MODES[int(mode)]
except (IndexError, ValueError):
pass
return LibBuilderBase.LDF_MODE_DEFAULT
@property
def lib_ldf_mode(self):
return self._ldf_mode
return self.validate_ldf_mode(
self.env.get("LIB_LDF_MODE", self.LDF_MODE_DEFAULT))
@property
def lib_compat_mode(self):
return self.validate_compat_mode(
self.env.get("LIB_COMPAT_MODE", self.COMPAT_MODE_DEFAULT))
@property
def depbuilders(self):
@ -200,6 +195,27 @@ class LibBuilderBase(object):
def is_built(self):
return self._is_built
@staticmethod
def validate_ldf_mode(mode):
if isinstance(mode, basestring):
mode = mode.strip().lower()
if mode in LibBuilderBase.LDF_MODES:
return mode
try:
return LibBuilderBase.LDF_MODES[int(mode)]
except (IndexError, ValueError):
pass
return LibBuilderBase.LDF_MODE_DEFAULT
@staticmethod
def validate_compat_mode(mode):
try:
mode = int(mode)
assert mode in LibBuilderBase.COMPAT_MODES
return mode
except (AssertionError, ValueError):
return LibBuilderBase.COMPAT_MODE_DEFAULT
@staticmethod
def items_in_list(items, ilist):
@ -263,7 +279,7 @@ class LibBuilderBase(object):
continue
found = False
for lb in self.envorigin.GetLibBuilders():
for lb in self.env.GetLibBuilders():
if item['name'] != lb.name:
continue
elif "frameworks" in item and \
@ -299,7 +315,7 @@ class LibBuilderBase(object):
# all include directories
if not LibBuilderBase.INC_DIRS_CACHE:
LibBuilderBase.INC_DIRS_CACHE = []
for lb in self.envorigin.GetLibBuilders():
for lb in self.env.GetLibBuilders():
LibBuilderBase.INC_DIRS_CACHE.extend(
[self.env.Dir(d) for d in lb.get_inc_dirs()])
@ -363,7 +379,7 @@ class LibBuilderBase(object):
lib_inc_map = {}
for inc in self._get_found_includes(search_paths):
for lb in self.envorigin.GetLibBuilders():
for lb in self.env.GetLibBuilders():
if inc.get_abspath() in lb:
if lb not in lib_inc_map:
lib_inc_map[lb] = []
@ -391,7 +407,7 @@ class LibBuilderBase(object):
self.env.AppendUnique(CPPPATH=self.get_inc_dirs())
if self.lib_ldf_mode == "off":
for lb in self.envorigin.GetLibBuilders():
for lb in self.env.GetLibBuilders():
if self == lb or not lb.is_built:
continue
for key in ("CPPPATH", "LIBPATH", "LIBS", "LINKFLAGS"):
@ -535,6 +551,13 @@ class PlatformIOLibBuilder(LibBuilderBase):
self._manifest.get("build").get("libLDFMode"))
return LibBuilderBase.lib_ldf_mode.fget(self)
@property
def lib_compat_mode(self):
if "libCompatMode" in self._manifest.get("build", {}):
return self.validate_compat_mode(
self._manifest.get("build").get("libCompatMode"))
return LibBuilderBase.lib_compat_mode.fget(self)
def is_platforms_compatible(self, platforms):
items = self._manifest.get("platforms")
if not items:
@ -602,7 +625,7 @@ class ProjectAsLibBuilder(LibBuilderBase):
pkg_dir = lm.get_package_dir(*lm.parse_pkg_uri(uri))
if not pkg_dir:
continue
for lb in self.envorigin.GetLibBuilders():
for lb in self.env.GetLibBuilders():
if lb.path != pkg_dir:
continue
if lb not in self.depbuilders:
@ -611,7 +634,7 @@ class ProjectAsLibBuilder(LibBuilderBase):
break
if not found:
for lb in self.envorigin.GetLibBuilders():
for lb in self.env.GetLibBuilders():
if lb.name != uri:
continue
if lb not in self.depbuilders:
@ -632,11 +655,11 @@ def GetLibBuilders(env): # pylint: disable=too-many-branches
key=lambda lb: 0 if lb.dependent else 1)
items = []
compat_mode = int(env.get("LIB_COMPAT_MODE", 1))
verbose = int(ARGUMENTS.get("PIOVERBOSE",
0)) and not env.GetOption('clean')
def _check_lib_builder(lb):
compat_mode = lb.lib_compat_mode
if lb.name in env.get("LIB_IGNORE", []):
if verbose:
sys.stderr.write("Ignored library %s\n" % lb.path)