2016-11-04 16:32:07 +00:00
|
|
|
How to build Skia
|
|
|
|
=================
|
2016-07-29 15:35:54 +00:00
|
|
|
|
2016-11-04 16:32:07 +00:00
|
|
|
Make sure you have first followed the [instructions to download
|
|
|
|
Skia](./download).
|
2016-07-29 15:35:54 +00:00
|
|
|
|
2016-11-04 16:32:07 +00:00
|
|
|
Skia uses [GN](https://chromium.googlesource.com/chromium/src/tools/gn/) to
|
|
|
|
configure its builds.
|
2016-07-29 15:35:54 +00:00
|
|
|
|
2016-11-04 16:32:07 +00:00
|
|
|
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.
|
2016-07-29 15:35:54 +00:00
|
|
|
|
|
|
|
Quickstart
|
|
|
|
----------
|
|
|
|
|
2017-01-13 14:05:46 +00:00
|
|
|
Run GN to generate your build files.
|
2016-12-16 13:10:47 +00:00
|
|
|
|
2017-01-13 14:05:46 +00:00
|
|
|
bin/gn gen out/Static --args='is_official_build=true'
|
|
|
|
bin/gn gen out/Shared --args='is_official_build=true is_component_build=true'
|
2016-12-16 13:10:47 +00:00
|
|
|
|
2017-01-13 16:14:50 +00:00
|
|
|
If you find you don't have `bin/gn`, make sure you've run
|
2016-07-29 15:35:54 +00:00
|
|
|
|
2017-01-13 14:05:46 +00:00
|
|
|
python tools/git-sync-deps
|
2016-09-16 14:17:45 +00:00
|
|
|
|
2016-11-04 16:32:07 +00:00
|
|
|
GN allows fine-grained settings for developers and special situations.
|
|
|
|
|
2017-01-13 14:05:46 +00:00
|
|
|
bin/gn gen out/Debug
|
|
|
|
bin/gn gen out/Release --args='is_debug=false'
|
|
|
|
bin/gn gen out/Clang --args='cc="clang" cxx="clang++"'
|
|
|
|
bin/gn gen out/Cached --args='cc_wrapper="ccache"'
|
|
|
|
bin/gn gen out/RTTI --args='extra_cflags_cc=["-frtti"]'
|
2016-07-29 15:35:54 +00:00
|
|
|
|
2016-11-04 16:32:07 +00:00
|
|
|
To see all the arguments available, you can run
|
|
|
|
|
2017-01-13 14:05:46 +00:00
|
|
|
bin/gn args out/Debug --list
|
2016-09-16 14:17:45 +00:00
|
|
|
|
2016-11-04 16:32:07 +00:00
|
|
|
Having generated your build files, run Ninja to compile and link Skia.
|
|
|
|
|
2016-09-16 14:17:45 +00:00
|
|
|
ninja -C out/Static
|
|
|
|
ninja -C out/Shared
|
2016-07-29 15:35:54 +00:00
|
|
|
ninja -C out/Debug
|
2016-08-29 17:27:16 +00:00
|
|
|
ninja -C out/Release
|
2016-07-29 15:35:54 +00:00
|
|
|
ninja -C out/Clang
|
2016-08-29 17:27:16 +00:00
|
|
|
ninja -C out/Cached
|
|
|
|
ninja -C out/RTTI
|
2016-07-29 15:35:54 +00:00
|
|
|
|
2016-08-29 17:27:16 +00:00
|
|
|
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
|
2016-11-01 18:03:04 +00:00
|
|
|
python infra/bots/assets/android_ndk_windows/download.py -t C:/ndk
|
2016-08-29 17:27:16 +00:00
|
|
|
|
|
|
|
When generating your GN build files, pass the path to your `ndk` and your
|
|
|
|
desired `target_cpu`:
|
|
|
|
|
2017-01-13 14:05:46 +00:00
|
|
|
bin/gn gen out/arm --args='ndk="/tmp/ndk" target_cpu="arm"'
|
|
|
|
bin/gn gen out/arm64 --args='ndk="/tmp/ndk" target_cpu="arm64"'
|
|
|
|
bin/gn gen out/mips64el --args='ndk="/tmp/ndk" target_cpu="mips64el"'
|
|
|
|
bin/gn gen out/mipsel --args='ndk="/tmp/ndk" target_cpu="mipsel"'
|
|
|
|
bin/gn gen out/x64 --args='ndk="/tmp/ndk" target_cpu="x64"'
|
|
|
|
bin/gn gen out/x86 --args='ndk="/tmp/ndk" target_cpu="x86"'
|
2016-08-29 17:27:16 +00:00
|
|
|
|
|
|
|
Other arguments like `is_debug` and `is_component_build` continue to work.
|
2016-09-16 14:17:45 +00:00
|
|
|
Tweaking `ndk_api` gives you access to newer Android features like Vulkan.
|
2016-09-08 17:03:21 +00:00
|
|
|
|
2016-09-16 19:40:17 +00:00
|
|
|
To test on an Android device, push the binary and `resources` over,
|
|
|
|
and run it as normal. You may find `bin/droid` convenient.
|
2016-09-08 17:03:21 +00:00
|
|
|
|
|
|
|
ninja -C out/arm64
|
2016-09-16 19:40:17 +00:00
|
|
|
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"
|
2016-10-15 15:44:45 +00:00
|
|
|
|
2016-10-25 15:39:12 +00:00
|
|
|
Mac
|
|
|
|
---
|
|
|
|
|
2017-01-13 14:05:46 +00:00
|
|
|
Mac users may want to pass `--ide=xcode` to `bin/gn gen` to generate an Xcode project.
|
2016-10-25 15:39:12 +00:00
|
|
|
|
2016-10-15 15:44:45 +00:00
|
|
|
Windows
|
|
|
|
-------
|
|
|
|
|
2016-11-04 16:32:07 +00:00
|
|
|
Skia can build on Windows with Visual Studio 2015 Update 3. No older or newer
|
2016-12-14 16:06:04 +00:00
|
|
|
version is supported. The bots use a packaged toolchain, which you may be able
|
|
|
|
to download like this:
|
2016-10-15 15:44:45 +00:00
|
|
|
|
|
|
|
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"`.
|
|
|
|
|
2016-12-14 16:06:04 +00:00
|
|
|
### Visual Studio Solutions
|
|
|
|
|
2017-01-13 14:05:46 +00:00
|
|
|
If you use Visual Studio, you may want to pass `--ide=vs` to `bin/gn gen` to
|
2016-12-14 16:06:04 +00:00
|
|
|
generate `all.sln`. That solution will exist within the GN directory for the
|
|
|
|
specific configuration, and will only build/run that configuration.
|
|
|
|
|
|
|
|
If you want a Visual Studio Solution that supports multiple GN configurations,
|
|
|
|
there is a helper script. It requires that all of your GN directories be inside
|
|
|
|
the `out` directory. First, create all of your GN configurations as usual.
|
2017-01-13 14:05:46 +00:00
|
|
|
Pass `--ide=vs` when running `bin/gn gen` for each one. Then:
|
2016-12-14 16:06:04 +00:00
|
|
|
|
|
|
|
python gn/gn_meta_sln.py
|
|
|
|
|
|
|
|
This creates a new dedicated output directory and solution file
|
|
|
|
`out/sln/skia.sln`. It has one solution configuration for each GN configuration,
|
|
|
|
and supports building and running any of them. It also adjusts syntax highlighting
|
|
|
|
of inactive code blocks based on preprocessor definitions from the selected
|
|
|
|
solution configuration.
|
|
|
|
|
2016-10-15 15:44:45 +00:00
|
|
|
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.
|
|
|
|
|
2017-01-13 14:05:46 +00:00
|
|
|
bin/gn gen out/config --ide=json --json-ide-script=../../gn/gn_to_cmake.py
|
2016-11-01 15:46:10 +00:00
|
|
|
|
|
|
|
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`
|
2016-11-04 16:32:07 +00:00
|
|
|
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.
|