| # Building Dawn |
| |
| ## System requirements |
| |
| * Git |
| * CMake (3.10.2 or later) (if desired) |
| * GN (if desired) |
| * Ninja (or other build tool) |
| * Python, for fetching dependencies |
| * [depot_tools] in your path |
| |
| - Linux |
| - The `pkg-config` command: |
| ```sh |
| # Install pkg-config on Ubuntu |
| sudo apt-get install pkg-config |
| ``` |
| |
| - Mac |
| - [Xcode](https://developer.apple.com/xcode/) 12.2+. |
| - The macOS 11.0 SDK. Run `xcode-select` to check whether you have it. |
| ```sh |
| ls `xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs |
| ``` |
| |
| ## Get the code and its dependencies |
| |
| ### Using `depot_tools` |
| |
| Dawn uses the Chromium build system and dependency management so you need to [install depot_tools] and add it to the PATH. |
| |
| [install depot_tools]: http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up |
| |
| ```sh |
| # Clone the repo as "dawn" |
| git clone https://dawn.googlesource.com/dawn dawn && cd dawn |
| |
| # Bootstrap the gclient configuration |
| cp scripts/standalone.gclient .gclient |
| |
| # Fetch external dependencies and toolchains with gclient |
| gclient sync |
| ``` |
| |
| ### Without `depot_tools` |
| |
| If you cannot or do not want to depend on `depot_tools`, you may use the `tools/fetch_dawn_dependencies.py` to clone the dependencies' repositories: |
| |
| ```sh |
| # Clone the repo as "dawn" |
| git clone https://dawn.googlesource.com/dawn dawn && cd dawn |
| |
| # Fetch dependencies (lose equivalent of gclient sync) |
| python tools/fetch_dawn_dependencies.py --use-test-deps |
| ``` |
| |
| Use `python tools/fetch_dawn_dependencies.py -h` to know more about the available options. The `--use-test-deps` option used above specifies to also fetch dependencies needed by tests. Contrary to `depot_tools`, this scripts does not figure out option-dependent requirements automatically. |
| |
| ## Build Dawn |
| |
| ### Compiling using CMake + Ninja |
| ```sh |
| mkdir -p out/Debug |
| cd out/Debug |
| cmake -GNinja ../.. |
| ninja # or autoninja |
| ``` |
| |
| ### Compiling using CMake + make |
| ```sh |
| mkdir -p out/Debug |
| cd out/Debug |
| cmake ../.. |
| make # -j N for N-way parallel build |
| ``` |
| |
| ### Compiling using gn + ninja |
| ```sh |
| mkdir -p out/Debug |
| gn gen out/Debug |
| autoninja -C out/Debug |
| ``` |
| |
| The most common GN build option is `is_debug=true/false`; otherwise |
| `gn args out/Debug --list` shows all the possible options. |
| |
| On macOS you'll want to add the `use_system_xcode=true` in most cases. |
| (and if you're a googler please get XCode from go/xcode). |
| |
| To generate a Microsoft Visual Studio solution, add `ide=vs2022` and |
| `ninja-executable=<dawn parent directory>\dawn\third_party\ninja\ninja.exe`. |
| The .sln file will be created in the output directory specified. |
| |
| ### Fuzzers on MacOS |
| If you are attempting fuzz, using `TINT_BUILD_FUZZERS=ON`, the version of llvm |
| in the XCode SDK does not have the needed libfuzzer functionality included. |
| |
| The build error that you will see from using the XCode SDK will look something |
| like this: |
| ``` |
| ld: file not found:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/lib/darwin/libclang_rt.fuzzer_osx.a |
| ``` |
| |
| The solution to this problem is to use a full version llvm, like what you would |
| get via homebrew, `brew install llvm`, and use something like `CC=<path to full |
| clang> cmake ..` to setup a build using that toolchain. |
| |