Update docs with instructions on building with meson
authorKirill Isakov <bootctl@gmail.com>
Mon, 21 Mar 2022 09:41:26 +0000 (15:41 +0600)
committerKirill Isakov <bootctl@gmail.com>
Tue, 22 Mar 2022 18:59:33 +0000 (00:59 +0600)
INSTALL.md [new file with mode: 0644]
README.android [deleted file]
README.git [deleted file]
README.md
doc/tinc.texi

diff --git a/INSTALL.md b/INSTALL.md
new file mode 100644 (file)
index 0000000..3265e54
--- /dev/null
@@ -0,0 +1,177 @@
+# Dependencies
+
+Before you can start compiling tinc from a fresh git clone, you have
+to install the very latest versions of the following packages:
+
+- `meson`
+- `ninja`
+- `pkgconf` or `pkg-config`
+- `GCC` or `Clang` (any version with C11 support, although older versions might work)
+- `OpenSSL`\* (1.1.0+) or `LibreSSL` or `libgcrypt` (not needed if legacy protocol is disabled)
+
+Plus a few optional dependencies. Support for them will be enabled if they're present:
+
+- `ncurses` or `PDCurses`
+- `readline`
+- `zlib`\*
+- `LZO`\*
+- `LZ4`\*
+
+If packages marked by `*` are not available, tinc will fall back to its own vendored copies.
+This behavior can be disabled by setting the appropriate meson option to `disabled`.
+
+To build `info` documentation you'll also need these packages:
+
+- `texinfo` or `makeinfo`
+
+You might also need some additional command-line utilities to be able to run the integration test suite:
+
+- `diffutils`
+- `procps`
+- `socat`
+- `netcat`
+
+Please consult your operating system's documentation for more details.
+
+## Windows
+
+You will need to install [msys2][msys2] to build tinc under Windows.
+
+[msys2]: https://msys2.org/
+
+By default, tinc produces a static Windows build, so you don't need to install anything
+in order to _run_ the compiled binaries.
+
+# Building
+
+## Native
+
+Have a look at the available configuration options in `meson_options.txt`, or run:
+
+    $ meson configure
+
+The project can be built as any other meson project:
+
+    $ meson setup build -Dprefix=/usr/local -Dbuildtype=release
+
+This creates a build directory (named `build`) with build type set to `release`
+(which enables compiler optimizations) and path prefix set to `/usr/local`.
+
+Pass any additional options in the same way. Typically, this is not needed: tinc will
+autodetect available libraries and adjust its functionality accordingly.
+
+If you'd like to reconfigure the project after running `setup`, you can either remove
+the build directory and start anew, or use:
+
+    $ meson configure build -Dlzo=disabled -Dlz4=enabled
+
+You then need to build the project:
+
+    $ ninja -C build
+
+You might want to run the test suite to ensure tinc is working correctly:
+
+    $ ninja -C build test
+
+To install tinc to your system, run:
+
+    # ninja -C build install
+
+Please be aware that this is not the best method of installing software
+because it will not be tracked by your operating system's package manager. You
+should use packages provided by your operating system, or build your own
+(this is a large and complicated topic which is out of the scope of this document).
+
+To uninstall tinc, run:
+
+    # ninja -C build uninstall
+
+## Cross-compilation
+
+### Linux to Linux
+
+Cross-compilation is easy to do on Debian or its derivatives.
+Set `$HOST` to your target architecture and install the cross-compilation toolchain and `-dev` versions of all libraries you'd like to link:
+
+    $ HOST=armhf
+    $ dpkg --add-architecture $HOST
+    $ apt update
+    $ apt install -y crossbuild-essential-$HOST zlib1g-dev:$HOST …
+
+If you'd like to run tests on emulated hardware, install `qemu-user`:
+
+    $ apt install -y qemu-user
+    $ update-binfmts --enable
+
+Set two environment variables: the C compiler, and pkg-config, and then proceed as usual:
+
+    $ export CC=arm-linux-gnueabihf-gcc
+    $ export PKG_CONFIG=arm-linux-gnueabihf-pkg-config
+    $ meson setup build --cross-file /dev/null
+
+or put the names into a [cross file][cross] and pass it to meson:
+
+    $ cat >cross-armhf <<EOF
+    [binaries]
+    c = 'arm-linux-gnueabihf-gcc'
+    pkgconfig = 'arm-linux-gnueabihf-pkg-config'
+    EOF
+
+    $ meson setup build --cross-file cross-armhf
+
+[cross]: https://mesonbuild.com/Cross-compilation.html
+
+### Linux to Windows
+
+Install cross-compilation toolchain:
+
+    $ apt install -y mingw-w64 mingw-w64-tools
+
+tinc will use its own vendored libraries, so you don't need to install or build anything manually.
+
+Prepare the [cross file][cross] to let meson know you're building binaries for a different opearting system.
+Take a look at the [file](.ci/cross/windows/amd64) used by CI for an example, or refer to examples provided
+by the meson project: [x86][mingw32], [x86_64][mingw64].
+
+Then build as usual. Because Windows binaries are built with static linkage by default,
+you might want to enable link-time optimization. It is much slower than building without LTO,
+but produces binaries that are 80%+ smaller:
+
+    $ meson setup build -Dbuildtype=release -Db_lto=true --cross-file cross-windows
+    $ ninja -C build
+
+[mingw64]: https://github.com/mesonbuild/meson/blob/master/cross/linux-mingw-w64-64bit.txt
+[mingw32]: https://github.com/mesonbuild/meson/blob/master/cross/linux-mingw-w64-32bit.txt
+
+### Linux to Android
+
+First you need to install [Android NDK][ndk].
+
+[ndk]: https://developer.android.com/studio/projects/install-ndk
+
+Prepare a [cross file][cross]. Here's a working example for reference:
+
+```ini
+[host_machine]
+system     = 'android'
+cpu_family = 'arm'
+cpu        = 'aarch64'
+endian     = 'little'
+
+[binaries]
+c = 'aarch64-linux-android24-clang'
+```
+
+Then build as usual:
+
+    $ export ANDROID_NDK_ROOT=/tmp/ndk/android-ndk-r24
+    $ export PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
+    $ meson setup android-aarch64 -Dcrypto=nolegacy --cross-file android
+    $ ninja -C android-aarch64
+
+### macOS to iOS
+
+The same instructions should work for iOS.
+Refer to this [cross file][ios] for an example.
+
+[ios]: https://github.com/mesonbuild/meson/blob/master/cross/iphone.txt
diff --git a/README.android b/README.android
deleted file mode 100644 (file)
index 7d8e853..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-Quick how-to cross compile tinc for Android (done from $HOME/android/):
-
-- Download Android NDK and setup local ARM toolchain:
-
-        wget http://dl.google.com/android/ndk/android-ndk-r8b-linux-x86.tar.bz2
-        tar xfj android-ndk-r8b-linux-x86.tar.bz2
-        ./android-ndk-r8b/build/tools/make-standalone-toolchain.sh --platform=android-5 --install-dir=/tmp/my-android-toolchain
-
-- Download and cross-compile OpenSSL for ARM:
-
-        wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz
-        tar xfz openssl-1.0.1c.tar.gz
-        cd openssl-1.0.1c
-        ./Configure dist
-        make CC=/tmp/my-android-toolchain/bin/arm-linux-androideabi-gcc AR="/tmp/my-android-toolchain/bin/arm-linux-androideabi-ar r" RANLIB=/tmp/my-android-toolchain/bin/arm-linux-androideabi-ranlib
-
-- Clone and cross-compile tinc:
-
-        git clone git://tinc-vpn.org/tinc
-        cd tinc
-        autoreconf -fsi
-        CC=/tmp/my-android-toolchain/bin/arm-linux-androideabi-gcc ./configure --host=arm-linux --disable-lzo --with-openssl-lib=$HOME/android/openssl-1.0.1c --with-openssl-include=$HOME/android/openssl-1.0.1c/include/
-        make -j5
diff --git a/README.git b/README.git
deleted file mode 100644 (file)
index b699b58..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-Before you can start compiling tinc from a fresh git clone, you have
-to install the very latest versions of the following packages:
-
-- LibreSSL or OpenSSL
-- zlib
-- LZO
-- GCC
-- automake
-- autoconf
-- ncurses or PDCurses
-- readline
-
-Then you have to let the autotools create all the autogenerated files, using
-this command:
-
-    autoreconf -fsi
-
-If you change configure.in or any Makefile.am file, you will have to rerun
-autoreconf. After this, you can run configure and make as usual. To create a
-tarball suitable for release, run:
-
-    make dist
-
-To clean up your working copy so that no autogenerated files remain, run:
-
-    git clean -f
index 7338b9d..11129f7 100644 (file)
--- a/README.md
+++ b/README.md
@@ -12,6 +12,10 @@ it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or (at
 your option) any later version. See the file COPYING for more details.
 
+## Building
+
+A detailed instruction on how to build tinc from source is available in [INSTALL.md](INSTALL.md).
+
 ## Nightly builds
 
 You can download pre-built binary packages for multiple Linux distributions and Windows here:
index e3eff86..ed9f3ae 100644 (file)
@@ -549,11 +549,7 @@ for yourself, you can use the source.  The source is distributed under
 the GNU General Public License (GPL).  Download the source from the
 @uref{https://www.tinc-vpn.org/download/, download page}.
 
-Tinc comes in a convenient autoconf/automake package, which you can just
-treat the same as any other package.  Which is just untar it, type
-`./configure' and then `make'.
-More detailed instructions are in the file @file{INSTALL}, which is
-included in the source distribution.
+Please refer to @file{INSTALL.md} for information on how to build tinc from source.
 
 @menu
 * Building and installing tinc::