diff --git a/HISTORY.rst b/HISTORY.rst index c9301849..c41b936c 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -41,6 +41,9 @@ PlatformIO 3.0 (`issue #837 `_) * Added new `LDF Modes `__: ``chain+`` and ``deep+`` and set ``chain+`` as default +* Added global ``lib_extra_dirs`` option to ``[platformio]`` section for + `Project Configuration File "platformio.ini" `__ + (`issue #842 `_) * Changed a default exit combination for Device Monitor from ``Ctrl+]`` to ``Ctrl+C`` * Improved detecting of ARM mbed media disk for uploading * Improved Project Generator for CLion IDE when source folder contains nested items diff --git a/docs/projectconf.rst b/docs/projectconf.rst index a353ed85..75a564ed 100644 --- a/docs/projectconf.rst +++ b/docs/projectconf.rst @@ -113,8 +113,8 @@ if :option:`platformio run --environment` option is not specified. :ref:`projectconf_pio_env_default` allows to define environments which should be processed by default. -Multiple environments are allowed if they are separated with ", " -(comma+space). For example. +Multiple environments are allowed if they *are separated with ", " +(comma+space)*. For example. .. code-block:: ini @@ -225,6 +225,21 @@ that folder is located in the root of project. This option can be overridden by global environment variable :envvar:`PLATFORMIO_LIBDEPS_DIR`. +``lib_extra_dirs`` +^^^^^^^^^^^^^^^^^^ + +.. versionadded:: 3.2 + +A list with global extra directories for a project where :ref:`ldf` will look +for libraries. + +This option has the same behavior as :ref:`projectconf_lib_extra_dirs` option +for a specific build environment defined in ``[env:]`` section. The main +difference is that the option that is defined in ``[platofrmio]`` section +will be applied automatically for all ``[env:]`` sections. + +For the possible values and examples please follow to :ref:`projectconf_lib_extra_dirs`. + .. _projectconf_pio_src_dir: ``src_dir`` @@ -381,7 +396,7 @@ Examples: :ref:`frameworks` name. -The multiple frameworks are allowed, split them with comma+space ", ". +The multiple frameworks are allowed, *split them with comma+space ", "*. .. _projectconf_env_board: @@ -735,7 +750,7 @@ Library options Specify project dependencies that should be installed automatically to :ref:`projectconf_pio_libdeps_dir` before environment processing. -Multiple dependencies are allowed (multi-lines or separated with comma+space ", "). +Multiple dependencies are allowed (*multi-lines or separated with comma+space ", "*). If you have multiple build environments that depend on the same libraries, you can use :ref:`projectconf_dynamic_vars` to use common configuration. @@ -784,7 +799,7 @@ Specify libraries which should be ignored by Library Dependency Finder. The correct value for this option is library name (not folder name). In the most cases, library name is pre-defined in manifest file (:ref:`library_config`, ``library.properties``, ``module.json``). The multiple -library names are allowed, split them with comma+space ", ". +library names are allowed, *split them with comma+space ", "*. Example: @@ -803,8 +818,8 @@ Example: Please make sure to read :ref:`ldf` guide first. A list with extra directories/storages where :ref:`ldf` will -look for dependencies. Multiple paths are allowed. Please separate them -using comma+space ", ". +look for dependencies. Multiple paths are allowed. *Please separate them +using comma+space ", "*. This option can be set by global environment variable :envvar:`PLATFORMIO_LIB_EXTRA_DIRS`. @@ -865,8 +880,8 @@ Test options Please make sure to read :ref:`unit_testing` guide first. Ignore :ref:`unit_testing` tests where the name matches specified patterns. -Multiple names are allowed. Please separate them using comma+space ", ". Also, -you can ignore some tests using :option:`platformio test --ignore` command. +Multiple names are allowed. *Please separate them using comma+space ", "*. +Also, you can ignore some tests using :option:`platformio test --ignore` command. .. list-table:: :header-rows: 1 diff --git a/platformio/builder/main.py b/platformio/builder/main.py index 0b19c890..13201f48 100644 --- a/platformio/builder/main.py +++ b/platformio/builder/main.py @@ -126,7 +126,15 @@ for opt in ("PIOFRAMEWORK", "LIB_DEPS", "LIB_IGNORE", "LIB_EXTRA_DIRS"): continue env[opt] = [l.strip() for l in env[opt].split(", ") if l.strip()] +# Configure extra library source directories for LDF +if util.get_project_optional_dir("lib_extra_dirs"): + env.Prepend(LIBSOURCE_DIRS=[ + l.strip() + for l in util.get_project_optional_dir("lib_extra_dirs").split(", ") + if l.strip() + ]) env.Prepend(LIBSOURCE_DIRS=env.get("LIB_EXTRA_DIRS", [])) + env.LoadPioPlatform(commonvars) env.SConscriptChdir(0) diff --git a/platformio/commands/run.py b/platformio/commands/run.py index dee2249b..1ed50edf 100644 --- a/platformio/commands/run.py +++ b/platformio/commands/run.py @@ -345,7 +345,7 @@ def check_project_defopts(config): if not config.has_section("platformio"): return True known = ("home_dir", "lib_dir", "libdeps_dir", "src_dir", "envs_dir", - "data_dir", "test_dir", "env_default") + "data_dir", "test_dir", "env_default", "lib_extra_dirs") unknown = set([k for k, _ in config.items("platformio")]) - set(known) if not unknown: return True diff --git a/platformio/util.py b/platformio/util.py index 9663aeac..b28340b3 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -175,26 +175,33 @@ def pioversion_to_intstr(): return [int(i) for i in vermatch.group(1).split(".")[:3]] -def _get_projconf_option_dir(name, default=None): - _env_name = "PLATFORMIO_%s" % name.upper() - if _env_name in os.environ: - return os.getenv(_env_name) +def get_project_optional_dir(name, default=None): + data = None + var_name = "PLATFORMIO_%s" % name.upper() + if var_name in os.environ: + data = os.getenv(var_name) + else: + try: + config = load_project_config() + if (config.has_section("platformio") and + config.has_option("platformio", name)): + data = config.get("platformio", name) + except exception.NotPlatformIOProject: + pass - try: - config = load_project_config() - if (config.has_section("platformio") and - config.has_option("platformio", name)): - option_dir = config.get("platformio", name) - if option_dir.startswith("~"): - option_dir = expanduser(option_dir) - return abspath(option_dir) - except exception.NotPlatformIOProject: - pass - return default + if not data: + return default + + items = [] + for item in data.split(", "): + if item.startswith("~"): + item = expanduser(item) + items.append(abspath(item)) + return ", ".join(items) def get_home_dir(): - home_dir = _get_projconf_option_dir("home_dir", + home_dir = get_project_optional_dir("home_dir", join(expanduser("~"), ".platformio")) if "windows" in get_systype(): @@ -241,30 +248,30 @@ def is_platformio_project(project_dir=None): def get_projectlib_dir(): - return _get_projconf_option_dir("lib_dir", join(get_project_dir(), "lib")) + return get_project_optional_dir("lib_dir", join(get_project_dir(), "lib")) def get_projectlibdeps_dir(): - return _get_projconf_option_dir("libdeps_dir", + return get_project_optional_dir("libdeps_dir", join(get_project_dir(), ".piolibdeps")) def get_projectsrc_dir(): - return _get_projconf_option_dir("src_dir", join(get_project_dir(), "src")) + return get_project_optional_dir("src_dir", join(get_project_dir(), "src")) def get_projecttest_dir(): - return _get_projconf_option_dir("test_dir", + return get_project_optional_dir("test_dir", join(get_project_dir(), "test")) def get_projectboards_dir(): - return _get_projconf_option_dir("boards_dir", + return get_project_optional_dir("boards_dir", join(get_project_dir(), "boards")) def get_projectpioenvs_dir(force=False): - path = _get_projconf_option_dir("envs_dir", + path = get_project_optional_dir("envs_dir", join(get_project_dir(), ".pioenvs")) try: if not isdir(path): @@ -283,7 +290,7 @@ URL=http://docs.platformio.org/en/stable/projectconf.html#envs-dir def get_projectdata_dir(): - return _get_projconf_option_dir("data_dir", + return get_project_optional_dir("data_dir", join(get_project_dir(), "data"))