Fix unit test failure when using Skia in debug builds
[LibreOffice.git] / README.cross
blobe416469fce1b3e69156f6184cbc70c74d3d3961b
1 Cross-compiling LibreOffice
2 ***************************
4 Cross-compilation works, to various degree, to the following
5 platforms: iOS, Android, and Raspbian.
7 Note that this document has not been updated very often, and not
8 everything here necessarily is true any more.
11 General
12 -------
14 In GNU Autoconf terminology, "build" is the platform on which you are
15 running a build of some software and "host" is the platform on which
16 the software you are building will run. Only in the specific case of
17 building compilers and other programming tools is the term "target"
18 used to indicate the platform for which the tools your are building
19 will produce code. As LibreOffice is not a compiler, the "target" term
20 should not be used in the context of cross-compilation.
22 (For a case where all three of "build", "host" and "target" are
23 different: consider a gcc cross-compiler running on Windows, producing
24 code for Android, where the cross-compiler itself was built on
25 Linux. (This is a real case.) An interesting tidbit is that such
26 configurations are called "Canadian Cross".)
28 Even though the LibreOffice build mechanism is highly unorthodox, the
29 configure script takes the normal --build and --host options like any
30 GNU Autoconf -based configure script. To cross-compile, you basically
31 need just to specify a suitable --host option and things should work
32 out nicely. In practice, many details need to be handled. See examples
33 below.
35 Note that in the case of LibreOffice, it is uncommon to run the
36 configure script directly. Normally one uses the autogen.sh script.
37 The autogen.sh script reads command-line options from file called
38 autogen.input if it exists. The typical way of working is to keep
39 the configure parameters in that file and edit it as needed.
42 What is so hard, then?
43 ----------------------
45 Despite the fact that the configure script takes normal --build and
46 --host options, that is just the beginning. It was necessary to
47 separate tests for "host" and "build" platforms in the configure
48 script. See the git log for details. And the reasonably "standard"
49 configure.in is just the top level; when we get down to the actual
50 makefilery used to build the bits of LibreOffice, it gets much worse.
53 iOS
54 ***
56 iOS is the operating system on Apple's mobile devices. Clearly for a
57 device like the iPad it would not be acceptable to run a normal
58 LibreOffice application with overlapping windows and mouse-oriented
59 GUI widgets.
61 It makes sense to use only a part of LibreOffice's code for iOS. Lots
62 of the GUI-oriented code should be left out. iOS apps that want to use
63 the applicable LibreOffice code will handle all their GUI in a
64 platform-dependent manner. How well it will be possible to do such a
65 split remains to be seen.
67 Obviously we want it to be possible to eventually distribute apps
68 using LibreOffice code through the App Store. Technically, one
69 important special aspect of iOS is that apps in the App Store are not
70 allowed to load own dynamic libraries. (System libraries are used in
71 the form of dynamic libraries, just like on macOS, of which iOS is
72 a variant.)
74 Thus all the libraries in LibreOffice that normally are shared
75 libraries (DLLs on Windows, shared objects (.so) on Linux, dynamic
76 libraries on macOS (.dylib)) must be built as static archives
77 instead. This has some interesting consequences for how UNO is
78 implemented and used.
80 An iOS app is a "bundle" that contains a single executable. In an app
81 using LibreOffice code, that executable then contains the necessary
82 LibreOffice libraries and UNO components statically linked.
84 The Apple tool-chain for iOS cross-building is available only for OS
85 X. In order to be able to run and debug an app on an actual device
86 (and not just the iOS Simulator) you need to be registered in the iOS
87 Developer Program.
89 Here is an autogen.input for iOS (device) using Xcode 4.6, on macOS 10.8:
91 --build=i386-apple-darwin10.7.0
92 --host=arm-apple-darwin10
93 --enable-dbgutil
94 --enable-debug
95 --enable-werror
97 For the iOS Simulator, but note that building for the simulator is
98 broken at the moment (July 2014):
100 --build=i386-apple-darwin10.7.0
101 --host=arm-apple-darwin10
102 --enable-ios-simulator
103 --enable-dbgutil
104 --enable-debug
105 --enable-werror
107 You will have to install autoconf and automake yourself before running
108 autogen.sh. They are no longer included in Xcode 4.3 and later (not
109 even in the add-on "command line tools").
111 The -mmacosx-version-min=10.7 is necessary when building for the iOS
112 simulator to avoid clang replacing simple calls to fprintf with calls
113 to fwrite$UNIX2003 which Xcode then warns that doesn't exist on iOS.
116 Android
117 *******
119 From a technical point of view the core Android OS (the kernel) is
120 Linux, but everything else is different. Unlike iOS, an Android app
121 can use shared objects just fine, so that aspect of UNO doesn't need
122 special handling. Except that there is a silly low limit in the
123 Android dynamic linker on the number of libraries you can dlopen. This
124 is a limitation in user-level (but system-provided and not really
125 replaceable) code, not the kernel.
127 Thus, just like for iOS, also for Android the LibreOffice libraries
128 and UNO components are built as static archives. For Android, those
129 static archives, and any app-specific native code, are linked into one
130 single app-specific shared library, called liblo-native-code.so.
132 For the GUI, the same holds as said above for iOS. The GUI layer needs
133 to be platform-specific, written in Java.
135 Android cross-compilation work has been done mainly on Linux (openSUSE
136 in particular). Earlier also cross-compiling from macOS was tried. The
137 Android cross-compilation tool-chain (the "Native Development Kit", or
138 NDK) is available for Linux, macOS and Windows, but trying to
139 cross-compile LibreOffice from Windows will probably drive you insane.
141 You will also need the Android SDK as full "make" also builds a couple
142 of Android apps where the upper layer is written in Java.
144 Use the "android" tool from the SDK to install the SDK Tools, SDK
145 Platform Tools, the API 15 SDK Platform and the Android Support
146 Library. If you want to run the Android apps in the emulator, you of
147 course need an appropriate system image for that.
149 Here is an autogen.input for Android on ARM when cross-compiling
150 from Linux:
152 --enable-dbgutil
153 --enable-werror
154 --with-distro=LibreOfficeAndroid
155 --with-android-sdk=/path/to/android/sdk
156 --with-android-ndk=/path/to/android/sdk/ndk/version
158 And here is an (quite old) autogen.input for Android on X86:
160 --with-android-ndk=/opt/libreoffice/android-ndk-r8b
161 --with-android-ndk-toolchain-version=4.6
162 --with-android-sdk=/opt/libreoffice/android-sdk-linux
163 --build=i586-suse-linux
164 --enable-ccache
165 --with-distro=LibreOfficeAndroidX86
167 A LibreOffice app for Android is being developed progress in the
168 android/source directory.
170 To run the app, do "make install" followed by either "make run" or
171 starting it from Android itself. You most likely want to have an "adb logcat"
172 running in another window. To debug, run "make debugrun".
174 NB: If you happen to upgrade to Android SDK Tools 23, and the build (using
175 'make verbose=t android') fails for you with:
177        [dx] UNEXPECTED TOP-LEVEL EXCEPTION:
178        [dx] java.io.FileNotFoundException: /local/libreoffice/android-sdk-linux/tools/support/annotations.jar (no such file or directory)
180 you need to copy the annotations.jar from an older sdk; like
182 wget 'http://dl-ssl.google.com/android/repository/tools_r22.6.2-linux.zip'
183 unzip tools_r22.6.2-linux.zip
184 cp tools/support/annotations.jar <android-sdk-linux>/tools/support/
186 Raspbian
187 ********
189 In theory, this should work also for another Linux, it does not need to be Raspbian.
190 But this cross-compilation work is tested from Debian and openSUSE to Raspbian.
192 You will need headers, pkg-config files and libraries from a Raspbian
193 system to build against. Available at
194 https://dev-www.libreoffice.org/extern/ . Look for the latest
195 raspbian-root-*.tar.gz . For instance:
197 $ wget https://dev-www.libreoffice.org/extern/raspbian-root-20140120.tar.gz
198 $ mkdir raspbian-root
199 $ cd raspbian-root
200 $ tar -xf raspbian-root-20140120.tar.gz
202 You can build cross-compiler yourself or get the executables here:
203 $ git clone git://github.com/raspberrypi/tools
205 tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian is known to work.
207 Then create pkg-config wrapper, something like:
208 $ cat > pkg-config-wrapper-host << _EOF
209 #!/bin/sh
211 if [ "$CROSS_COMPILING" = TRUE ]; then
212    SYSROOT=$HOME/lo/raspbian-root
213    export PKG_CONFIG_PATH=${SYSROOT}/usr/lib/arm-linux-gnueabihf/pkgconfig:${SYSROOT}/usr/share/pkgconfig
214    export PKG_CONFIG_LIBDIR=${SYSROOT}/usr/lib/pkgconfig
215    export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}
218 exec pkg-config "\$@"
219 _EOF
220 $ chmod +x pkg-config-wrapper-host
222 This does not work with pkg-config 0.23. 0.26 is known to work.
224 And you are ready to build with autogen.input similar to:
226 PKG_CONFIG=<path-to-pkg-config-wrapper-host>
227 CC=<path-to-arm-linux-gnueabihf-gcc> --sysroot=<path-to-raspbian_rootfs>
228 CXX=<path-to-arm-linux-gnueabihf-g++> --sysroot=<path-to-raspbian_rootfs>
229 --build=x86_64-unknown-linux-gnu
230 --host=arm-unknown-linux-gnueabihf
231 --disable-sdk
232 --enable-python=system
233 PYTHON_CFLAGS=-I<path-to-raspbian_rootfs>/usr/include/python2.7
234 PYTHON_LIBS=-lpython2.7
235 --with-java
236 JAVAINC=-I<path-to-raspbian_rootfs>/usr/lib/jvm/java-6-openjdk-armhf/include
237 --with-system-cairo
238 --with-system-cppunit
239 --with-system-icu
240 --with-system-neon
241 --with-system-nss
242 --with-system-openldap
243 --with-system-openssl
244 --with-system-redland
246 Finally, when you are ready to run the binaries in Raspbian,
247 you may need to get more system libraries, who knows.
248 $ sudo apt-get install libreoffice # or similar
249 That installs libreoffice too, which you don't need because you have
250 just built one, but I don't know how to avoid it easily.