summaryrefslogtreecommitdiffstats
path: root/README.cross
diff options
context:
space:
mode:
Diffstat (limited to 'README.cross')
-rw-r--r--README.cross250
1 files changed, 250 insertions, 0 deletions
diff --git a/README.cross b/README.cross
new file mode 100644
index 000000000..e416469fc
--- /dev/null
+++ b/README.cross
@@ -0,0 +1,250 @@
+Cross-compiling LibreOffice
+***************************
+
+Cross-compilation works, to various degree, to the following
+platforms: iOS, Android, and Raspbian.
+
+Note that this document has not been updated very often, and not
+everything here necessarily is true any more.
+
+
+General
+-------
+
+In GNU Autoconf terminology, "build" is the platform on which you are
+running a build of some software and "host" is the platform on which
+the software you are building will run. Only in the specific case of
+building compilers and other programming tools is the term "target"
+used to indicate the platform for which the tools your are building
+will produce code. As LibreOffice is not a compiler, the "target" term
+should not be used in the context of cross-compilation.
+
+(For a case where all three of "build", "host" and "target" are
+different: consider a gcc cross-compiler running on Windows, producing
+code for Android, where the cross-compiler itself was built on
+Linux. (This is a real case.) An interesting tidbit is that such
+configurations are called "Canadian Cross".)
+
+Even though the LibreOffice build mechanism is highly unorthodox, the
+configure script takes the normal --build and --host options like any
+GNU Autoconf -based configure script. To cross-compile, you basically
+need just to specify a suitable --host option and things should work
+out nicely. In practice, many details need to be handled. See examples
+below.
+
+Note that in the case of LibreOffice, it is uncommon to run the
+configure script directly. Normally one uses the autogen.sh script.
+The autogen.sh script reads command-line options from file called
+autogen.input if it exists. The typical way of working is to keep
+the configure parameters in that file and edit it as needed.
+
+
+What is so hard, then?
+----------------------
+
+Despite the fact that the configure script takes normal --build and
+--host options, that is just the beginning. It was necessary to
+separate tests for "host" and "build" platforms in the configure
+script. See the git log for details. And the reasonably "standard"
+configure.in is just the top level; when we get down to the actual
+makefilery used to build the bits of LibreOffice, it gets much worse.
+
+
+iOS
+***
+
+iOS is the operating system on Apple's mobile devices. Clearly for a
+device like the iPad it would not be acceptable to run a normal
+LibreOffice application with overlapping windows and mouse-oriented
+GUI widgets.
+
+It makes sense to use only a part of LibreOffice's code for iOS. Lots
+of the GUI-oriented code should be left out. iOS apps that want to use
+the applicable LibreOffice code will handle all their GUI in a
+platform-dependent manner. How well it will be possible to do such a
+split remains to be seen.
+
+Obviously we want it to be possible to eventually distribute apps
+using LibreOffice code through the App Store. Technically, one
+important special aspect of iOS is that apps in the App Store are not
+allowed to load own dynamic libraries. (System libraries are used in
+the form of dynamic libraries, just like on macOS, of which iOS is
+a variant.)
+
+Thus all the libraries in LibreOffice that normally are shared
+libraries (DLLs on Windows, shared objects (.so) on Linux, dynamic
+libraries on macOS (.dylib)) must be built as static archives
+instead. This has some interesting consequences for how UNO is
+implemented and used.
+
+An iOS app is a "bundle" that contains a single executable. In an app
+using LibreOffice code, that executable then contains the necessary
+LibreOffice libraries and UNO components statically linked.
+
+The Apple tool-chain for iOS cross-building is available only for OS
+X. In order to be able to run and debug an app on an actual device
+(and not just the iOS Simulator) you need to be registered in the iOS
+Developer Program.
+
+Here is an autogen.input for iOS (device) using Xcode 4.6, on macOS 10.8:
+
+--build=i386-apple-darwin10.7.0
+--host=arm-apple-darwin10
+--enable-dbgutil
+--enable-debug
+--enable-werror
+
+For the iOS Simulator, but note that building for the simulator is
+broken at the moment (July 2014):
+
+--build=i386-apple-darwin10.7.0
+--host=arm-apple-darwin10
+--enable-ios-simulator
+--enable-dbgutil
+--enable-debug
+--enable-werror
+
+You will have to install autoconf and automake yourself before running
+autogen.sh. They are no longer included in Xcode 4.3 and later (not
+even in the add-on "command line tools").
+
+The -mmacosx-version-min=10.7 is necessary when building for the iOS
+simulator to avoid clang replacing simple calls to fprintf with calls
+to fwrite$UNIX2003 which Xcode then warns that doesn't exist on iOS.
+
+
+Android
+*******
+
+From a technical point of view the core Android OS (the kernel) is
+Linux, but everything else is different. Unlike iOS, an Android app
+can use shared objects just fine, so that aspect of UNO doesn't need
+special handling. Except that there is a silly low limit in the
+Android dynamic linker on the number of libraries you can dlopen. This
+is a limitation in user-level (but system-provided and not really
+replaceable) code, not the kernel.
+
+Thus, just like for iOS, also for Android the LibreOffice libraries
+and UNO components are built as static archives. For Android, those
+static archives, and any app-specific native code, are linked into one
+single app-specific shared library, called liblo-native-code.so.
+
+For the GUI, the same holds as said above for iOS. The GUI layer needs
+to be platform-specific, written in Java.
+
+Android cross-compilation work has been done mainly on Linux (openSUSE
+in particular). Earlier also cross-compiling from macOS was tried. The
+Android cross-compilation tool-chain (the "Native Development Kit", or
+NDK) is available for Linux, macOS and Windows, but trying to
+cross-compile LibreOffice from Windows will probably drive you insane.
+
+You will also need the Android SDK as full "make" also builds a couple
+of Android apps where the upper layer is written in Java.
+
+Use the "android" tool from the SDK to install the SDK Tools, SDK
+Platform Tools, the API 15 SDK Platform and the Android Support
+Library. If you want to run the Android apps in the emulator, you of
+course need an appropriate system image for that.
+
+Here is an autogen.input for Android on ARM when cross-compiling
+from Linux:
+
+--enable-dbgutil
+--enable-werror
+--with-distro=LibreOfficeAndroid
+--with-android-sdk=/path/to/android/sdk
+--with-android-ndk=/path/to/android/sdk/ndk/version
+
+And here is an (quite old) autogen.input for Android on X86:
+
+--with-android-ndk=/opt/libreoffice/android-ndk-r8b
+--with-android-ndk-toolchain-version=4.6
+--with-android-sdk=/opt/libreoffice/android-sdk-linux
+--build=i586-suse-linux
+--enable-ccache
+--with-distro=LibreOfficeAndroidX86
+
+A LibreOffice app for Android is being developed progress in the
+android/source directory.
+
+To run the app, do "make install" followed by either "make run" or
+starting it from Android itself. You most likely want to have an "adb logcat"
+running in another window. To debug, run "make debugrun".
+
+NB: If you happen to upgrade to Android SDK Tools 23, and the build (using
+'make verbose=t android') fails for you with:
+
+ [dx] UNEXPECTED TOP-LEVEL EXCEPTION:
+ [dx] java.io.FileNotFoundException: /local/libreoffice/android-sdk-linux/tools/support/annotations.jar (no such file or directory)
+
+you need to copy the annotations.jar from an older sdk; like
+
+wget 'http://dl-ssl.google.com/android/repository/tools_r22.6.2-linux.zip'
+unzip tools_r22.6.2-linux.zip
+cp tools/support/annotations.jar <android-sdk-linux>/tools/support/
+
+Raspbian
+********
+
+In theory, this should work also for another Linux, it does not need to be Raspbian.
+But this cross-compilation work is tested from Debian and openSUSE to Raspbian.
+
+You will need headers, pkg-config files and libraries from a Raspbian
+system to build against. Available at
+https://dev-www.libreoffice.org/extern/ . Look for the latest
+raspbian-root-*.tar.gz . For instance:
+
+$ wget https://dev-www.libreoffice.org/extern/raspbian-root-20140120.tar.gz
+$ mkdir raspbian-root
+$ cd raspbian-root
+$ tar -xf raspbian-root-20140120.tar.gz
+
+You can build cross-compiler yourself or get the executables here:
+$ git clone git://github.com/raspberrypi/tools
+
+tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian is known to work.
+
+Then create pkg-config wrapper, something like:
+$ cat > pkg-config-wrapper-host << _EOF
+#!/bin/sh
+
+if [ "$CROSS_COMPILING" = TRUE ]; then
+ SYSROOT=$HOME/lo/raspbian-root
+ export PKG_CONFIG_PATH=${SYSROOT}/usr/lib/arm-linux-gnueabihf/pkgconfig:${SYSROOT}/usr/share/pkgconfig
+ export PKG_CONFIG_LIBDIR=${SYSROOT}/usr/lib/pkgconfig
+ export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}
+fi
+
+exec pkg-config "\$@"
+_EOF
+$ chmod +x pkg-config-wrapper-host
+
+This does not work with pkg-config 0.23. 0.26 is known to work.
+
+And you are ready to build with autogen.input similar to:
+
+PKG_CONFIG=<path-to-pkg-config-wrapper-host>
+CC=<path-to-arm-linux-gnueabihf-gcc> --sysroot=<path-to-raspbian_rootfs>
+CXX=<path-to-arm-linux-gnueabihf-g++> --sysroot=<path-to-raspbian_rootfs>
+--build=x86_64-unknown-linux-gnu
+--host=arm-unknown-linux-gnueabihf
+--disable-sdk
+--enable-python=system
+PYTHON_CFLAGS=-I<path-to-raspbian_rootfs>/usr/include/python2.7
+PYTHON_LIBS=-lpython2.7
+--with-java
+JAVAINC=-I<path-to-raspbian_rootfs>/usr/lib/jvm/java-6-openjdk-armhf/include
+--with-system-cairo
+--with-system-cppunit
+--with-system-icu
+--with-system-neon
+--with-system-nss
+--with-system-openldap
+--with-system-openssl
+--with-system-redland
+
+Finally, when you are ready to run the binaries in Raspbian,
+you may need to get more system libraries, who knows.
+$ sudo apt-get install libreoffice # or similar
+That installs libreoffice too, which you don't need because you have
+just built one, but I don't know how to avoid it easily.