# Dynamic variables

Dynamic variables (interpolations) are useful when you have a custom configuration data between build environments. For examples, extra build_flags or project dependencies lib_deps.

Each variable should have a next format: `${<section>.<option>}`, where `<section>` is a value from `[<section>]` group, and `<option>` is a first item from pair `<option> = value`.

You can inject system environment variable using `sysenv` as a `section`. For example, `${sysenv.HOME}`.

- Variable can be applied only for the option’s value

- Multiple variables are allowed

- The Section [platformio] and Section [env] sections are reserved and could not be used as a custom section. Some good section names might be `extra` or `custom`.

Note

If you need to share common configuration options between build environments, please take a look at “Global scope” in Section [env] or extends option which allows extending of other sections.

Example:

    [env]
    ; Unix
    lib_extra_dirs = ${sysenv.HOME}/Documents/Arduino/libraries
    ; Windows
    lib_extra_dirs = ${sysenv.HOMEDRIVE}${sysenv.HOMEPATH}\Documents\Arduino\libraries

    ; You MUST inject these options into [env:] section
    ; using ${extra.***} (see below)
    [extra]
    build_flags = -D VERSION=1.2.3 -D DEBUG=1
    lib_deps_builtin =
      SPI
      Wire
    lib_deps_external = ArduinoJson@>5.6.0

    [env:uno]
    platform = atmelavr
    framework = arduino
    board = uno
    build_flags = ${extra.build_flags}
    lib_deps =
      ${extra.lib_deps_builtin}
      ${extra.lib_deps_external}

    [env:nodemcuv2]
    platform = espressif8266
    framework = arduino
    board = nodemcuv2
    build_flags = ${extra.build_flags} -Wall
    lib_deps =
      ${extra.lib_deps_builtin}
      ${extra.lib_deps_external}
      PubSubClient@2.6
      OneWire

    ; Keep sensitive data in environment variables
    ;
    ; Unix
    ; export WIFI_SSID='\"my\ ssid\ name\"'
    ; export WIFI_PASS='\"my\ password\"'
    ;
    ; Windows
    ; set WIFI_SSID='"my ssid name"'
    ; set WIFI_PASS='"my password"'

    [env:esp32dev]
    extends = env:nodemcuv2
    platform = espressif32
    board = esp32dev
    build_flags =
      -DWIFI_SSID=${sysenv.WIFI_SSID}
      -DWIFI_PASS=${sysenv.WIFI_PASS}

Warning

Be careful with special characters in system environment variables on Unix systems, especially when they are used as the value for preprocessor directives. Symbols like `$`, `&`, `~`, etc must be explicitly escaped, for example:

    export WIFI_PASS='\"my\~p\&a\\\$\$\$\$word\"'