| # Building HarfBuzz | |
| HarfBuzz primarily uses the _meson_ build system. A community-maintained | |
| _CMake_ build system is also available. Finally, you can build HarfBuzz | |
| without a build system by compiling the amalgamated source file. | |
| ## Installing dependencies | |
| First, we need to install desired dependencies. None of these are strictly | |
| required to build the library, but when they are present, you can build the | |
| library with additional _integration_ features, such as _FreeType_ integration. | |
| The command-line tools (`hb-view`, `hb-shape`, `hb-info`, `hb-subset`) require | |
| _GLib_, while `hb-view` also requires _Cairo_. Most of the test suite requires | |
| _GLib_ to run. | |
| On Linux, install the development packages for FreeType, Cairo, and GLib. For | |
| example, on Ubuntu / Debian, you would do: | |
| $ sudo apt-get install meson pkg-config ragel gtk-doc-tools gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev | |
| whereas on Fedora, RHEL, CentOS, and other Red Hat based systems you would do: | |
| $ sudo dnf install meson pkgconfig gtk-doc gcc gcc-c++ freetype-devel glib2-devel cairo-devel | |
| and on ArchLinux and Manjaro: | |
| $ sudo pacman -Suy meson pkg-config ragel gcc freetype2 glib2 glib2-devel cairo | |
| On macOS: | |
| brew install pkg-config ragel gtk-doc freetype glib cairo meson | |
| ## Building HarfBuzz with meson | |
| Then use meson to build the project and run the tests, like: | |
| meson build && ninja -Cbuild && meson test -Cbuild | |
| On Windows, meson can build the project like above if a working MSVC's cl.exe | |
| (`vcvarsall.bat`) or gcc/clang is already on your path, and if you use | |
| something like `meson build --wrap-mode=default` it fetches and compiles most | |
| of the dependencies also. It is recommended to install CMake either manually | |
| or via the Visual Studio installer when building with MSVC, using meson. | |
| Our CI configurations are also a good source of learning how to build HarfBuzz. | |
| ## Building without a build system | |
| There is also amalgamated source provided with HarfBuzz which reduces whole process | |
| of building HarfBuzz to `c++ -c src/harfbuzz.cc` but there is no guarantee provided | |
| with buildability and reliability of features you get. This can be useful when | |
| embedding HarfBuzz in your project. | |
| For example, the `hb-shape` tool can be built simply as: | |
| $ c++ -O2 src/harfbuzz.cc util/hb-shape.cc -o hb-shape -I src -DHB_NO_FEATURES_H `pkg-config --cflags --libs glib-2.0` | |
| See `CONFIG.md` for ideas on how to shrink the feature set of your custom built | |
| HarfBuzz library. | |
| For an everything-included amalgamation that wires up the optional subsystems | |
| (subset, raster, vector, gpu, etc.) behind `HB_HAS_*` flags, use | |
| `src/harfbuzz-world.cc`. A live in-browser playground that builds against | |
| exactly that file lives at <https://harfbuzz-world.cc/> — its | |
| [source](https://github.com/harfbuzz/harfbuzz-world.cc) is a worked example | |
| of dropping HarfBuzz into a project with no build-system glue. |