summaryrefslogtreecommitdiff
path: root/BUILD.adoc
blob: 4b41d20f953a32b99b980c9f8f1c07e1a19c10cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
:toc:
:toc-title:

= How to build *resvg*

== Into

*resvg* doesn't include a 2D graphics library and uses external ones via https://en.wikipedia.org/wiki/Foreign_function_interface[FFI].
Their support is implemented separately, therefore we call them _backends_.
You can build them separately or together. +
At the moment, there are only two backends: *Qt* and *cairo*.
The first one uses the https://www.qt.io/[Qt framework] and the second one uses the
https://www.cairographics.org/[cairo] library.

Since *resvg* is a https://www.rust-lang.org/[Rust] library, you should build it via `cargo`. +
To enable a backend use the `--features` option:

```bash
# Build with a Qt backend
cargo build --release --features="qt-backend"
# or with a cairo backend
cargo build --release --features="cairo-backend"
# or with both
cargo build --release --features="qt-backend cairo-backend"
```

== Dependencies

- The library requires the latest stable
  https://www.rust-lang.org/tools/install[Rust].
- _Qt backend_ requires only `QtCore` and `QtGui` libraries
  and the JPEG image format plugin (aka `plugins/imageformats/qjpeg`). +
  Technically, any Qt 5 version should work, but we only support Qt >= 5.6.

- _cairo backend_ requires https://www.cairographics.org/[cairo] itself and https://www.pango.org/[pango] for text rendering (with the `pangocairo` glue library, which is an optional part of the `pango`). +
  There is no specific minimal supported version at the moment.

== Windows

=== Qt backend via MSVC

Install `stable-x86_64-pc-windows-msvc` https://www.rust-lang.org/tools/install[Rust] target.

Install Qt built with MSVC via an
http://download.qt.io/official_releases/online_installers/qt-unified-windows-x86-online.exe[official installer].

Build using `cmd.exe`:

```batch
set PATH=%userprofile%\.cargo\bin;%PATH%
set QT_DIR=C:\Qt\5.12.0\msvc2015_64

cargo.exe build --release --features "qt-backend"
```

Instead of `msvc2015_64` you can use any other Qt MSVC build. Even 32-bit one. +
We are using Qt 5.12.0 just for example.

=== Qt backend via MinGW

Install `stable-i686-pc-windows-gnu` https://www.rust-lang.org/tools/install[Rust] target.

Install Qt built with MinGW 32-bit via an
http://download.qt.io/official_releases/online_installers/qt-unified-windows-x86-online.exe[official installer]. +
64-bit version, available since Qt 5.12, will not work due to https://github.com/rust-lang/rust/issues/47048[#47048].

Build using `cmd.exe`:

```batch
set PATH=C:\Qt\5.11.3\mingw53_32\bin;C:\Qt\Tools\mingw530_32\bin;%userprofile%\.cargo\bin;%PATH%
set QT_DIR=C:\Qt\5.11.3\mingw53_32

cargo.exe build --release --features "qt-backend"
```

Instead of `mingw53_32` you can use any other Qt mingw build. +
We are using Qt 5.11.3 just for example.

=== cairo backend via MSYS2

Install `stable-x86_64-pc-windows-gnu` https://www.rust-lang.org/tools/install[Rust] target.

Install GTK+ dependencies using MSYS2 as explained
http://gtk-rs.org/docs/requirements.html#windows[here].

We do not need the whole GTK+, so we can install only `pango` (which will install
`cairo` too) and `gdk-pixbuf2`:

```bash
pacman -S mingw-w64-x86_64-pango mingw-w64-x86_64-gdk-pixbuf2

cargo.exe build --release --features "cairo-backend"
```

You can use x86/i686 target in the same way.

== Linux

=== Qt backend

Install Qt 5 using your distributive package manager and then build *resvg*:

```bash
cargo build --release --features "qt-backend"
```

If you don't want to use a system Qt, you can alter it with the `PKG_CONFIG_PATH` variable.

```bash
PKG_CONFIG_PATH='/path_to_qt/lib/pkgconfig' cargo build --release --features "qt-backend"
```

=== cairo backend

Install `cairo`, `pango` (with `pangocairo`) and `gdk-pixbuf` using your distributive package manager.

For Ubuntu its `libpango1.0-dev` (will pull `cairo` too) and `libgdk-pixbuf2.0-dev`.

```bash
cargo build --release --features "cairo-backend"
```

== macOS

=== Qt backend

Using https://brew.sh/[homebrew]:

```bash
brew install qt

QT_DIR=/usr/local/opt/qt cargo build --release --features "qt-backend"
```

Or an
http://download.qt.io/official_releases/online_installers/qt-unified-mac-x64-online.dmg[official Qt installer]:

```bash
QT_DIR=/Users/$USER/Qt/5.12.0/clang_64 cargo build --release --features "qt-backend"
```

We are using Qt 5.12.0 just for example.

=== cairo backend

Using https://brew.sh/[homebrew]:

```bash
brew install cairo pango gdk-pixbuf

cargo build --release --features "cairo-backend"
```

== For maintainers

*resvg* consists of 4 parts:

- the Rust library (link:./src[src])
- the C library/bindings (link:./capi[capi])
- the CLI tool to render SVG (link:./tools/rendersvg[tools/rendersvg])
- the CLI tool to simplify SVG (link:./tools/usvg[tools/usvg])

All of them are optional and each one, except `usvg`, can be built with a specific backend.

No need to build `rendersvg` for each backend separately since it has a CLI switch
to choose which one to use in runtime.
Not sure how the Rust library can be packaged, but the C libraries should probably be built
separately.

So the final package can look like this:

```
/bin/rendersvg (does not depend on *.so)
/bin/usvg (completely optional)
/include/resvg.h (from capi/include)
/include/ResvgQt.h (from capi/include)
/lib/libresvg-cairo.so
/lib/libresvg-qt.so
```