| # Visual Studio Code Development |
| |
| [Visual Studio Code](https://code.visualstudio.com/) is a great and simple IDE |
| that can be used to build & develop with for Matter. |
| |
| Matter supports the docker / remote container workflow in Visual Studio Code, |
| and has a container environment setup automatically. You can read more about |
| this workflow [here](https://code.visualstudio.com/docs/remote/containers). |
| |
| Tested on: |
| |
| - macOS 10.5 |
| - Windows 10 Pro + WSL + Ubuntu 18 LTS |
| - Linux - Fedora Core 35 distribution |
| |
| ## Setup Steps |
| |
| 1. _Windows Only_ Enable the Windows Subsystem for Linux (WSL) following |
| instructions here: |
| <https://docs.microsoft.com/en-us/windows/wsl/install-win10> |
| 1. _Windows Only_ Install Ubuntu from the Windows App Store here: |
| <https://www.microsoft.com/en-us/p/ubuntu-1804-lts/9n9tngvndl3q> |
| 1. Install [Docker](https://www.docker.com/) for your operating system of choice |
| from here: <https://docs.docker.com/engine/install> |
| 1. Install [Visual Studio Code](https://code.visualstudio.com/) for your |
| operating system of choice here: <https://code.visualstudio.com/Download> |
| 1. Install [Git](https://git-scm.com/) if you haven't already |
| 1. _Windows Only_ Enable git to use LF instead of CLRF by default: |
| `git config --global core.autocrlf false` |
| 1. Git clone the main Matter repository here: |
| <https://github.com/project-chip/connectedhomeip> |
| 1. Launch Visual Studio Code, and open the cloned folder from above |
| 1. Install the |
| [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) |
| extension for Visual Studio Code, this extension allows you to use docker |
| containers as a development backend. |
| 1. Once this is installed, you'll be prompted to reload Visual Studio Code, do |
| so |
| 1. At the bottom right of your Visual Studio Code window you should have a new |
| box prompting you to re-open the window as a container. Hit yes. |
| 1. _Windows Only_ Update your Visual Studio Code settings as documented here: |
| https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration |
| to use Bash on Ubuntu (on Windows) eg: |
| `"terminal.integrated.shell.windows": "C:\\Windows\\System32\\bash.exe"` |
| 1. Now your local machine is building a docker image that has all the tools |
| necessary to build and test Matter. This can take some time, but will |
| eventually complete and open up the source tree |
| |
| ## Bootstrapping your source tree (one time) |
| |
| 1. Under the "Terminal" menu (or using another shortcut to the same tool), |
| select "Run Task..." |
| 1. Select the "Bootstrap" task |
| |
| ## Building the Source Tree |
| |
| 1. Under the "Terminal" menu select "Run Build Task..." |
| |
| ## Tasks |
| |
| Located in the [tasks json](../.vscode/tasks.json) file you'll find a list of |
| tasks that can be run from the "Run Task..." command. Example tasks are "Clean", |
| "Run Pretty Check" |
| |
| Developers are encouraged to add tasks to the |
| [tasks json](../.vscode/tasks.json) over time to make sure everyone is using the |
| same base configuration and build. |
| |
| ### Current base tasks are listed here |
| |
| - Main Build - Build the default configuration (i.e., Linux OpenSSL) |
| - Run Unit and Functional Tests - Test the default configuration |
| - Build & Test (all) - Build & Test various configurations (Linux variants, |
| Android, EFR32) |
| - Update compilation database - Update the database used by IntelliSense |
| (needed for cross references, completion) |
| - Bootstrap - On a clean tree, pull in the third party dependencies required |
| - Clean Output - Remove build artifacts |
| - Clean Tree - Full (and destructive) git clean of the tree |
| |
| ## Launch Tasks |
| |
| Located in the [launch json](../.vscode/launch.json) file you'll find a list of |
| build & run jobs that can be run from the "Run" tab and start a run or debug |
| session. |
| |
| Developers are encouraged to add tasks to the |
| [launch json](../.vscode/launch.json) over time to make sure everyone is using |
| the same base debugging setup. |
| |
| ## Submitting a Pull Request - Practical Advice |
| |
| ### Before submitting a PR, make sure these commands run and succeed |
| |
| - Run task: "Build & Test (all)" |
| |
| ## Common Issues |
| |
| - [Missing Git credential](https://code.visualstudio.com/docs/remote/containers#_sharing-git-credentials-with-your-container) |
| - [Missing Git SSH keys](https://code.visualstudio.com/docs/remote/containers#_sharing-git-credentials-with-your-container) |
| - [Using GPG signing keys](https://github.com/microsoft/vscode-remote-release/issues/72) |
| |
| ## Docker FAQ |
| |
| ### DNS problem: can't resolve archive.ubuntu.com |
| |
| A common problem encountered is that a container can't resolve |
| `archive.ubuntu.com` and can't install anything via `apt-get`, during the |
| creation of the container image, resulting in an error like: |
| |
| ``` |
| E: Package 'locales' has no installation candidate |
| The command '/bin/sh -c apt-get install -y locales && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8' returned a non-zero code: 100 |
| ``` |
| |
| Most common reason for this is that the DNS for docker daemon has not been set |
| up correctly and is simply using a default: 8.8.8.8, which in many corporate or |
| more secure environments is not accessible. A typical solution for this is to |
| put a following key/value into your system-wide docker `daemon.json` (Typically |
| located under `/etc/docker/daemon.json` on a Linux system): |
| |
| ``` |
| "dns": ["<<IP ADDRESS OF YOUR NAMESERVER>>", "8.8.8.8"] |
| ``` |
| |
| You can obtain the address you should put into that line of your nameserver by |
| running: |
| |
| ``` |
| nmcli dev show | grep 'IP4.DNS' |
| ``` |
| |
| After you update the dns, you should restart docker, specific to your system. On |
| a typical Linux workstation, you do this via: |
| |
| ``` |
| sudo service docker restart |
| ``` |
| |
| Alternatively, you can also pass the `--dns` argument to your docker daemon, but |
| creating a `daemon.json` and following the above method will solve the problem |
| system-wide. |
| |
| ## Visual Studio Code FAQ |
| |
| - _Highly_ recommend you read through |
| [this page](https://code.visualstudio.com/docs/getstarted/settings) to learn |
| how to configure Visual Studio Code to suit your style: |
| <https://code.visualstudio.com/docs/getstarted/settings> |
| - Great primer set of videos |
| [here](https://code.visualstudio.com/docs/getstarted/introvideos) |
| <https://code.visualstudio.com/docs/getstarted/introvideos> |
| |
| ## Visual Studio Code Recommended Settings |
| |
| - Configure the editor to format on save, in your Visual Studio Code Settings: |
| `"editor.formatOnSave": true` |
| - Configure the clang-format extension `@ext:xaver.clang-format`, it is |
| installed in the docker container. Make sure all languages are enabled |