### ckia_sys This project will take skia and generate rust bindings for it. It also takes care of building skia. fast compile times is the highest priority. and we do this by: 1. providing prebuilt static and dynamic libraries, which can be downloaded by build script for common configurations 2. maintain manual C bindings and use pre-generated bindings, instead of generating bindings at build time. avoids bindgen dependency and 6 seconds of build time. ### Generate Bindings 1. install bindgen with `cargo install bindgen` 2. run ```sh # merge extern blocks creates a smaller and denser bindings.rs # no-layout-tests avoids a lot of tests and makes bindings.rs cleaner. But for sanity, we might generate layout tests first, run cargo test, and then generate bindings without tests to publish. # -Iskia is necessary to let clang know where to search for include paths. bindgen --merge-extern-blocks --default-enum-style rust --no-layout-tests -o bindings.rs skia/ckia/src/sk_all.c -- -Iskia/ ``` 3. Finally, fix the functions which need a different ABI on windows. 1. `gr_vk_get_proc`. change its ABI to `extern "system"`, so that it can use `__stdcall` ABI on windows platforms. ### Build Skia exposes a lot of configuration at build time. To avoid dealing with all the complexity, we will only provide pre-built libraries for common "all-purpose" configuration and expect the users to build from scratch when they need some custom build. you can force building from scratch by enabling `build_from_src` feature flag or by setting `SKIA_BUILD_FROM_SRC` env var. ##### Dependencies If you are using the default build and there's a prebuilt binary available, then 1. `curl` -> to download the pre-built libs 2. `tar` -> to extract the archives after downloading. Both windows 10 and linux have these by default. If you are building from source: 1. `git` -> to clone skia repo and deps 2. `python` -> to download build deps and run build scripts 3. `tar` (optional) -> to package libs before copying them to `SKIA_COPY_LIBS` (see below) 4. `curl` -> maybe download something that we need like source code packages from github. 5. `clang` and `clang++`. (LLVM). 6. `sccache` or `ccache` (optional) -> for caching compiled objects, as `cargo clean` will remove everything from target eventually. highly recommended. 7. Lots of patience. skia is going through a messy phase of changing build systems from `gn` to `bazel`. So, you *will* probably hit some issues. If you are building from source, then there are a few env variables you *might* want to set. | name | default | purpose | | ------ | ----- | ------- | | SKIA_CC | clang* | c compiler. clang is preferred by skia | | SKIA_CC_WRAPPER | sccache* or ccache* | improves compile times by using a global cache. highly recommended | | SKIA_CXX | clang++* | c++ compiler. clang++ is preferred by skia | | SKIA_CLANG_WIN (windows only) | C:\\Program Files\\LLVM* | path to LLVM installation. required for using clang | | SKIA_CLANG_WIN_VERSION (windows only) | SKIA_CLANG_WIN/lib/clang/version** | version of clang to use. ckia_sys will try to use the most recent version in SKIA_CLANG_WIN/lib/clang/. required for using clang | | SKIA_BUILD_FROM_SRC | 0 | if non-zero, tells ckia_sys to build skia from src. provided for convenience as an alternative to feature build_from_src | | SKIA_GN_ARGS (only applies if building from src)| "" | addditional GN args to pass to skia build for custom builds. | | SKIA_COPY_LIBS | "" | tells ckia_sys build system to copy the built binaries to the directory based on the path set in this var. useful in workflows to distribute libs after building it | | SKIA_SRC_DIR | "" | If set, we will use this as the source for the build. | | SKIA_SRC_ARCHIVE_URL | "" | If set, we will use curl to download this archive (.tar.gz), and extract it in OUT_DIR, and use that as the skia src directory. The archive must have a top level folder, which contains the skia sources| \* We will only use that default IF it is avaialable. Otherwise, we will avoid setting that gn arg. eg: we will only use `clang` for `SKIA_CC` if `clang --version` works. otherwise, we would just let skia use the default `cc`. \*\* We will look into LLVM/lib/clang directory, read the versions and set the version to latest we can find. Otherwise, we will just skip setting it.