| [Dependencies](#dependencies) | 
 |  | 
 | [Getting the source](#source) | 
 |  | 
 | [Building](#building) | 
 |  | 
 | [Testing](#testing) | 
 |  | 
 | [Building the standalone VM only](#standalone) | 
 |  | 
 | <a id="dependencies"></a> | 
 |  | 
 | # Dependencies | 
 |  | 
 | ## Python  | 
 |  | 
 | Dart SDK requires Python 3 to build.  | 
 |  | 
 | On Windows you should ensure that `python.bat` wrapper from `depot_tools` comes ahead of any other python binaries in your `PATH` as per [these](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_get_depot_tools) instructions. There are still some steps that require python2 on Windows for now, but Python 3 also has to be available in the path. | 
 |  | 
 | ## Linux | 
 |  | 
 | Install build tools: | 
 |  | 
 | ```bash | 
 | sudo apt-get install git python3 curl xz-utils | 
 | ``` | 
 |  | 
 | Install Chromium's [depot tools](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up): | 
 |  | 
 | ```bash | 
 | git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git | 
 | export PATH="$PATH:$PWD/depot_tools" | 
 | ``` | 
 |  | 
 | ## Mac OS X | 
 |  | 
 | Install XCode. | 
 | > If you encounter the error: `xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance`, run the command:  | 
 | > ``` | 
 | > sudo xcode-select -s /Applications/Xcode.app/Contents/Developer | 
 | > ``` | 
 | > See https://stackoverflow.com/questions/17980759. | 
 |  | 
 | Install Chromium's [depot tools](http://dev.chromium.org/developers/how-tos/install-depot-tools): | 
 | ```bash | 
 | git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git | 
 | export PATH="$PATH:$PWD/depot_tools" | 
 | ``` | 
 |  | 
 | ## Windows | 
 |  | 
 | [Install Visual Studio](https://chromium.googlesource.com/chromium/src/+/main/docs/windows_build_instructions.md#visual-studio) (2017 or newer). Make sure to install "Desktop development with C++" component.  | 
 |  | 
 | You must have Windows 10 SDK installed. This can be installed separately or by checking the appropriate box in the Visual Studio Installer. | 
 |  | 
 | The SDK Debugging Tools must also be installed. If the Windows 10 SDK was installed via the Visual Studio installer, then they can be installed by going to: Control Panel → Programs → Programs and Features → Select the "Windows Software Development Kit" → Change → Change → Check "Debugging Tools For Windows" → Change. Or, you can download the standalone SDK installer and use it to install the Debugging Tools.  | 
 |  | 
 | Install Chromium's depot tools following [this](http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up) or [this](https://chromium.googlesource.com/chromium/src/+/main/docs/windows_build_instructions.md#install) instructions. | 
 |  | 
 | **Important:** If you are not a Googler make sure to set `DEPOT_TOOLS_WIN_TOOLCHAIN` system variable to `0` otherwise depot tools will attempt to pull down a Google-internal toolchain instead of using a local installation of Visual Studio. | 
 |  | 
 | <a id="source"></a> | 
 |  | 
 | # Getting the source | 
 |  | 
 | > [!NOTE]  | 
 | > Googlers only: add this to your ~/.gitconfig file _before_ running `fetch dart`: | 
 | > ``` | 
 | > # Googlers need this in ~/.gitconfig or the checkout won't work correctly. | 
 | > [url "sso://dart/"] | 
 | >     insteadOf = https://dart.googlesource.com/ | 
 | >     insteadOf = https://dart-review.googlesource.com/ | 
 | >     insteadOf = http://dart.googlesource.com/ | 
 | >     insteadOf = http://dart-review.googlesource.com/ | 
 | > ``` | 
 |  | 
 | You can choose whatever name you want for the directory to check dart out in, here it is called `dart-sdk`. | 
 |  | 
 | ```bash | 
 | mkdir dart-sdk | 
 | cd dart-sdk | 
 | # On Windows, this needs to be run in a shell with Administrator rights. | 
 | fetch dart | 
 | ``` | 
 |  | 
 | Dart SDK uses `gclient` to manage dependencies which are described in the `DEPS` file. If you switch branches or update `sdk` checkout you need to run `gclient sync` to bring dependencies in sync with the SDK version. | 
 |  | 
 | Note: If you do not have emscripten, you can update your `.gclient` file to pull emscripten: | 
 | ``` | 
 |     "custom_vars": { | 
 |       "download_emscripten": True, | 
 |     }, | 
 | ``` | 
 |  | 
 | <a id="building"></a> | 
 |  | 
 | # Building | 
 |  | 
 | **IMPORTANT: You must follow instructions for [Getting the source](#source) before attempting to build. Just cloning a GitHub repo or downloading and unpacking a ZIP of the SDK repository would not work.** | 
 |  | 
 | Build the 64-bit SDK: | 
 |  | 
 | ```bash | 
 | # From within the "dart-sdk" directory. | 
 | cd sdk | 
 | ./tools/build.py --mode release --arch x64 create_sdk | 
 | ``` | 
 |  | 
 | The output will be in `out/ReleaseX64/dart-sdk` on Linux and Windows, and `xcodebuild/ReleaseX64/dart-sdk` on macOS. | 
 |  | 
 | Build the 32-bit SDK: | 
 |  | 
 | ```bash | 
 | # From within the "dart-sdk" directory. | 
 | cd sdk | 
 | ./tools/build.py --mode release --arch ia32 create_sdk | 
 | ``` | 
 | The output will be in `out/ReleaseIA32/dart-sdk` on Linux and Windows, or `xcodebuild/ReleaseIA32/dart-sdk` on macOS. | 
 |  | 
 | See also [Building Dart SDK for ARM or RISC-V](Building-Dart-SDK-for-ARM-or-RISC-V.md). | 
 |  | 
 | ## Tips | 
 |  | 
 | By default the build and test scripts select the debug binaries. You can build and test the release version of the VM by specifying `--mode=release` or both debug and release by specifying `--mode=all` on the respective `build.py` and `test.py` command lines.  This can be shortened to `-mrelease` or `-m release`, and the architecture can be specified with `--arch=x64` or `-a x64`, the default.  Other architectures, like `ia32`, `arm`, and `arm64` are also supported. | 
 |  | 
 | We recommend that you use a local file system at least for the output of the builds. The output directory is `out` on linux, `xcodebuild` on macOS, and `build` on Windows.  If your code is in some NFS partition, you can link the `out` directory to a local directory: | 
 | ```bash | 
 |  | 
 | $ cd sdk/ | 
 | $ mkdir -p /usr/local/dart-out/ | 
 | $ ln -s -f /usr/local/dart-out/ out | 
 | ``` | 
 |  | 
 | ### Notification when build is done | 
 |  | 
 | The environment variable `DART_BUILD_NOTIFICATION_DELAY` controls if `build.py` displays a notification when the build is done. If a build takes longer than `DART_BUILD_NOTIFICATION_DELAY` a notification will be displayed. | 
 |  | 
 | A notification is a small transient non-modal window, for now, only supported on Mac and Linux. | 
 |  | 
 | ## Special note for Windows users using Visual Studio Community Edition: | 
 | Your Visual Studio executable command may have a different name from the standard Visual Studio installations. You can specify the name for that executable by passing the additional flag "--executable=$VS\_EXECUTABLE\_NAME" to build.py. The executable name will probably be something like "VSExpress.exe". | 
 |  | 
 | ## Building on Windows with Visual Studio 2015 | 
 | Gyp should autodetect the version of Visual Studio you have, and produce solution files in the correct format. | 
 | If this is not happening, then set environment variable `gyp_msvs_version` to `2015`. | 
 |  | 
 | For example, this will produce Visual Studio 2015-compliant solution files: | 
 | ```bash | 
 | set gyp_msvs_version=2015 | 
 | gclient runhooks | 
 | ``` | 
 |  | 
 | # Testing | 
 |  | 
 | All tests are executed using the `test.py` script under `tools/`.  You need to use `build.py` to build the `most` and `run_ffi_unit_tests` targets before testing, e.g. | 
 | ```bash | 
 | $ ./tools/build.py --mode release --arch ia32 most run_ffi_unit_tests | 
 | ``` | 
 |  | 
 | Now you can run all tests as follows (Safari, Firefox, Chrome, and IE must be installed, if you want to run the tests on them): | 
 | ```bash | 
 | $ ./tools/test.py -mrelease --arch=ia32 --compiler=dartk,dart2js --runtime=vm,d8,chrome,firefox,[safari,ie10] | 
 | ``` | 
 | Specify the compiler used (optional -- only necessary if you are compiling to JavaScript (required for most browsers), the default is "none") and a runtime (where the code will be run). | 
 |  | 
 | You can run a specific test by specifying its full name or a prefix. For instance, the following runs only tests from the core libraries: | 
 | ```bash | 
 | $ ./tools/test.py -mrelease --arch=ia32 --runtime=vm corelib | 
 | ``` | 
 | The following runs a single test: | 
 | ```bash | 
 | $ ./tools/test.py -mrelease --arch=ia32 --runtime=vm corelib/ListTest | 
 | ``` | 
 |  | 
 | Make sure to run tests using the release VM if you have built the release VM, and for the same architecture as you have built. | 
 |  | 
 | See also [Testing Dart2js](Testing-Dart2js.md) for dart2js specific examples. | 
 |  | 
 | ## Complex examples | 
 |  | 
 | Adjust the flags to your needs: appropriate values for `--arch` and `--tasks` will depend on your system.  The below examples are taken from a 12 core x86\_64 system. | 
 |  | 
 | Dart analyzer tests example: | 
 | ```bash | 
 | ./tools/test.py \ | 
 |   --compiler dart2analyzer \ | 
 |   --runtime none \ | 
 |   --progress color \ | 
 |   --arch x64 \ | 
 |   --mode release \ | 
 |   --report \ | 
 |   --time \ | 
 |   --tasks 6 \ | 
 |   language | 
 | ``` | 
 |  | 
 | VM tests example: | 
 | ```bash | 
 | ./tools/test.py \ | 
 |   --compiler none \ | 
 |   --runtime vm \ | 
 |   --progress color \ | 
 |   --arch x64 \ | 
 |   --mode release \ | 
 |   --checked \ | 
 |   --report \ | 
 |   --time \ | 
 |   --tasks 6 \ | 
 |   language | 
 | ``` | 
 |  | 
 | Dart2JS example: | 
 | ```bash | 
 | ./tools/test.py \ | 
 |   --compiler dart2js \ | 
 |   --runtime chrome \ | 
 |   --progress color \ | 
 |   --arch x64 \ | 
 |   --mode release \ | 
 |   --checked \ | 
 |   --report \ | 
 |   --time \ | 
 |   --tasks 6 \ | 
 |   language | 
 | ``` | 
 |  | 
 | ## Troubleshooting and tips for browser tests | 
 | To debug a browser test failure, you must start a local http server to serve the test.  This is made easy with a helper script in dart/tools/testing.  The error report from test.py gives the command line to start the server in a message that reads: | 
 | ```bash | 
 | To retest, run:  /usr/local/[...]/dart/tools/testing/bin/linux/dart /usr/local/[...]/dart/tools/testing/dart/http_server.dart ... | 
 | ``` | 
 | After starting the server, you can run the browser using the command line starting with `Command[[browser name]]`.  The debugging tools in the browser can be used to set Javascript or Dart breakpoints, and the reload button should rerun the test. | 
 |     * **Tip:** In the Sources tab of Chrome's developer tools, a "stop sign" button in the upper right tells the browser to break when an exception is thrown. | 
 |  | 
 | Some common problems you might get when running tests for the first time: | 
 |   * Some fonts are missing. Chromium tests use `DumpRenderTree`, which needs some sets of fonts. See [LayoutTestsLinux](http://code.google.com/p/chromium/wiki/LayoutTestsLinux) for instructions in how to fix it. | 
 |   * No display is set (e.g. running tests from an ssh terminal). `DumpRenderTree` is a nearly headless browser. Even though it doesn't open any GUI, it still must have an X session available. There are several ways to work around this: | 
 |     * Use `xvfb`: | 
 |  | 
 |       ```bash | 
 |       xvfb-run ./tools/test.py --arch=ia32 --compiler=dart2js --runtime=drt ... | 
 |       ``` | 
 |  | 
 |     * Other options include using ssh X tunneling (`ssh -Y`), NX, VNC, setting up `xhost` and exporting the DISPLAY environment variable, or simply running tests locally. | 
 |  | 
 | <a id="standalone"></a> | 
 |  | 
 | # Building the standalone VM only | 
 |  | 
 | You can tell the build script to build the runtime targets only with the command: | 
 | ```bash | 
 | $ ./tools/build.py runtime | 
 | ``` |