3
0
Fork 0

Remove kiwix-builder.py script as it as been move in kiwix-build repo.

Also update README.md.
small_fixes
Matthieu Gautier 9 years ago
parent 384d113b6f
commit 25dc9b1d55

@ -1,90 +1,43 @@
Kiwix is an offline reader for Web content. It's especially thought to
make Wikipedia available offline. This is done by reading the content
of the project stored in a file format ZIM, a high compressed open
format with additional meta-data.
kiwix-tools
===========
This repository contains a set of tools to help development or usage
of kiwix.
kiwix-tools contains a set of tools to interact with kiwix and zim files.
# COMPILATION INSTRUCTIONS
Most of the compilation steps are handled by the kiwix-builder.py
script.
This script has been tested of Fedora 23 and Ubuntu 16.10
Build kiwix-tools
-----------------
Take care, the paragraphs are about the *target platforms*. If you
want to build Kiwix for Android on a GNU/Linux system, you should
follow the instructions of the "Android" paragraph.
## GNU/Linux
Install pre-requisties in your distro, eg, in Debian based:
Most of the compilation steps (including dependencies download and compilation)
are handle by [kiwix-build](https://github.com/kiwix/kiwix-build) script.
If you don't have any special need, we recommand you to use kiwix-build
instead of doing all the steps yourself.
sudo apt install git cmake meson python3-virtualenv virtualenvwrapper zlib1g-dev libicu-dev aria2 libtool
Dependencies:
### Dynamic
You'll need the following dependencies to build libkiwix:
Pretty simple once all dependencies are installed :
* [kiwix-lib](https://github.com/kiwix/kiwix-lib) (and its dependencies)
* [libmicrohttpd](http://www.openzim.org/wiki/Zimlib)
The archives and sources will be copied in your current working dir so
I recommend you to create a working directory:
As we use meson to build kiwix-tools, you will need the common meson tools:
* [meson](http://mesonbuild.com/) >= 0.34
* ninja
* pkg-config
$ mkdir <MY_WORKING_DIR>
$ cd <MY_WOKRING_DIR>
To build:
Once ready, just run the script with the install dir as argument:
```
$ cd kiwix-lib
$ meson . build
$ cd build
$ ninja
$ ninja install
```
$ kiwix-builder.py <INSTALL_DIR>
By default, it will compile dynamic linked binaries.
If you want statically linked binaries, you can add `--default-library=static`
option to the meson command.
The script will download and install all the needed dependencies and
kiwix related repository.
At the end of the script you will found the binaries in <INSTALL_DIR>/bin.
As it is a dynamic linked binary, you will need to add the lib directory to
LD_LIBRARY_PATH :
$ LD_LIBRARY_PATH=<INSTALL_DIR>/lib <INSTALL_DIR>/bin/kiwix-serve
### Static
To build a static binary simply add the --build_static option to the
kiwix-build.py script :
$ kiwix-builder.py --build_static <INSTALL_DIR>
Notes: You cannot use the same working directory to build a dynamic and static.
Notes: At the end of the script, meson may raise a error when it install the
kiwix-server binary. This is a meson bug and it has been fixed here
(https://github.com/mesonbuild/meson/pull/1240) but your meson version may
not include this fix.
However, the kiwix-server binary is valid and ready to use.
## Mac OSX Universal
The script has not been tested on Mac OSX.
Please, if you have a Mac OSX, try to run the kiwix-builder script and
report errors or, better, fixes :)
## Android and Windows
Cross compilation and strange stuff are to come.
If you wich to help, you're welcome.
# CONTACT
Email: kiwix-developer@lists.sourceforge.net or contact@kiwix.org
IRC: #kiwix on irc.freenode.net
(I'm hidding myself under the starmad pseudo)
You can use IRC web interface on http://chat.kiwix.org/
More... http://www.kiwix.org/wiki/Communication
# LEGAL & DISCLAIMER
Read 'COPYING' file
Licensed as GPLv3 or later, see COPYING for more details.

@ -1,499 +0,0 @@
#!/usr/bin/env python3
import os, sys
import argparse
import urllib.request
import tarfile
import subprocess
import hashlib
import shutil
from collections import defaultdict
pj = os.path.join
REMOTE_PREFIX = 'http://download.kiwix.org/dev/'
SOURCE_DIR = pj(os.getcwd(), "SOURCE")
ARCHIVE_DIR = pj(os.getcwd(), "ARCHIVE")
SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
################################################################################
##### UTILS
################################################################################
# Some utils taken from meson
def is_debianlike():
return os.path.isfile('/etc/debian_version')
def default_libdir():
if is_debianlike():
try:
pc = subprocess.Popen(['dpkg-architecture', '-qDEB_HOST_MULTIARCH'],
stdout=subprocess.PIPE,
stderr=subprocess.DEVNULL)
(stdo, _) = pc.communicate()
if pc.returncode == 0:
archpath = stdo.decode().strip()
return 'lib/' + archpath
except Exception:
pass
if os.path.isdir('/usr/lib64') and not os.path.islink('/usr/lib64'):
return 'lib64'
return 'lib'
def detect_ninja():
for n in ['ninja', 'ninja-build']:
try:
retcode = subprocess.check_call([n, '--version'],
stdout=subprocess.DEVNULL)
except (FileNotFoundError, PermissionError):
# Doesn't exist in PATH or isn't executable
continue
if retcode == 0:
return n
def detect_meson():
for n in ['meson.py', 'meson']:
try:
retcode = subprocess.check_call([n, '--version'],
stdout=subprocess.DEVNULL)
except (FileNotFoundError, PermissionError):
# Doesn't exist in PATH or isn't executable
continue
if retcode == 0:
return n
class Defaultdict(defaultdict):
def __getattr__(self, name):
return self[name]
def get_sha256(path):
sha256 = hashlib.sha256()
with open(path, 'br') as f:
sha256.update(f.read())
return sha256.hexdigest()
class SkipCommand(Exception):
pass
class StopBuild(Exception):
pass
def command(name, withlog='source_path', autoskip=False):
def decorator(function):
def wrapper(self, *args):
print(" {} {} : ".format(name, self.name), end="", flush=True)
if autoskip and os.path.exists(pj(self.source_path, ".{}_ok".format(name))):
print("SKIP")
return
log = pj(getattr(self, withlog), 'cmd_{}_{}.log'.format(name, self.name))
try:
with open(log, 'w') as _log:
ret = function(self, *args, log=_log)
print("OK")
if autoskip:
with open(pj(self.source_path, ".{}_ok".format(name)), 'w') as f: pass
return ret
except SkipCommand:
print("SKIP")
except subprocess.CalledProcessError:
print("ERROR")
with open(log, 'r') as f:
print(f.read())
raise StopBuild()
except:
print("ERROR")
raise
return wrapper
return decorator
def run_command(command, cwd, log, env=None, input=None):
log.write("run command '{}'\n".format(command))
if env:
log.write("env is :\n")
for k, v in env.items():
log.write(" {} : {!r}\n".format(k, v))
log.flush()
kwargs = dict()
if env:
kwargs['env'] = env
if input:
kwargs['stdin'] = input
return subprocess.check_call(command, shell=True, cwd=cwd, stdout=log, stderr=subprocess.STDOUT, **kwargs)
################################################################################
##### PROJECT
################################################################################
class Dependency:
@property
def source_path(self):
return pj(SOURCE_DIR, self.source_dir)
class ReleaseDownloadMixin:
_log_download = ARCHIVE_DIR
_log_source = SOURCE_DIR
archive_top_dir = ""
@property
def archive_path(self):
return pj(ARCHIVE_DIR, self.archive_name)
@property
def extract_path(self):
return SOURCE_DIR
@property
def archive_top_path(self):
return pj(SOURCE_DIR, self.archive_top_dir or self.source_dir)
@command("download", withlog='_log_download')
def _download(self, log):
if os.path.exists(self.archive_path):
sha256 = get_sha256(self.archive_path)
if sha256 == self.archive_sha256:
raise SkipCommand()
os.remove(self.archive_path)
remote = REMOTE_PREFIX + self.archive_name
urllib.request.urlretrieve(remote, self.archive_path)
@command("extract", withlog='_log_source', autoskip=True)
def _extract(self, log):
if os.path.exists(self.source_path):
shutil.rmtree(self.source_path)
with tarfile.open(self.archive_path) as archive:
archive.extractall(self.extract_path)
@command("patch", autoskip=True)
def _patch(self, log):
if not hasattr(self, 'patch'):
raise SkipCommand()
with open(pj(SCRIPT_DIR, 'patches', self.patch), 'r') as patch_input:
run_command("patch -p1", self.source_path, log, input=patch_input)
def prepare(self, options):
self._download()
self._extract()
self._patch()
class GitCloneMixin:
_log_clone = SOURCE_DIR
git_ref = "master"
@property
def git_path(self):
return pj(SOURCE_DIR, self.git_dir)
@command("gitclone", withlog='_log_clone')
def _git_clone(self, log):
if os.path.exists(self.git_path):
raise SkipCommand()
command = "git clone " + self.git_remote
run_command(command, SOURCE_DIR, log)
@command("gitupdate")
def _git_update(self, log):
run_command("git pull", self.git_path, log)
run_command("git checkout "+self.git_ref, self.git_path, log)
def prepare(self, options):
self._git_clone()
self._git_update()
class MakeMixin:
configure_option = ""
make_option = ""
install_option = ""
configure_script = "./configure"
configure_env = None
@command("configure", autoskip=True)
def _configure(self, options, log):
command = "{configure_script} {configure_option} --prefix {install_dir} --libdir {libdir}"
command = command.format(
configure_script = self.configure_script,
configure_option = self.configure_option,
install_dir = options.install_dir,
libdir = pj(options.install_dir, options.libprefix)
)
env = Defaultdict(str, os.environ)
if options.build_static:
env['CFLAGS'] = env['CFLAGS'] + ' -fPIC'
if self.configure_env:
for k in self.configure_env:
if k.startswith('_format_'):
v = self.configure_env.pop(k)
v = v.format(options=options, env=env)
self.configure_env[k[8:]] = v
env.update(self.configure_env)
run_command(command, self.source_path, log, env=env)
@command("compile", autoskip=True)
def _compile(self, log):
command = "make -j4 " + self.make_option
run_command(command, self.source_path, log)
@command("install", autoskip=True)
def _install(self, log):
command = "make install " + self.make_option
run_command(command, self.source_path, log)
def build(self, options):
self._configure(options)
self._compile()
self._install()
class CMakeMixin(MakeMixin):
@command("configure", autoskip=True)
def _configure(self, options, log):
command = "cmake {configure_option} -DCMAKE_INSTALL_PREFIX={install_dir} -DCMAKE_INSTALL_LIBDIR={libdir}"
command = command.format(
configure_option = self.configure_option,
install_dir = options.install_dir,
libdir = options.libprefix
)
env = Defaultdict(str, os.environ)
if options.build_static:
env['CFLAGS'] = env['CFLAGS'] + ' -fPIC'
if self.configure_env:
for k in self.configure_env:
if k.startswith('_format_'):
v = self.configure_env.pop(k)
v = v.format(options=options, env=env)
self.configure_env[k[8:]] = v
env.update(self.configure_env)
run_command(command, self.source_path, log, env=env)
class MesonMixin(MakeMixin):
meson_command = detect_meson()
ninja_command = detect_ninja()
@property
def build_path(self):
return pj(self.source_path, 'build')
def _gen_env(self, options):
env = Defaultdict(str, os.environ)
env['PKG_CONFIG_PATH'] = (env['PKG_CONFIG_PATH'] + ':' + pj(options.install_dir, options.libprefix, 'pkgconfig')
if env['PKG_CONFIG_PATH']
else pj(options.install_dir, options.libprefix, 'pkgconfig')
)
env['PATH'] = ':'.join([pj(options.install_dir, 'bin'), env['PATH']])
if options.build_static:
env['LDFLAGS'] = env['LDFLAGS'] + " -static-libstdc++ --static"
return env
@command("configure", autoskip=True)
def _configure(self, options, log):
if os.path.exists(self.build_path):
shutil.rmtree(self.build_path)
os.makedirs(self.build_path)
env = self._gen_env(options)
if options.build_static:
library_type = 'static'
else:
library_type = 'shared'
configure_option = self.configure_option.format(options=options)
command = "{command} --default-library={library_type} {configure_option} . build --prefix={options.install_dir} --libdir={options.libprefix}".format(
command = self.meson_command,
library_type=library_type,
configure_option=configure_option,
options=options)
run_command(command, self.source_path, log, env=env)
@command("compile")
def _compile(self, options, log):
env = self._gen_env(options)
command = "{} -v".format(self.ninja_command)
run_command(command, self.build_path, log, env=env)
@command("install")
def _install(self, options, log):
env = self._gen_env(options)
command = "{} -v install".format(self.ninja_command)
run_command(command, self.build_path, log)
def build(self, options):
self._configure(options)
self._compile(options)
self._install(options)
# *************************************
# Missing dependencies
# Is this ok to assume that those libs
# exist in your "distri" (linux/mac) ?
# If not, we need to compile them here
# *************************************
# Zlib
# LZMA
# aria2
# Argtable
# MSVirtual
# Android
# libiconv
# gettext
# *************************************
class UUID(Dependency, ReleaseDownloadMixin, MakeMixin):
name = 'uuid'
archive_name = 'e2fsprogs-1.42.tar.gz'
archive_sha256 = '55b46db0cec3e2eb0e5de14494a88b01ff6c0500edf8ca8927cad6da7b5e4a46'
source_dir = 'e2fsprogs-1.42'
configure_option = "--enable-libuuid"
configure_env = {'_format_CFLAGS' : "{env.CFLAGS} -fPIC"}
@command("compile", autoskip=True)
def _compile(self, log):
command = "make -j4 libs " + self.make_option
run_command(command, self.source_path, log)
@command("install", autoskip=True)
def _install(self, log):
command = "make install-libs " + self.make_option
run_command(command, self.source_path, log)
class Xapian(Dependency, ReleaseDownloadMixin, MakeMixin):
name = "xapian"
archive_name = 'xapian-core-1.4.0.tar.xz'
source_dir = 'xapian-core-1.4.0'
archive_sha256 = '10584f57112aa5e9c0e8a89e251aecbf7c582097638bfee79c1fe39a8b6a6477'
configure_option = "--enable-shared --enable-static --disable-sse --disable-backend-inmemory"
patch = "xapian_pkgconfig.patch"
configure_env = {'_format_LDFLAGS' : "-L{options.install_dir}/{options.libprefix}",
'_format_CXXFLAGS' : "-I{options.install_dir}/include"}
class CTPP2(Dependency, ReleaseDownloadMixin, CMakeMixin):
name = "ctpp2"
archive_name = 'ctpp2-2.8.3.tar.gz'
source_dir = 'ctpp2-2.8.3'
archive_sha256 = 'a83ffd07817adb575295ef40fbf759892512e5a63059c520f9062d9ab8fb42fc'
configure_option = "-DMD5_SUPPORT=OFF"
patch = "ctpp2_include.patch"
class Pugixml(Dependency, ReleaseDownloadMixin, MesonMixin):
name = "pugixml"
archive_name = 'pugixml-1.2.tar.gz'
extract_path = pj(SOURCE_DIR, 'pugixml-1.2')
source_dir = 'pugixml-1.2'
archive_sha256 = '0f422dad86da0a2e56a37fb2a88376aae6e931f22cc8b956978460c9db06136b'
patch = "pugixml_meson.patch"
class MicroHttpd(Dependency, ReleaseDownloadMixin, MakeMixin):
name = "microhttpd"
archive_name = 'libmicrohttpd-0.9.19.tar.gz'
source_dir = 'libmicrohttpd-0.9.19'
archive_sha256 = 'dc418c7a595196f09d2f573212a0d794404fa4ac5311fc9588c1e7ad7a90fae6'
configure_option = "--enable-shared --enable-static --disable-https --without-libgcrypt --without-libcurl"
class Icu(Dependency, ReleaseDownloadMixin, MakeMixin):
name = "icu"
archive_name = 'icu4c-56_1-src.tgz'
archive_sha256 = '3a64e9105c734dcf631c0b3ed60404531bce6c0f5a64bfe1a6402a4cc2314816'
archive_top_dir = 'icu'
data_name = 'icudt56l.dat'
data_sha256 = 'e23d85eee008f335fc49e8ef37b1bc2b222db105476111e3d16f0007d371cbca'
source_dir = 'icu/source'
configure_option = "Linux --disable-samples --disable-tests --disable-extras --enable-static --disable-dyload"
configure_script = "./runConfigureICU"
@property
def data_path(self):
return pj(ARCHIVE_DIR, self.data_name)
@command("download_data", autoskip=True)
def _download_data(self, log):
if os.path.exists(self.data_path):
sha256 = get_sha256(self.data_path)
if sha256 == self.data_sha256:
raise SkipCommand()
os.remove(self.data_path)
remote = REMOTE_PREFIX + self.data_name
urllib.request.urlretrieve(remote, self.data_path)
@command("copy_data", autoskip=True)
def _copy_data(self, log):
shutil.copyfile(self.data_path, pj(self.source_path, 'data', 'in', self.data_name))
def prepare(self, options):
super().prepare(options)
self._download_data()
self._copy_data()
class Zimlib(Dependency, GitCloneMixin, MesonMixin):
name = "zimlib"
#git_remote = "https://gerrit.wikimedia.org/r/p/openzim.git"
git_remote = "https://github.com/mgautierfr/openzim"
git_dir = "openzim"
git_ref = "meson"
source_dir = "openzim/zimlib"
class Kiwixlib(Dependency, GitCloneMixin, MesonMixin):
name = "kiwix-lib"
git_remote = "https://github.com/kiwix/kiwix-lib.git"
git_dir = "kiwix-lib"
source_dir = "kiwix-lib"
configure_option = "-Dctpp2-install-prefix={options.install_dir}"
class KiwixTools(Dependency, GitCloneMixin, MesonMixin):
name = "kiwix-tools"
git_remote = "https://github.com/kiwix/kiwix-tools.git"
git_dir = "kiwix-tools"
source_dir = "kiwix-tools"
configure_option = "-Dctpp2-install-prefix={options.install_dir}"
class Project:
def __init__(self, options):
self.options = options
self.dependencies = [UUID(), Xapian(), CTPP2(), Pugixml(), Zimlib(), MicroHttpd(), Icu(), Kiwixlib(), KiwixTools()]
os.makedirs(SOURCE_DIR, exist_ok=True)
os.makedirs(ARCHIVE_DIR, exist_ok=True)
def prepare(self):
for dependency in self.dependencies:
print("prepare {} :".format(dependency.name))
dependency.prepare(self.options)
def build(self):
for dependency in self.dependencies:
print("build {} :".format(dependency.name))
dependency.build(self.options)
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('install_dir')
parser.add_argument('--libprefix', default=default_libdir())
parser.add_argument('--target_arch', default="x86_64")
parser.add_argument('--build_static', action="store_true")
return parser.parse_args()
if __name__ == "__main__":
options = parse_args()
options.install_dir = os.path.abspath(options.install_dir)
project = Project(options)
try:
print("[PREPARE]")
project.prepare()
print("[BUILD]")
project.build()
except StopBuild:
print("Stopping build due to errors")

@ -1,6 +0,0 @@
34a35,39
> #ifdef _WIN32
> #include <Windows.h>
> #else
> #include <unistd.h>
> #endif

@ -1,53 +0,0 @@
Seulement dans ctpp2-2.8.3.patched/: BitIndexTest
Seulement dans ctpp2-2.8.3.patched/: CDT2JSONBenchmark
Seulement dans ctpp2-2.8.3.patched/: CDTPerfTest
Seulement dans ctpp2-2.8.3.patched/: CDTTest
Seulement dans ctpp2-2.8.3.patched/: CMakeCache.txt
Seulement dans ctpp2-2.8.3.patched/: CMakeFiles
Seulement dans ctpp2-2.8.3.patched/: cmake_install.cmake
Seulement dans ctpp2-2.8.3.patched/: cmd_compile_ctpp2.log
Seulement dans ctpp2-2.8.3.patched/: cmd_configure_ctpp2.log
Seulement dans ctpp2-2.8.3.patched/: cmd_install_ctpp2.log
Seulement dans ctpp2-2.8.3.patched/: cmd_patch_ctpp2.log
Seulement dans ctpp2-2.8.3.patched/: .compile_ok
Seulement dans ctpp2-2.8.3.patched/: .configure_ok
Seulement dans ctpp2-2.8.3.patched/: CTestTestfile.cmake
Seulement dans ctpp2-2.8.3.patched/: ctpp2c
Seulement dans ctpp2-2.8.3.patched/: ctpp2-config
Seulement dans ctpp2-2.8.3.patched/: CTPP2DTOATest
Seulement dans ctpp2-2.8.3.patched/: ctpp2i
Seulement dans ctpp2-2.8.3.patched/: ctpp2json
Seulement dans ctpp2-2.8.3.patched/: ctpp2vm
Seulement dans ctpp2-2.8.3.patched/: CTPP2VMTest
Seulement dans ctpp2-2.8.3.patched/: .extract_ok
Seulement dans ctpp2-2.8.3.patched/: HashTest
diff -ru ctpp2-2.8.3/include/CTPP2SourceLoader.hpp ctpp2-2.8.3.patched/include/CTPP2SourceLoader.hpp
--- ctpp2-2.8.3/include/CTPP2SourceLoader.hpp 2012-08-02 09:22:44.000000000 +0200
+++ ctpp2-2.8.3.patched/include/CTPP2SourceLoader.hpp 2016-12-09 14:26:49.965635367 +0100
@@ -32,6 +32,11 @@
#ifndef _CTPP2_SOURCE_LOADER_HPP__
#define _CTPP2_SOURCE_LOADER_HPP__ 1
+#ifdef _WIN32
+#include <Windows.h>
+#else
+ #include <unistd.h>
+#endif
#include "CTPP2Types.h"
/**
Seulement dans ctpp2-2.8.3.patched/include: CTPP2SysHeaders.h
Seulement dans ctpp2-2.8.3.patched/: install_manifest.txt
Seulement dans ctpp2-2.8.3.patched/: .install_ok
Seulement dans ctpp2-2.8.3.patched/: libctpp2.so
Seulement dans ctpp2-2.8.3.patched/: libctpp2.so.2
Seulement dans ctpp2-2.8.3.patched/: libctpp2.so.2.8.3
Seulement dans ctpp2-2.8.3.patched/: libctpp2-st.a
Seulement dans ctpp2-2.8.3.patched/: Makefile
Seulement dans ctpp2-2.8.3.patched/: .patch_ok
Seulement dans ctpp2-2.8.3.patched/: simple-compiler
Seulement dans ctpp2-2.8.3.patched/: simple-vm
Seulement dans ctpp2-2.8.3.patched/: StaticTextTest
Seulement dans ctpp2-2.8.3.patched/: template_language.html
Seulement dans ctpp2-2.8.3.patched/: VMArgStackTest
Seulement dans ctpp2-2.8.3.patched/: VMCodeStackTest

@ -1,22 +0,0 @@
Les sous-répertoires pugixml-1.2.orig/contrib et pugixml-1.2/contrib sont identiques
Les sous-répertoires pugixml-1.2.orig/docs et pugixml-1.2/docs sont identiques
diff -Nu pugixml-1.2.orig/meson.build pugixml-1.2/meson.build
--- pugixml-1.2.orig/meson.build 1970-01-01 01:00:00.000000000 +0100
+++ pugixml-1.2/meson.build 2016-12-09 16:40:24.749898766 +0100
@@ -0,0 +1,13 @@
+project('pugixml', 'cpp')
+
+install_headers(['src/pugixml.hpp', 'src/pugiconfig.hpp'])
+pugixml = library('pugixml',
+ ['src/pugixml.cpp'],
+ install:true)
+
+pkg_mod = import('pkgconfig')
+pkg_mod.generate(libraries : pugixml,
+ version : '1.2',
+ name : 'libpugixml',
+ description : 'pugixml',
+ filebase : 'pugixml')
\ Pas de fin de ligne à la fin du fichier
Les sous-répertoires pugixml-1.2.orig/scripts et pugixml-1.2/scripts sont identiques
Les sous-répertoires pugixml-1.2.orig/src et pugixml-1.2/src sont identiques

@ -1,10 +0,0 @@
diff -ru xapian-core-1.4.0/pkgconfig/xapian-core.pc.in xapian-core-1.4.0_patched/pkgconfig/xapian-core.pc.in
--- xapian-core-1.4.0/pkgconfig/xapian-core.pc.in 2016-06-25 17:36:49.000000000 +0200
+++ xapian-core-1.4.0_patched/pkgconfig/xapian-core.pc.in 2016-12-19 20:45:25.716329832 +0100
@@ -11,4 +11,5 @@
URL: https://xapian.org/
Version: @VERSION@
Cflags: -I${includedir} @abi_affecting_cxxflags@
-Libs: @ldflags@ -L${libdir} -lxapian@LIBRARY_VERSION_SUFFIX@
+Libs: @ldflags@ -L${libdir} -lxapian@LIBRARY_VERSION_SUFFIX@ -lrt
+Requires: uuid
Loading…
Cancel
Save