diff --git a/site/user/build.md b/site/user/build.md index 1aa5e2fba9..1d533d58e6 100644 --- a/site/user/build.md +++ b/site/user/build.md @@ -1,25 +1,23 @@ -How to build Skia -================= +# How to build Skia -Make sure you have first followed the [instructions to download -Skia](./download). +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. - - [`is_official_build` and Third-party Dependencies](#third-party) - - [A note on software backend performance](#performance) - - [Quickstart](#quick) - - [Android](#android) - - [ChromeOS](#cros) - - [Mac](#macos) - - [iOS](#ios) - - [Windows](#windows) - - [Windows ARM64](#win-arm64) - - [CMake](#cmake) +- [`is_official_build` and Third-party Dependencies](#third-party) +- [Supported and Preferred Compilers](#compilers) +- [Quickstart](#quick) +- [Android](#android) +- [ChromeOS](#cros) +- [Mac](#macos) +- [iOS](#ios) +- [Windows](#windows) +- [Windows ARM64](#win-arm64) +- [CMake](#cmake) -`is_official_build` and Third-party Dependencies ------------------------------------------------------------------------------- +## `is_official_build` and Third-party Dependencies Most users of Skia should set `is_official_build=true`, and most developers should leave it to its `false` default. @@ -30,292 +28,336 @@ using the ordinary library search path. In contrast, the developer-oriented default is an unoptimized build with full debug symbols and all third-party dependencies built from source and embedded -into libskia. This is how we do all our manual and automated testing. +into libskia. This is how we do all our manual and automated testing. 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`. +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`. -If `skia_use_foo` is enabled, enabling `skia_use_system_foo` will build and -link Skia against the headers and libaries found on the system paths. -`is_official_build=true` enables all `skia_use_system_foo` by default. You can +If `skia_use_foo` is enabled, enabling `skia_use_system_foo` will build and link +Skia against the headers and libaries found on the system paths. +`is_official_build=true` enables all `skia_use_system_foo` by default. You can use `extra_cflags` and `extra_ldflags` to add include or library paths if needed. -Supported and Preferred Compilers -------------------------------------------------------------- +## Supported and Preferred Compilers While Skia should compile with GCC, MSVC, and other compilers, a number of routines in Skia's software backend have been written to run fastest when -compiled with Clang. If you depend on software rasterization, image decoding, -or color space conversion and compile Skia with a compiler other than Clang, you -will see dramatically worse performance. This choice was only a matter of +compiled with Clang. If you depend on software rasterization, image decoding, or +color space conversion and compile Skia with a compiler other than Clang, you +will see dramatically worse performance. This choice was only a matter of prioritization; there is nothing fundamentally wrong with non-Clang compilers. So if this is a serious issue for you, please let us know on the mailing list. Skia makes use of C++17 language features (compiles with `-std=c++17` flag) and -thus requires a C++17 compatible compiler. Clang 5 and later implement all of -the features of the c++17 standard. Older compilers that lack C++17 support may -produce non-obvious compilation errors. You can configure your build to use +thus requires a C++17 compatible compiler. Clang 5 and later implement all of +the features of the c++17 standard. Older compilers that lack C++17 support may +produce non-obvious compilation errors. You can configure your build to use specific executables for `cc` and `cxx` invocations using e.g. `--args='cc="clang-6.0" cxx="clang++6.0"'` GN build arguments, as illustrated in -[Quickstart](#quick). This can be useful for building Skia without needing to +[Quickstart](#quick). This can be useful for building Skia without needing to modify your machine's default compiler toolchain. -Quickstart ----------------------------------- +## Quickstart -Run GN to generate your build files. +Run `gn gen` to generate your build files. As arguments to `gn gen`, pass a name +for your build directory, and optionally `--args=` to configure the build type. - bin/gn gen out/Static --args='is_official_build=true' - bin/gn gen out/Shared --args='is_official_build=true is_component_build=true' +To build Skia as a static library in a build directory named `out/Static`: -If you find you don't have `bin/gn`, make sure you've run +``` +bin/gn gen out/Static --args='is_official_build=true' +``` - python2 tools/git-sync-deps +To build Skia as a shared library (DLL) in a build directory named `out/Shared`: -GN allows fine-grained settings for developers and special situations. +``` +bin/gn gen out/Shared --args='is_official_build=true is_component_build=true' +``` - 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"]' +If you find that you don't have `bin/gn`, make sure you've run: -To see all the arguments available, you can run +``` +python2 tools/git-sync-deps +``` - bin/gn args out/Debug --list +For a list of available build arguments, take a look at `gn/skia.gni`, or run: -Having generated your build files, run Ninja to compile and link Skia. +``` +bin/gn args out/Debug --list +``` - 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 +GN allows multiple build folders to coexist; each build can be configured +separately as desired. For example: -If some header files are missing, install the corresponding dependencies +``` +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"]' +``` - tools/install_dependencies.sh +Once you have generated your build files, run Ninja to compile and link Skia: + +``` +ninja -C out/Static +``` + +If some header files are missing, install the corresponding dependencies: + +``` +tools/install_dependencies.sh +``` To pull new changes and rebuild: - git pull - python tools/git-sync-deps - ninja -C out/Static +``` +git pull +python tools/git-sync-deps +ninja -C out/Static +``` -Android ---------------------------------- +## Android -To build Skia for Android you need an [Android -NDK](https://developer.android.com/ndk/index.html). +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: +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: - python2 infra/bots/assets/android_ndk_linux/download.py -t /tmp/ndk - python2 infra/bots/assets/android_ndk_darwin/download.py -t /tmp/ndk - python2 infra/bots/assets/android_ndk_windows/download.py -t C:/ndk +``` +python2 infra/bots/assets/android_ndk_linux/download.py -t /tmp/ndk +python2 infra/bots/assets/android_ndk_darwin/download.py -t /tmp/ndk +python2 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`: - 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/x64 --args='ndk="/tmp/ndk" target_cpu="x64"' - bin/gn gen out/x86 --args='ndk="/tmp/ndk" target_cpu="x86"' +``` +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/x64 --args='ndk="/tmp/ndk" target_cpu="x64"' +bin/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. +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 gl" +``` +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 gl" +``` - -ChromeOS -------------------------------- +## ChromeOS To cross-compile Skia for arm ChromeOS devices the following is needed: - - Clang 4 or newer - - An armhf sysroot - - The (E)GL lib files on the arm chromebook to link against. +- Clang 4 or newer +- An armhf sysroot +- The (E)GL lib files on the arm chromebook to link against. -To compile Skia for an x86 ChromeOS device, one only needs Clang and the lib files. +To compile Skia for an x86 ChromeOS device, one only needs Clang and the lib +files. If you have access to CIPD, you can fetch all of these as follows: - python2 infra/bots/assets/clang_linux/download.py -t /opt/clang - python2 infra/bots/assets/armhf_sysroot/download.py -t /opt/armhf_sysroot - python2 infra/bots/assets/chromebook_arm_gles/download.py -t /opt/chromebook_arm_gles - python2 infra/bots/assets/chromebook_x86_64_gles/download.py -t /opt/chromebook_x86_64_gles +``` +python2 infra/bots/assets/clang_linux/download.py -t /opt/clang +python2 infra/bots/assets/armhf_sysroot/download.py -t /opt/armhf_sysroot +python2 infra/bots/assets/chromebook_arm_gles/download.py -t /opt/chromebook_arm_gles +python2 infra/bots/assets/chromebook_x86_64_gles/download.py -t /opt/chromebook_x86_64_gles +``` -If you don't have authorization to use those assets, then see the README.md files for +If you don't have authorization to use those assets, then see the README.md +files for [armhf_sysroot](https://skia.googlesource.com/skia/+/master/infra/bots/assets/armhf_sysroot/README.md), -[chromebook_arm_gles](https://skia.googlesource.com/skia/+/master/infra/bots/assets/chromebook_arm_gles/README.md), and +[chromebook_arm_gles](https://skia.googlesource.com/skia/+/master/infra/bots/assets/chromebook_arm_gles/README.md), +and [chromebook_x86_64_gles](https://skia.googlesource.com/skia/+/master/infra/bots/assets/chromebook_x86_64_gles/README.md) for instructions on creating those assets. Once those files are in place, generate the GN args that resemble the following: - #ARM - cc= "/opt/clang/bin/clang" - cxx = "/opt/clang/bin/clang++" +``` +#ARM +cc= "/opt/clang/bin/clang" +cxx = "/opt/clang/bin/clang++" - extra_asmflags = [ - "--target=armv7a-linux-gnueabihf", - "--sysroot=/opt/armhf_sysroot/", - "-march=armv7-a", - "-mfpu=neon", - "-mthumb", - ] - extra_cflags=[ - "--target=armv7a-linux-gnueabihf", - "--sysroot=/opt/armhf_sysroot", - "-I/opt/chromebook_arm_gles/include", - "-I/opt/armhf_sysroot/include/", - "-I/opt/armhf_sysroot/include/c++/4.8.4/", - "-I/opt/armhf_sysroot/include/c++/4.8.4/arm-linux-gnueabihf/", - "-DMESA_EGL_NO_X11_HEADERS", - "-funwind-tables", - ] - extra_ldflags=[ - "--sysroot=/opt/armhf_sysroot", - "-B/opt/armhf_sysroot/bin", - "-B/opt/armhf_sysroot/gcc-cross", - "-L/opt/armhf_sysroot/gcc-cross", - "-L/opt/armhf_sysroot/lib", - "-L/opt/chromebook_arm_gles/lib", - "--target=armv7a-linux-gnueabihf", - ] - target_cpu="arm" - skia_use_fontconfig = false - skia_use_system_freetype2 = false - skia_use_egl = true +extra_asmflags = [ + "--target=armv7a-linux-gnueabihf", + "--sysroot=/opt/armhf_sysroot/", + "-march=armv7-a", + "-mfpu=neon", + "-mthumb", +] +extra_cflags=[ + "--target=armv7a-linux-gnueabihf", + "--sysroot=/opt/armhf_sysroot", + "-I/opt/chromebook_arm_gles/include", + "-I/opt/armhf_sysroot/include/", + "-I/opt/armhf_sysroot/include/c++/4.8.4/", + "-I/opt/armhf_sysroot/include/c++/4.8.4/arm-linux-gnueabihf/", + "-DMESA_EGL_NO_X11_HEADERS", + "-funwind-tables", +] +extra_ldflags=[ + "--sysroot=/opt/armhf_sysroot", + "-B/opt/armhf_sysroot/bin", + "-B/opt/armhf_sysroot/gcc-cross", + "-L/opt/armhf_sysroot/gcc-cross", + "-L/opt/armhf_sysroot/lib", + "-L/opt/chromebook_arm_gles/lib", + "--target=armv7a-linux-gnueabihf", +] +target_cpu="arm" +skia_use_fontconfig = false +skia_use_system_freetype2 = false +skia_use_egl = true - # x86_64 - cc= "/opt/clang/bin/clang" - cxx = "/opt/clang/bin/clang++" - extra_cflags=[ - "-I/opt/clang/include/c++/v1/", - "-I/opt/chromebook_x86_64_gles/include", - "-DMESA_EGL_NO_X11_HEADERS", - "-DEGL_NO_IMAGE_EXTERNAL", - ] - extra_ldflags=[ - "-stdlib=libc++", - "-fuse-ld=lld", - "-L/opt/chromebook_x86_64_gles/lib", - ] - target_cpu="x64" - skia_use_fontconfig = false - skia_use_system_freetype2 = false - skia_use_egl = true +# x86_64 +cc= "/opt/clang/bin/clang" +cxx = "/opt/clang/bin/clang++" +extra_cflags=[ + "-I/opt/clang/include/c++/v1/", + "-I/opt/chromebook_x86_64_gles/include", + "-DMESA_EGL_NO_X11_HEADERS", + "-DEGL_NO_IMAGE_EXTERNAL", +] +extra_ldflags=[ + "-stdlib=libc++", + "-fuse-ld=lld", + "-L/opt/chromebook_x86_64_gles/lib", +] +target_cpu="x64" +skia_use_fontconfig = false +skia_use_system_freetype2 = false +skia_use_egl = true +``` Compile dm (or another executable of your choice) with ninja, as per usual. -Push the binary to a chromebook via ssh and [run dm as normal](https://skia.org/dev/testing/tests) -using the gles GPU config. +Push the binary to a chromebook via ssh and +[run dm as normal](https://skia.org/dev/testing/tests) using the gles GPU +config. -Most chromebooks by default have their home directory partition marked as noexec. -To avoid "permission denied" errors, remember to run something like: +Most chromebooks by default have their home directory partition marked as +noexec. To avoid "permission denied" errors, remember to run something like: - sudo mount -i -o remount,exec /home/chronos +``` +sudo mount -i -o remount,exec /home/chronos +``` -Mac ---------------------------- +## Mac -Mac users may want to pass `--ide=xcode` to `bin/gn gen` to generate an Xcode project. +Mac users may want to pass `--ide=xcode` to `bin/gn gen` to generate an Xcode +project. -iOS -------------------------- +## iOS -Run GN to generate your build files. Set `target_os="ios"` to build for iOS. -This defaults to `target_cpu="arm64"`. Choosing `x64` targets the iOS simulator. +Run GN to generate your build files. Set `target_os="ios"` to build for iOS. +This defaults to `target_cpu="arm64"`. Choosing `x64` targets the iOS simulator. - bin/gn gen out/ios64 --args='target_os="ios"' - bin/gn gen out/ios32 --args='target_os="ios" target_cpu="arm"' - bin/gn gen out/iossim --args='target_os="ios" target_cpu="x64"' +``` +bin/gn gen out/ios64 --args='target_os="ios"' +bin/gn gen out/ios32 --args='target_os="ios" target_cpu="arm"' +bin/gn gen out/iossim --args='target_os="ios" target_cpu="x64"' +``` -This will also package (and for devices, sign) iOS test binaries. This defaults to a -Google signing identity and provisioning profile. To use a different one set the GN args -`skia_ios_identity` to match your code signing identity and `skia_ios_profile` to the name -of your provisioning profile, e.g. +This will also package (and for devices, sign) iOS test binaries. This defaults +to a Google signing identity and provisioning profile. To use a different one +set the GN args `skia_ios_identity` to match your code signing identity and +`skia_ios_profile` to the name of your provisioning profile, e.g. - skia_ios_identity=".*Jane Doe.*" - skia_ios_profile="iPad Profile"` +``` +skia_ios_identity=".*Jane Doe.*" +skia_ios_profile="iPad Profile"` +``` -A list of identities can be found by typing `security find-identity` on the command line. The -name of the provisioning profile should be available on the Apple Developer site. Alternatively, -`skia_ios_profile` can be the absolute path to the mobileprovision file. +A list of identities can be found by typing `security find-identity` on the +command line. The name of the provisioning profile should be available on the +Apple Developer site. Alternatively, `skia_ios_profile` can be the absolute path +to the mobileprovision file. -For signed packages `ios-deploy` makes installing and running them on a device easy: +For signed packages `ios-deploy` makes installing and running them on a device +easy: - ios-deploy -b out/Debug/dm.app -d --args "--match foo" +``` +ios-deploy -b out/Debug/dm.app -d --args "--match foo" +``` -Alternatively you can generate an Xcode project by passing `--ide=xcode` to `bin/gn gen`. If you -are using Xcode version 10 or later, you'll need to go to `Workplace Settings...` and change -`Build System:` to `Legacy Build System`. You may find you still have issues with building or -signing -- in that case you'll need to go to the `Signing and Capabilities` settings for the -target, uncheck `Automatically manage signing`, and fill in the bundle identifier and provisioning -information manually. +Alternatively you can generate an Xcode project by passing `--ide=xcode` to +`bin/gn gen`. If you are using Xcode version 10 or later, you'll need to go to +`Workplace Settings...` and change `Build System:` to `Legacy Build System`. You +may find you still have issues with building or signing -- in that case you'll +need to go to the `Signing and Capabilities` settings for the target, uncheck +`Automatically manage signing`, and fill in the bundle identifier and +provisioning information manually. If you find yourself missing a Google signing identity or provisioning profile, you'll want to have a read through go/appledev. -Deploying to a device with an OS older than the current SDK doesn't currently work through Xcode, -but can be done by setting the following as GN args: +Deploying to a device with an OS older than the current SDK doesn't currently +work through Xcode, but can be done by setting the following as GN args: - extra_cflags = ["-miphoneos-version-min=."] - extra_asmflags=["-miphoneos-version-min=."] - extra_ldflags =["-miphoneos-version-min=."] +``` +extra_cflags = ["-miphoneos-version-min=."] +extra_asmflags=["-miphoneos-version-min=."] +extra_ldflags =["-miphoneos-version-min=."] +``` where `.` is the iOS version on the device, e.g., 12.0 or 11.4. -Windows ---------------------------------- +## Windows -Skia can build on Windows with Visual Studio 2017 or 2019. -If GN is unable to locate either of those, it will print an error message. In that -case, you can pass your `VC` path to GN via `win_vc`. +Skia can build on Windows with Visual Studio 2017 or 2019. If GN is unable to +locate either of those, it will print an error message. In that case, you can +pass your `VC` path to GN via `win_vc`. -Skia can be compiled with the free [Build Tools for Visual Studio 2017 or -2019](https://www.visualstudio.com/downloads/#build-tools-for-visual-studio-2019). +Skia can be compiled with the free +[Build Tools for Visual Studio 2017 or 2019](https://www.visualstudio.com/downloads/#build-tools-for-visual-studio-2019). The bots use a packaged 2019 toolchain, which Googlers can download like this: - python2 infra/bots/assets/win_toolchain/download.py -t C:/toolchain +``` +python2 infra/bots/assets/win_toolchain/download.py -t C:/toolchain +``` You can then pass the VC and SDK paths to GN by setting your GN args: - win_vc = "C:\toolchain\VC" - win_sdk = "C:\toolchain\win_sdk" +``` +win_vc = "C:\toolchain\VC" +win_sdk = "C:\toolchain\win_sdk" +``` -This toolchain is the only way we support 32-bit builds, by also setting `target_cpu="x86"`. +This toolchain is the only way we support 32-bit builds, by also setting +`target_cpu="x86"`. The Skia build assumes that the PATHEXT environment variable contains ".EXE". ### **Highly Recommended**: Build with clang-cl -Skia uses generated code that is only optimized when Skia is built with clang. Other compilers get generic -unoptimized code. +Skia uses generated code that is only optimized when Skia is built with clang. +Other compilers get generic unoptimized code. -Setting the `cc` and `cxx` gn args is _not_ sufficient to build with clang-cl. These variables -are ignored on Windows. Instead set the variable `clang_win` to your LLVM installation directory. -If you installed the prebuilt LLVM downloaded from [here](https://releases.llvm.org/download.html -"LLVM Download") in the default location that would be: +Setting the `cc` and `cxx` gn args is _not_ sufficient to build with clang-cl. +These variables are ignored on Windows. Instead set the variable `clang_win` to +your LLVM installation directory. If you installed the prebuilt LLVM downloaded +from [here](https://releases.llvm.org/download.html "LLVM Download") in the +default location that would be: - clang_win = "C:\Program Files\LLVM" +``` +clang_win = "C:\Program Files\LLVM" +``` Follow the standard Windows path specification and not MinGW convention (e.g. `C:\Program Files\LLVM` not ~~`/c/Program Files/LLVM`~~). @@ -323,43 +365,49 @@ Follow the standard Windows path specification and not MinGW convention (e.g. ### Visual Studio Solutions If you use Visual Studio, you may want to pass `--ide=vs` to `bin/gn gen` to -generate `all.sln`. That solution will exist within the GN directory for the +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. -Pass `--ide=vs` when running `bin/gn gen` for each one. Then: +the `out` directory. First, create all of your GN configurations as usual. Pass +`--ide=vs` when running `bin/gn gen` for each one. Then: - python2 gn/gn_meta_sln.py +``` +python2 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. +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. -Windows ARM64 ------------------------------------------ +## Windows ARM64 -There is early, experimental support for [Windows 10 on ARM](https://docs.microsoft.com/en-us/windows/arm/). -This currently requires (a recent version of) MSVC, and the `Visual C++ compilers and libraries for ARM64` -individual component in the Visual Studio Installer. For Googlers, the win_toolchain asset includes the -ARM64 compiler. +There is early, experimental support for +[Windows 10 on ARM](https://docs.microsoft.com/en-us/windows/arm/). This +currently requires (a recent version of) MSVC, and the `Visual C++ compilers and +libraries for ARM64` individual component in the Visual Studio Installer. For +Googlers, the win_toolchain asset includes the ARM64 compiler. -To use that toolchain, set the `target_cpu` GN argument to `"arm64"`. Note that OpenGL is not supported -by Windows 10 on ARM, so Skia's GL backends are stubbed out, and will not work. ANGLE is supported: +To use that toolchain, set the `target_cpu` GN argument to `"arm64"`. Note that +OpenGL is not supported by Windows 10 on ARM, so Skia's GL backends are stubbed +out, and will not work. ANGLE is supported: - bin/gn gen out/win-arm64 --args='target_cpu="arm64" skia_use_angle=true' +``` +bin/gn gen out/win-arm64 --args='target_cpu="arm64" skia_use_angle=true' +``` -This will produce a build of Skia that can use the software or ANGLE backends, in DM. Viewer only works -when launched with `--backend angle`, because the software backend tries to use OpenGL to display the -window contents. +This will produce a build of Skia that can use the software or ANGLE backends, +in DM. Viewer only works when launched with `--backend angle`, because the +software backend tries to use OpenGL to display the window contents. -CMake ------------------------------ +## 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. +project descriptions. This is not meant for any purpose beyond development. - bin/gn gen out/config --ide=json --json-ide-script=../../gn/gn_to_cmake.py +``` +bin/gn gen out/config --ide=json --json-ide-script=../../gn/gn_to_cmake.py +```