proot: Update to fix vfork-execve brk handling
[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
6dd45156
FF
6This project contains scripts and patches to build packages for the
7[Termux](https://termux.com/) Android application.
798619b9 8
6bde679f
FF
9Setting up a build environment using Docker
10===========================================
d7af85ec 11For 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 12
6bde679f 13Run the following script to setup a container (from an image created by [scripts/Dockerfile](scripts/Dockerfile)) suitable for building packages:
22dd00cb 14
fa0a18ce 15 ./scripts/run-docker.sh
1773070c 16
6bde679f 17This source folder is mounted as the `/root/termux-packages` data volume, so changes are kept
6dd45156
FF
18in sync between the host and the container when trying things out before committing, and built
19deb files will be available on the host in the `debs/` directory just as when building on the host.
5e8045c9 20
852e83ab 21The docker container used for building packages is a Ubuntu 17.04 installation with necessary packages
6bde679f
FF
22pre-installed. The default user is a non-root user to avoid problems with package builds modifying the system
23by mistake, but `sudo` can be used to install additional Ubuntu packages to be used during development.
24
a0057943
FF
25Build commands can be given to be executed in the docker container directly:
26
27 ./scripts/run-docker.sh ./build-package.sh libandroid-support
28
29will launch the docker container, execute the `./build-package.sh libandroid-support`
30command inside it and afterwards return you to the host prompt, with the newly built
31deb in `debs/` to try out.
5e8045c9 32
6bde679f
FF
33Note 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.
34
35Build environment without Docker
36================================
852e83ab 37If you can't run Docker you can use a Ubuntu 17.04 installation (either by installing a virtual maching guest or on direct hardware) by using the below scripts:
6bde679f
FF
38
39- Run `scripts/setup-ubuntu.sh` to install required packages and setup the `/data/` folder.
40
41- Run `scripts/setup-android-sdk.sh` to install the Android SDK and NDK at `$HOME/lib/android-{sdk,ndk}`.
42
43There is also a [Vagrantfile](scripts/Vagrantfile) available as a shortcut for setting up an Ubuntu installation with the above steps applied.
44
9ecaa95d
FF
45Building a package
46==================
88183689 47The basic build operation is to run `./build-package.sh $PKG`, which:
798619b9 48
6dd45156 491. Sets up a patched stand-alone Android NDK toolchain if necessary.
9ecaa95d 50
6dd45156 512. Reads `packages/$PKG/build.sh` to find out where to find the source code of the package and how to build it.
a0057943 52
6dd45156 533. Extracts the source in `$HOME/.termux-build/$PKG/src`.
9ecaa95d 54
6dd45156 554. Applies all patches in packages/$PKG/\*.patch.
9ecaa95d 56
6dd45156 575. Builds the package under `$HOME/.termux-build/$PKG/` (either in the build/ directory there or in the
a0057943
FF
58 src/ directory if the package is specified to build in the src dir) and installs it to `$PREFIX`.
59
6dd45156 606. Extracts modified files in `$PREFIX` into `$HOME/.termux-build/$PKG/massage` and massages the
a0057943 61 files there for distribution (removes some files, splits it up in sub-packages, modifies elf files).
9ecaa95d 62
6dd45156 637. Creates a deb package file for distribution in `debs/`.
1773070c 64
6dd45156 65Reading [build-package.sh](build-package.sh) is the best way to understand what is going on.
798619b9 66
9ecaa95d
FF
67Additional utilities
68====================
88183689 69* build-all.sh: used for building all packages in the correct order (using buildorder.py).
9ecaa95d 70
2fe052c8 71* clean.sh: used for doing a clean rebuild of all packages.
9ecaa95d 72
88183689 73* scripts/check-pie.sh: Used for verifying that all binaries are using PIE, which is required for Android 5+.
9ecaa95d 74
88183689 75* scripts/check-versions.sh: used for checking for package updates.
9ecaa95d 76
88183689 77* scripts/list-packages.sh: used for listing all packages with a one-line summary.
798619b9
FF
78
79
1a8d12c2
FF
80Resources
81=========
82* [Android changes for NDK developers](https://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md)
83
40dcead0 84* [Linux From Scratch](http://www.linuxfromscratch.org/lfs/view/stable/)
798619b9 85
88183689 86* [Beyond Linux From Scratch](http://www.linuxfromscratch.org/blfs/view/stable/)
798619b9 87
88183689 88* [OpenWrt](https://openwrt.org/) as an embedded Linx distribution contains [patches and build scripts](https://dev.openwrt.org/browser/packages)
798619b9 89
88183689 90* [Kivy recipes](https://github.com/kivy/python-for-android/tree/master/pythonforandroid/recipes) contains recipes for building packages for Android.
798619b9
FF
91
92
93Common porting problems
94=======================
26e75e88 95* 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
96
97* "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
98
26e75e88 99* rindex(3) does not exist, but strrchr(3) is preferred anyway.
798619b9
FF
100
101* <sys/termios.h> does not exist, but <termios.h> is the standard location.
102
103* <sys/fcntl.h> does not exist, but <fcntl.h> is the standard location.
104
26e75e88 105* <sys/timeb.h> does not exist (removed in POSIX 2008), but ftime(3) can be replaced with gettimeofday(2).
798619b9 106
26e75e88 107* <glob.h> does not exist, but is available through the `libandroid-glob` package.
798619b9 108
26e75e88 109* 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 110
26e75e88 111* SYSV semaphores is not supported by the kernel. Use unnamed POSIX semaphores instead (named semaphores are unimplemented).
c4804ab8 112
798619b9
FF
113dlopen() and RTLD_* flags
114=================================
d3e5452e 115<dlfcn.h> declares
798619b9 116
d3e5452e
FF
117 RTLD_NOW=0; RTLD_LAZY=1; RTLD_LOCAL=0; RTLD_GLOBAL=2; RTLD_NOLOAD=4; // 32-bit
118 RTLD_NOW=2; RTLD_LAZY=1; RTLD_LOCAL=0; RTLD_GLOBAL=0x00100; RTLD_NOLOAD=4; // 64-bit
798619b9
FF
119
120These differs from glibc ones in that
121
d3e5452e
FF
1221. They differ in value from glibc ones, so cannot be hardcoded in files (DLFCN.py in python does this)
1232. They are missing some values (`RTLD_BINDING_MASK`, ...)
798619b9 124
f4aa879e
FF
125Android Dynamic Linker
126======================
127The 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 128
f4aa879e
FF
129- [Android 5.0 linker](https://android.googlesource.com/platform/bionic/+/lollipop-mr1-release/linker/linker.cpp)
130- [Android 6.0 linker](https://android.googlesource.com/platform/bionic/+/marshmallow-mr1-release/linker/linker.cpp)
131- [Android 7.0 linker](https://android.googlesource.com/platform/bionic/+/nougat-mr1-release/linker/linker.cpp)
1ddf1728 132
f4aa879e 133Some notes about the linker:
798619b9 134
f4aa879e
FF
135- 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.
136
137- The supported types of dynamic section entries has increased over time.
138
139- 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.
140
141- Symbol versioning is supported only as of Android 6.0, so is stripped away.
142
143- `DT_RPATH`, the list of directories where the linker should look for shared libraries, is not supported, so is stripped away.
144
145- `DT_RUNPATH`, the same as above but looked at after `LD_LIBRARY_PATH`, is supported only from Android 7.0, so is stripped away.
146
147- 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.