| How to build Skia |
| ================= |
| |
| Make sure you have first followed the [instructions to download |
| Skia](./download). |
| |
| Skia uses [GN](https://chromium.googlesource.com/chromium/src/tools/gn/) to |
| configure its builds. |
| |
| A few build configurations remain unported to GN, so you may see some `.gyp` |
| files laying around left over from when we used GYP. Don't bother looking at |
| them. |
| |
| Quickstart |
| ---------- |
| |
| After gclient sync, run `fetch-gn` to make sure you have GN. |
| |
| gclient sync && python bin/fetch-gn |
| |
| Run GN to generate your build files. |
| |
| gn gen out/Static --args='is_official_build=true' |
| gn gen out/Shared --args='is_official_build=true is_component_build=true' |
| |
| GN allows fine-grained settings for developers and special situations. |
| |
| gn gen out/Debug |
| gn gen out/Release --args='is_debug=false' |
| gn gen out/Clang --args='cc="clang" cxx="clang++"' |
| gn gen out/Cached --args='cc_wrapper="ccache"' |
| gn gen out/RTTI --args='extra_cflags_cc="-frtti"' |
| |
| To see all the arguments available, you can run |
| |
| gn args out/Debug --list |
| |
| Having generated your build files, run Ninja to compile and link Skia. |
| |
| ninja -C out/Static |
| ninja -C out/Shared |
| ninja -C out/Debug |
| ninja -C out/Release |
| ninja -C out/Clang |
| ninja -C out/Cached |
| ninja -C out/RTTI |
| |
| Android |
| ------- |
| |
| To build Skia for Android you need an [Android |
| NDK](https://developer.android.com/ndk/index.html). |
| |
| If you do not have an NDK and have access to CIPD, you |
| can use one of these commands to fetch the NDK our bots use: |
| |
| python infra/bots/assets/android_ndk_linux/download.py -t /tmp/ndk |
| python infra/bots/assets/android_ndk_darwin/download.py -t /tmp/ndk |
| python infra/bots/assets/android_ndk_windows/download.py -t C:/ndk |
| |
| When generating your GN build files, pass the path to your `ndk` and your |
| desired `target_cpu`: |
| |
| gn gen out/arm --args='ndk="/tmp/ndk" target_cpu="arm"' |
| gn gen out/arm64 --args='ndk="/tmp/ndk" target_cpu="arm64"' |
| gn gen out/mips64el --args='ndk="/tmp/ndk" target_cpu="mips64el"' |
| gn gen out/mipsel --args='ndk="/tmp/ndk" target_cpu="mipsel"' |
| gn gen out/x64 --args='ndk="/tmp/ndk" target_cpu="x64"' |
| gn gen out/x86 --args='ndk="/tmp/ndk" target_cpu="x86"' |
| |
| Other arguments like `is_debug` and `is_component_build` continue to work. |
| Tweaking `ndk_api` gives you access to newer Android features like Vulkan. |
| |
| To test on an Android device, push the binary and `resources` over, |
| and run it as normal. You may find `bin/droid` convenient. |
| |
| ninja -C out/arm64 |
| adb push out/arm64/dm /data/local/tmp |
| adb push resources /data/local/tmp |
| adb shell "cd /data/local/tmp; ./dm --src gm --config gpu" |
| |
| Mac |
| --- |
| |
| Mac users may want to pass `--ide=xcode` to `gn gen` to generate an Xcode project. |
| |
| Windows |
| ------- |
| |
| Skia can build on Windows with Visual Studio 2015 Update 3. No older or newer |
| version is supported. If you use Visual Studio, you may want to pass |
| `--ide=vs` to `gn gen` to generate `all.sln`. |
| |
| The bots use a packaged toolchain, which you may be able to download like this: |
| |
| python infra/bots/assets/win_toolchain/download.py -t C:/toolchain |
| |
| If you pass that downloaded path to GN via `windk`, you can build using that |
| toolchain instead of your own from Visual Studio. This toolchain is the only |
| way we support 32-bit builds, by also setting `target_cpu="x86"`. |
| |
| CMake |
| ----- |
| |
| We have added a GN-to-CMake translator mainly for use with IDEs that like CMake |
| project descriptions. This is not meant for any purpose beyond development. |
| |
| gn gen out/config --ide=json --json-ide-script=../../gn/gn_to_cmake.py |
| |
| Third-party Dependencies |
| ------------------------ |
| |
| Skia offers several features that make use of third-party libraries, like |
| libpng, libwebp, or libjpeg-turbo to decode images, or ICU and sftnly to subset |
| fonts. All these third-party dependencies are optional, and can be controlled |
| by a GN argument that looks something like `skia_use_foo` for appropriate |
| `foo`. |
| |
| Most of these third-party dependencies can also be satisfied by pre-built |
| system libraries. If `skia_use_foo` is enabled, turn on `skia_use_system_foo` |
| to build and link Skia against the headers and libaries found on the system |
| paths. You can use `extra_cflags` and `extra_ldflags` to add include or |
| library paths if needed. |
| |
| By default Skia will build and embed its own copies of these third-party |
| libraries. This configuration is for development only. We do not recommend |
| shipping Skia this way. However, this is the only configuration of Skia that |
| receives significant testing. |