Skip to content
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
Cannot retrieve contributors at this time

Kiwix Build

Kiwix Build provides advanced tools to (cross-)compile easily Kiwix & openZIM softwares and libraries and deploy them. They have been tested on Fedora 35+ & Ubuntu 18.04+.

Build Status License: GPL v3


You will need a recent version of Meson (>= 0.34) and Ninja (>= 1.6) If your distribution provides a recent enough versions for them, just install them with your package manager. Continue to read the instructions otherwise.

Before anything else you need to install Python3 related tools. On Debian based systems:

sudo apt-get install python3-pip virtualenv

Create a virtual environment to install python module in it instead of modifying the system.

virtualenv -p python3 ./ # Create virtualenv
source bin/activate      # Activate the virtualenv

Then, download and install kiwix-build and its dependencies:

git clone
cd kiwix-build
pip3 install .
hash -r # Refresh bash paths


The compilation is handled by the kiwix-build command. It will compile everything. If you are using a supported platform (Redhat or Debian based) it will install missing packages using sudo. You can get kiwix-build usage like this:

kiwix-build --help


You may want to compile a specific target so you will have to specify it on the

command line:

kiwix-build libkiwix # will build kiwix-build and its dependencies
kiwix-build kiwix-desktop # will build kiwix-desktop and its dependencies
kiwix-build zim-tools # will build zim-tools and its dependencies

By default, kiwix-build will build kiwix-tools .

To see the whole list of available targets run with non existing target, ex:

kiwix-build not-existing-target
invalid choice: 'not-existing-target' (choose from 'alldependencies', 'android-ndk',

Target platform

If no target platform is specified, the default will be native_dyn.

You can select another target platform using the option --target-platform. For now, there is ten different supported platforms:

  • native_dyn
  • native_mixed
  • native_static
  • win32_dyn
  • win32_static
  • android
  • android_arm
  • android_arm64
  • android_x86
  • android_x86_64
  • flatpak

So, if you want to compile kiwix-tools for win32 using static linkage:

kiwix-build --target-platform win32_dyn


kiwix-android ( depends of the libkiwix project. It uses a special .aar file that represent (and embed) the libkiwix for all supported android arch. This is a kind of fat archive we have for MacOs.

The .aar file is build using the libkiwix-app project. libkiwix-app itself is architecture independent (it is just a packaging of other archives) but it use libkiwix who is architecture dependent.

When building libkiwix, you should directly use the target-platform android_<arch>:

kiwix-build libkiwix --target-platform android_arm

But, libkiwix-app is mainly multi arch. To compile libkiwix-app, you must use the android platform:

kiwix-build --target-platform android libkiwix-app
kiwix-build libkiwix-app # because `android` platform is the default for `libkiwix-app`

By default, when using platform android, libkiwix will be build for all architectures. This can be changed by using the option --android-arch:

kiwix-build libkiwix-app # aar with all architectures
kiwix-build libkiwix-app --android-arch arm # aar with arm architecture
kiwix-build libkiwix-app --android-arch arm --android-arch arm64 # aan with arm and arm64 architectures

To build kiwix-android itself, you should see the documentation of kiwix-android.


When building for ios, we may want to compile a "fat library", a library for several architectures.

To do so, you should directly use the target-platfrom ios_multi. As for android, kiwix-build will build the library several times (once for each platform) and then create the fat library.

kiwix-build --target-platform iOS_multi libkiwix

You can specify the supported architectures with the option --ios-arch:

kiwix-build --target-platform iOS_multi libkiwix # all architetures
kiwix-build --target-platform iOS_multi --ios-arch arm --ios-arch arm64 # arm and arm64 arch only

Outputs will create several directories:

  • ARCHIVES: All the downloaded archives go there.
  • SOURCES: All the sources (extracted from archives and patched) go there.
  • BUILD_<target_platform>: All the build files go there.
  • BUILD_<target_platform>/INSTALL: The installed files go there.
  • BUILD_<target_platform>/LOGS: The logs files of the build.

If you want to install all those directories elsewhere, you can pass the --working-dir option to kiwix-build:

CI/CD containerised environments

Beside the kiwix-build command line tool, Kiwix Build proposes prepared compilation environments for multiple GNU/Linux systems too.

These prepared environments include: compilers, binary toolchains and any third-party tool necessary to run the compilation toolchain. They don't contain pre-compiled library dependences build by kiwix-build, (like Xapian, Libicu, Libmicrohttps, ...) but it contains dependencies installed with package manager.

These container images are necessary and intended to be used by Kiwix itself in many of its CI. But they are free to download et can be reused, although they can break anytime, therefore at your won risk. You can find them on here.


If you need to install Meson "manually":

virtualenv -p python3 ./ # Create virtualenv
source bin/activate      # Activate the virtualenv
pip3 install meson       # Install Meson
hash -r                  # Refresh bash paths

If you need to install Ninja "manually":

unzip ninja -d $HOME/bin


GPLv3 or later, see LICENSE for more details.