preload-hacks: Some patches to make it work.
[termux-packages] / README.md
CommitLineData
4edf9992
FF
1Termux packages
2===============
93cbd42b 3[![Build Status](https://travis-ci.org/termux/termux-packages.svg?branch=master)](https://travis-ci.org/termux/termux-packages)
006983b2 4[![Join the chat at https://gitter.im/termux/termux](https://badges.gitter.im/termux/termux.svg)](https://gitter.im/termux/termux)
5b9b57e3 5
bd2f734a 6This project contains scripts and patches to build packages for the [Termux](https://termux.com/) Android application. Note that packages are cross compiled and that on-device builds are not currently supported.
798619b9 7
6bde679f
FF
8Setting up a build environment using Docker
9===========================================
d7af85ec 10For most people the best way to obtain an environment for building packages is by using Docker. This should work everywhere Docker is supported (replace `/` with `\` if using Windows) and ensures an up to date build environment that is tested by other package builders.
1773070c 11
6bde679f 12Run the following script to setup a container (from an image created by [scripts/Dockerfile](scripts/Dockerfile)) suitable for building packages:
22dd00cb 13
fa0a18ce 14 ./scripts/run-docker.sh
1773070c 15
6bde679f 16This source folder is mounted as the `/root/termux-packages` data volume, so changes are kept
6dd45156
FF
17in sync between the host and the container when trying things out before committing, and built
18deb files will be available on the host in the `debs/` directory just as when building on the host.
5e8045c9 19
777a4af8 20The docker container used for building packages is a Ubuntu 17.10 installation with necessary packages
6bde679f
FF
21pre-installed. The default user is a non-root user to avoid problems with package builds modifying the system
22by mistake, but `sudo` can be used to install additional Ubuntu packages to be used during development.
23
a0057943
FF
24Build commands can be given to be executed in the docker container directly:
25
26 ./scripts/run-docker.sh ./build-package.sh libandroid-support
27
28will launch the docker container, execute the `./build-package.sh libandroid-support`
29command inside it and afterwards return you to the host prompt, with the newly built
30deb in `debs/` to try out.
5e8045c9 31
6bde679f
FF
32Note that building packages can take up a lot of space (especially if `build-all.sh` is used to build all packages) and you may need to [increase the base device size](http://www.projectatomic.io/blog/2016/03/daemon_option_basedevicesize/) if running with a storage driver using a small base size of 10 GB.
33
34Build environment without Docker
35================================
777a4af8 36If you can't run Docker you can use a Ubuntu 17.10 installation (either by installing a virtual maching guest or on direct hardware) by using the below scripts:
6bde679f
FF
37
38- Run `scripts/setup-ubuntu.sh` to install required packages and setup the `/data/` folder.
39
40- Run `scripts/setup-android-sdk.sh` to install the Android SDK and NDK at `$HOME/lib/android-{sdk,ndk}`.
41
42There is also a [Vagrantfile](scripts/Vagrantfile) available as a shortcut for setting up an Ubuntu installation with the above steps applied.
43
9ecaa95d
FF
44Building a package
45==================
88183689 46The basic build operation is to run `./build-package.sh $PKG`, which:
798619b9 47
6dd45156 481. Sets up a patched stand-alone Android NDK toolchain if necessary.
9ecaa95d 49
6dd45156 502. Reads `packages/$PKG/build.sh` to find out where to find the source code of the package and how to build it.
a0057943 51
6dd45156 523. Extracts the source in `$HOME/.termux-build/$PKG/src`.
9ecaa95d 53
6dd45156 544. Applies all patches in packages/$PKG/\*.patch.
9ecaa95d 55
6dd45156 565. Builds the package under `$HOME/.termux-build/$PKG/` (either in the build/ directory there or in the
a0057943
FF
57 src/ directory if the package is specified to build in the src dir) and installs it to `$PREFIX`.
58
6dd45156 596. Extracts modified files in `$PREFIX` into `$HOME/.termux-build/$PKG/massage` and massages the
a0057943 60 files there for distribution (removes some files, splits it up in sub-packages, modifies elf files).
9ecaa95d 61
6dd45156 627. Creates a deb package file for distribution in `debs/`.
1773070c 63
6dd45156 64Reading [build-package.sh](build-package.sh) is the best way to understand what is going on.
798619b9 65
9ecaa95d
FF
66Additional utilities
67====================
88183689 68* build-all.sh: used for building all packages in the correct order (using buildorder.py).
9ecaa95d 69
2fe052c8 70* clean.sh: used for doing a clean rebuild of all packages.
9ecaa95d 71
88183689 72* scripts/check-pie.sh: Used for verifying that all binaries are using PIE, which is required for Android 5+.
9ecaa95d 73
88183689 74* scripts/check-versions.sh: used for checking for package updates.
9ecaa95d 75
88183689 76* scripts/list-packages.sh: used for listing all packages with a one-line summary.
798619b9
FF
77
78
1a8d12c2
FF
79Resources
80=========
81* [Android changes for NDK developers](https://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md)
82
40dcead0 83* [Linux From Scratch](http://www.linuxfromscratch.org/lfs/view/stable/)
798619b9 84
88183689 85* [Beyond Linux From Scratch](http://www.linuxfromscratch.org/blfs/view/stable/)
798619b9 86
88183689 87* [OpenWrt](https://openwrt.org/) as an embedded Linx distribution contains [patches and build scripts](https://dev.openwrt.org/browser/packages)
798619b9 88
88183689 89* [Kivy recipes](https://github.com/kivy/python-for-android/tree/master/pythonforandroid/recipes) contains recipes for building packages for Android.
798619b9
FF
90
91
92Common porting problems
93=======================
26e75e88 94* The Android bionic libc does not have iconv and gettext/libintl functionality built in. A `libandroid-support` package contains these and may be used by all packages.
798619b9
FF
95
96* "error: z: no archive symbol table (run ranlib)" usually means that the build machines libz is used instead of the one for cross compilation, due to the builder library -L path being setup incorrectly
97
26e75e88 98* rindex(3) does not exist, but strrchr(3) is preferred anyway.
798619b9
FF
99
100* <sys/termios.h> does not exist, but <termios.h> is the standard location.
101
102* <sys/fcntl.h> does not exist, but <fcntl.h> is the standard location.
103
26e75e88 104* <sys/timeb.h> does not exist (removed in POSIX 2008), but ftime(3) can be replaced with gettimeofday(2).
798619b9 105
26e75e88 106* <glob.h> does not exist, but is available through the `libandroid-glob` package.
798619b9 107
26e75e88 108* SYSV shared memory is not supported by the kernel. A `libandroid-shmem` package, which emulates SYSV shared memory on top of the [ashmem](http://elinux.org/Android_Kernel_Features#ashmem) shared memory system, is available. Use it with `LDFLAGS+=" -landroid-shmem`.
798619b9 109
26e75e88 110* SYSV semaphores is not supported by the kernel. Use unnamed POSIX semaphores instead (named semaphores are unimplemented).
c4804ab8 111
798619b9
FF
112dlopen() and RTLD_* flags
113=================================
d3e5452e 114<dlfcn.h> declares
798619b9 115
d3e5452e
FF
116 RTLD_NOW=0; RTLD_LAZY=1; RTLD_LOCAL=0; RTLD_GLOBAL=2; RTLD_NOLOAD=4; // 32-bit
117 RTLD_NOW=2; RTLD_LAZY=1; RTLD_LOCAL=0; RTLD_GLOBAL=0x00100; RTLD_NOLOAD=4; // 64-bit
798619b9
FF
118
119These differs from glibc ones in that
120
d3e5452e
FF
1211. They differ in value from glibc ones, so cannot be hardcoded in files (DLFCN.py in python does this)
1222. They are missing some values (`RTLD_BINDING_MASK`, ...)
798619b9 123
f4aa879e
FF
124Android Dynamic Linker
125======================
126The Android dynamic linker is located at `/system/bin/linker` (32-bit) or `/system/bin/linker64` (64-bit). Here are source links to different versions of the linker:
1ddf1728 127
f4aa879e
FF
128- [Android 5.0 linker](https://android.googlesource.com/platform/bionic/+/lollipop-mr1-release/linker/linker.cpp)
129- [Android 6.0 linker](https://android.googlesource.com/platform/bionic/+/marshmallow-mr1-release/linker/linker.cpp)
130- [Android 7.0 linker](https://android.googlesource.com/platform/bionic/+/nougat-mr1-release/linker/linker.cpp)
1ddf1728 131
f4aa879e 132Some notes about the linker:
798619b9 133
f4aa879e
FF
134- The linker warns about unused [dynamic section entries](https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-42444.html) with a `WARNING: linker: $BINARY: unused DT entry: type ${VALUE_OF_d_tag}` message.
135
136- The supported types of dynamic section entries has increased over time.
137
138- The Termux build system uses [termux-elf-cleaner](https://github.com/termux/termux-elf-cleaner) to strip away unused ELF entries causing the above mentioned linker warnings.
139
140- Symbol versioning is supported only as of Android 6.0, so is stripped away.
141
142- `DT_RPATH`, the list of directories where the linker should look for shared libraries, is not supported, so is stripped away.
143
144- `DT_RUNPATH`, the same as above but looked at after `LD_LIBRARY_PATH`, is supported only from Android 7.0, so is stripped away.
145
146- Symbol visibility when opening shared libraries using `dlopen()` works differently. On a normal linker, when an executable linking against a shared library libA dlopen():s another shared library libB, the symbols of libA are exposed to libB without libB needing to link against libA explicitly. This does not work with the Android linker, which can break plug-in systems where the main executable dlopen():s a plug-in which doesn't explicitly link against some shared libraries already linked to by the executable. See [the relevant NDK issue](https://github.com/android-ndk/ndk/issues/201) for more information.