blob: 18fd1cfcd59ad9cbc81692482a9844e02439849e [file] [log] [blame] [view]
[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
```