mirror of
https://github.com/slint-ui/slint.git
synced 2025-07-07 21:25:33 +00:00

Some checks are pending
CI / wasm_demo (push) Blocked by required conditions
CI / tree-sitter (push) Blocked by required conditions
CI / mcu-embassy (push) Blocked by required conditions
CI / ffi_32bit_build (push) Blocked by required conditions
CI / python_test (windows-2022) (push) Blocked by required conditions
CI / mcu (stm32h735g, thumbv7em-none-eabihf) (push) Blocked by required conditions
CI / files-changed (push) Waiting to run
CI / build_and_test (--exclude ffmpeg --exclude gstreamer-player, macos-14, stable) (push) Blocked by required conditions
CI / cpp_cmake (ubuntu-22.04, stable) (push) Blocked by required conditions
CI / build_and_test (--exclude ffmpeg --exclude gstreamer-player, windows-2022, 1.85) (push) Blocked by required conditions
CI / build_and_test (--exclude ffmpeg --exclude gstreamer-player, windows-2022, beta) (push) Blocked by required conditions
autofix.ci / format_fix (push) Waiting to run
autofix.ci / lint_typecheck (push) Waiting to run
CI / fmt_test (push) Blocked by required conditions
CI / esp-idf-quick (push) Blocked by required conditions
CI / android (push) Blocked by required conditions
CI / miri (push) Blocked by required conditions
CI / test-figma-inspector (push) Blocked by required conditions
CI / build_and_test (--exclude ffmpeg --exclude gstreamer-player, windows-2022, stable) (push) Blocked by required conditions
CI / build_and_test (ubuntu-22.04, 1.85) (push) Blocked by required conditions
CI / docs (push) Blocked by required conditions
CI / build_and_test (ubuntu-22.04, nightly) (push) Blocked by required conditions
CI / node_test (macos-14) (push) Blocked by required conditions
CI / node_test (ubuntu-22.04) (push) Blocked by required conditions
CI / node_test (windows-2022) (push) Blocked by required conditions
CI / python_test (macos-14) (push) Blocked by required conditions
CI / python_test (ubuntu-22.04) (push) Blocked by required conditions
CI / cpp_test_driver (macos-13) (push) Blocked by required conditions
CI / cpp_test_driver (ubuntu-22.04) (push) Blocked by required conditions
CI / cpp_test_driver (windows-2022) (push) Blocked by required conditions
CI / cpp_cmake (macos-14, 1.85) (push) Blocked by required conditions
CI / wasm (push) Blocked by required conditions
CI / cpp_cmake (windows-2022, nightly) (push) Blocked by required conditions
CI / cpp_package_test (push) Blocked by required conditions
CI / vsce_build_test (push) Blocked by required conditions
CI / mcu (pico-st7789, thumbv6m-none-eabi) (push) Blocked by required conditions
CI / mcu (pico2-st7789, thumbv8m.main-none-eabihf) (push) Blocked by required conditions
CI / updater_test (0.3.0) (push) Blocked by required conditions
346 lines
11 KiB
Markdown
346 lines
11 KiB
Markdown
<!-- Copyright © SixtyFPS GmbH <info@slint.dev> ; SPDX-License-Identifier: MIT -->
|
|
<!-- cSpell: ignore xkbcommon fontconfig vcpkg DCMAKE RUSTDOCFLAGS cppdocs frontends -->
|
|
# Slint Build Guide
|
|
|
|
This page explains how to build and test Slint.
|
|
|
|
## Prerequisites
|
|
|
|
### Installing Rust
|
|
|
|
Install Rust by following the [Rust Getting Started Guide](https://www.rust-lang.org/learn/get-started). If you already
|
|
have Rust installed, make sure that it's at least version 1.85 or newer. You can check which version you have installed
|
|
by running `rustc --version`.
|
|
|
|
Once this is done, you should have the `rustc` compiler and the `cargo` build system installed in your path.
|
|
|
|
### Dependencies
|
|
|
|
- **FFMPEG**
|
|
|
|
- **Skia** (only few available binaries):
|
|
|
|
<center>
|
|
|
|
| Platform | Binaries |
|
|
| --------------------------------- | -------------------------------------------------- |
|
|
| Windows | `x86_64-pc-windows-msvc` |
|
|
| Linux Ubuntu 16+<br />CentOS 7, 8 | `x86_64-unknown-linux-gnu` |
|
|
| macOS | `x86_64-apple-darwin` |
|
|
| Android | `aarch64-linux-android`<br/>`x86_64-linux-android` |
|
|
| iOS | `aarch64-apple-ios`<br/>`x86_64-apple-ios` |
|
|
| WebAssembly | `wasm32-unknown-emscripten` |
|
|
|
|
</center>
|
|
|
|
- Use Skia capable toolchain `rustup default stable-x86_64-pc-windows-msvc`
|
|
|
|
### Linux
|
|
|
|
For Linux a few additional packages beyond the usual build essentials are needed for development and running apps:
|
|
|
|
- xcb (`libxcb-shape0-dev` `libxcb-xfixes0-dev` on debian based distributions)
|
|
- xkbcommon (`libxkbcommon-dev` on debian based distributions)
|
|
- fontconfig library (`libfontconfig-dev` on debian based distributions)
|
|
- (optional) Qt will be used when `qmake` is found in `PATH`
|
|
- FFMPEG library `clang` `libavcodec-dev` `libavformat-dev` `libavutil-dev` `libavfilter-dev` `libavdevice-dev` `libasound2-dev` `pkg-config`
|
|
- openssl (`libssl-dev` on debian based distributions)
|
|
|
|
`xcb` and `xcbcommon` aren't needed if you are only using `backend-winit-wayland` without `backend-winit-x11`.
|
|
|
|
### macOS
|
|
|
|
- Make sure the "Xcode Command Line Tools" are installed: `xcode-select --install`
|
|
- (optional) Qt will be used when `qmake` is found in `PATH`
|
|
- FFMPEG `brew install pkg-config ffmpeg`
|
|
|
|
### Windows
|
|
|
|
- See [System Link](#symlinks-in-the-repository-windows)
|
|
- Make sure the MSVC Build Tools are installed: `winget install Microsoft.VisualStudio.2022.BuildTools`
|
|
- (optional) make sure Qt is installed and `qmake` is in the `Path`
|
|
- FFMPEG
|
|
|
|
- Option 1:
|
|
|
|
- install [vcpkg](https://github.com/microsoft/vcpkg#quick-start-windows)
|
|
- `vcpkg install ffmpeg --triplet x64-windows`
|
|
- Make sure `VCPKG_ROOT` is set to where `vcpkg` is installed
|
|
- Make sure `%VCPKG_ROOT%\installed\x64-windows\bin` is in your path
|
|
|
|
- Option 2:
|
|
- Download FFMPEG 4.4 shared and extract (<https://github.com/BtbN/FFmpeg-Builds/releases/tag/latest>)
|
|
- Add FFMPEG to path: `*\ffmpeg\bin` `*\ffmpeg\include\libavutil` `*\ffmpeg\lib`
|
|
|
|
### C++ API (optional)
|
|
|
|
To use Slint from C++, the following extra dependencies are needed:
|
|
|
|
- **[cmake](https://cmake.org/download/)** (3.21 or newer)
|
|
- **[Ninja](https://ninja-build.org)** (Optional, or remove the `-GNinja` when invoking `cmake`)
|
|
- A C++ compiler that supports C++20 (e.g., **MSVC 2022 17.3** on Windows, or **GCC 10**)
|
|
|
|
### Node.js API (optional)
|
|
|
|
To use Slint from Node.js, the following extra dependencies are needed.
|
|
|
|
- **[Node.js](https://nodejs.org/en/)** (including npm) At this time you will need to use the version 16.
|
|
- **[Python](https://www.python.org)**
|
|
|
|
### Symlinks in the repository (Windows)
|
|
|
|
The Slint repository makes use of symbolic links to avoid duplication.
|
|
On Windows, this require to set a git config before cloning, and have Windows
|
|
switched in developer mode or do the git clone as Administrator
|
|
|
|
```sh
|
|
git clone -c core.symlinks=true https://github.com/slint-ui/slint
|
|
```
|
|
|
|
More info: <https://github.com/git-for-windows/git/wiki/Symbolic-Links>
|
|
|
|
## Building and Testing
|
|
|
|
Most of the project is written in Rust, and compiling and running the test can
|
|
be done with cargo.
|
|
|
|
```sh
|
|
cargo build
|
|
cargo test
|
|
```
|
|
|
|
**Important:** Note that `cargo test` does not work without first calling `cargo build` because the
|
|
the required dynamic library won't be found.
|
|
|
|
### Building workspace
|
|
|
|
To build all examples install the entire workplace to executables
|
|
(excluding [UEFI-demo](https://github.com/slint-ui/slint/tree/master/examples/uefi-demo) - different target)
|
|
|
|
```sh
|
|
cargo build --workspace --exclude uefi-demo --release
|
|
```
|
|
|
|
### C++ Tests
|
|
|
|
The C++ tests are contained in the `test-driver-cpp` crate. It requires the Slint C++ library to be built,
|
|
which isn't done by default. Build it explicitly before running the tests:
|
|
|
|
```sh
|
|
cargo build --lib -p slint-cpp
|
|
cargo test -p test-driver-cpp
|
|
```
|
|
|
|
### Node.js Tests
|
|
|
|
The Node.js tests are contained in the `test-driver-nodejs` crate. The node integration will be run
|
|
automatically when running the tests:
|
|
|
|
```sh
|
|
cargo build -p test-driver-nodejs
|
|
```
|
|
|
|
### More Info About Tests
|
|
|
|
For more details about the tests and how they are implemented, see [testing.md](./testing.md).
|
|
|
|
## C++ API Build
|
|
|
|
The Slint C++ API is implemented as a normal cmake build:
|
|
|
|
```sh
|
|
mkdir cppbuild && cd cppbuild
|
|
cmake -GNinja ..
|
|
cmake --build .
|
|
```
|
|
|
|
The build will call cargo to build the Rust libraries, and build the examples.
|
|
To install the libraries and everything you need, use:
|
|
|
|
```sh
|
|
cmake --install .
|
|
```
|
|
|
|
You can pass `-DCMAKE_INSTALL_PREFIX` in the first cmake command in order to choose the installation location.
|
|
|
|
### Node.js API Build
|
|
|
|
The Slint Node.js API is implemented as npm build. You can build it locally using the following command line:
|
|
|
|
```sh
|
|
cd api/node
|
|
npm install
|
|
```
|
|
|
|
To build your own project against the Git version of the Slint Node.js API, add the path to the `api/node` folder
|
|
in the dependencies section of your `package.json`:
|
|
|
|
```json
|
|
"dependencies": {
|
|
"slint-ui": "/path/to/api/node"
|
|
},
|
|
```
|
|
|
|
## Cross-Compiling
|
|
|
|
Slint can be cross-compiled to different target architectures and environments. For the Rust build we
|
|
have had a good experience using [`cross`](https://github.com/rust-embedded/cross). For convenience we're
|
|
including a `Cross.toml` configuration file for `cross` in the source tree along with Docker containers that
|
|
allow targeting a Debian ARMv7 and ARMv8 based Distribution with X11 or Wayland, out of the box. If you want to use the default Cross containers or your own, make sure the [dependencies](#prerequisites) are in the container.
|
|
|
|
This includes for example the Raspberry Pi OS. Using the following steps you can run the examples on a
|
|
pi:
|
|
|
|
```sh
|
|
cross build --target armv7-unknown-linux-gnueabihf --workspace --exclude slint-node --exclude pyslint --release
|
|
scp target/armv7-unknown-linux-gnueabihf/release/printerdemo pi@raspberrypi.local:.
|
|
```
|
|
|
|
Finally on a shell on the Pi:
|
|
|
|
```sh
|
|
DISPLAY=:0 ./printerdemo
|
|
```
|
|
|
|
## Examples
|
|
|
|
See the [examples](/examples) folder for examples to build, run and test.
|
|
|
|
## Running the Viewer
|
|
|
|
Slint also includes a viewer tool that can load `.slint` files dynamically at run-time. It's a
|
|
cargo-integrated binary and can be run directly on the `.slint` files, for example:
|
|
|
|
```sh
|
|
cargo run --release --bin slint-viewer -- demos/printerdemo/ui/printerdemo.slint
|
|
```
|
|
|
|
## Generating the Documentation
|
|
|
|
The Slint documentation consists of five parts:
|
|
|
|
- The quickstart guide
|
|
- The Rust API documentation
|
|
- The C++ API documentation
|
|
- The Node.js API documentation
|
|
- The DSL documentation
|
|
|
|
The quickstart guide is part of the DSL documentation.
|
|
|
|
### Quickstart and DSL docs
|
|
|
|
See [astro/README.md](astro/README.md)
|
|
|
|
### Rust API docs
|
|
|
|
Run the following command to generate the documentation using rustdoc in the `target/doc/` sub-folder:
|
|
|
|
```sh
|
|
RUSTDOCFLAGS="--html-in-header=$PWD/docs/astro/src/utils/slint-docs-preview.html --html-in-header=$PWD/docs/astro/src/utils/slint-docs-highlight.html" cargo doc --package slint --no-deps --features slint/document-features,slint/log
|
|
```
|
|
|
|
Note: `--html-in-header` arguments passed to rustdoc via `RUSTDOCFLAGS` are used to enable syntax highlighting and live-preview for Slint example snippets.
|
|
|
|
### C++ API docs
|
|
|
|
**Prerequisites**:
|
|
|
|
- [Doxygen](https://www.doxygen.nl/download.html)
|
|
|
|
Run the following command to generate the documentation using sphinx/exhale/breathe/doxygen/myst_parser in the `target/cppdocs` sub-folder:
|
|
|
|
```sh
|
|
cargo xtask cppdocs
|
|
```
|
|
|
|
### Node.js API docs
|
|
|
|
Run the following commands from the `/api/node` sub-folder to generate the docs using [typedoc](https://typedoc.org/) in the `/api/node/docs` sub-folder:
|
|
|
|
```sh
|
|
npm install
|
|
npm run docs
|
|
```
|
|
|
|
### Building search database
|
|
|
|
We use Typesense for document search.
|
|
|
|
#### Infrastructure
|
|
|
|
* Typesense Server: The Typesense Server will hold the search index.
|
|
* Accessibility: The Typesense server must be accessible from the search bar in documentation site.
|
|
* Docker: Docker is needed to run the Typesense Docsearch Scraper.
|
|
* Typesense Docsearch Scraper: This tool will be used to index the documentation website.
|
|
|
|
#### Pre-requisites
|
|
|
|
* Install docker (<https://docs.docker.com/engine/install/>)
|
|
|
|
* Install jq
|
|
|
|
```sh
|
|
pip3 install jq
|
|
```
|
|
|
|
#### Testing Locally
|
|
|
|
* Install and start Typesense server (<https://typesense.org/docs/guide/install-typesense.html#option-2-local-machine-self-hosting>)
|
|
* Note down the API key, the default port, and the data directory.
|
|
|
|
* Verify that the server is running
|
|
* Replace the port below with the default port
|
|
* It should return {"ok":true} if the server is running correctly.
|
|
|
|
```sh
|
|
curl http://localhost:8108/health
|
|
```
|
|
|
|
#### Testing on Typesense Cloud
|
|
|
|
* Create an account as per instructions (<https://typesense.org/docs/guide/install-typesense.html#option-1-typesense-cloud>)
|
|
* Note down the API key and the hostname.
|
|
|
|
#### Creating search index
|
|
|
|
A helper script is located under `search` sub-folder that will (optionally) build the docs (currently only Slint docs), scrape the documents, and upload the search index to Typesense server.
|
|
|
|
The script accepts the following arguments
|
|
|
|
-a : API key to authenticate with Typesense Server (default: `xyz`)
|
|
|
|
-b : Build Slint docs (for testing locally set this flag ) (default: `false`)
|
|
|
|
-c : Location of config file (default: `docs/search/scraper-config.json`)
|
|
|
|
-d : Location of index.html of docs (default: `target/slintdocs/html`)
|
|
|
|
-i : Name of the search index (default: `local`)
|
|
|
|
-p : Port to access Typesense server (default: `8108`)
|
|
|
|
-r : Remote Server when using Typesense Cloud
|
|
|
|
-u : URL on which the docs will be served (default: `http://localhost:8000`)
|
|
|
|
Example when running locally
|
|
|
|
```sh
|
|
docs/search/docsearch-scraper.sh -b
|
|
```
|
|
|
|
Example when running on Typesense Cloud, where `$cluster_name` is the name of the cluster on Typesense Cloud
|
|
|
|
```sh
|
|
docs/search/docsearch-scraper.sh -a API_KEY -b -r TYPESENSE_CLOUD_HOST_NAME
|
|
```
|
|
|
|
#### Testing search functionality
|
|
|
|
Run http server
|
|
|
|
```sh
|
|
python3 -m http.server -d target/slintdocs/html
|
|
```
|
|
|
|
Open browser (<http://localhost:8000>) and use the search bar to search for content
|