|
@@ -122,7 +122,7 @@ operating systems, CPUs and compilers:
|
|
|
<tr class="even">
|
|
|
<td class="compatcpu">x64 (64 bit)</td>
|
|
|
<td class="compatos">GCC 4.2+</td>
|
|
|
-<td class="compatos">ORBIS (<a href="#ps4">PS4</a>)</td>
|
|
|
+<td class="compatos">GCC 4.2+<br>ORBIS (<a href="#ps4">PS4</a>)</td>
|
|
|
<td class="compatos">XCode 5.0+<br>Clang</td>
|
|
|
<td class="compatos">MSVC + SDK v7.0<br>WinSDK v7.0<br>Durango (<a href="#xboxone">Xbox One</a>)</td>
|
|
|
</tr>
|
|
@@ -202,7 +202,7 @@ which is probably the default on your system, anyway. Simply run:
|
|
|
make
|
|
|
</pre>
|
|
|
<p>
|
|
|
-This always builds a native x86, x64 or PPC binary, depending on the host OS
|
|
|
+This always builds a native binary, depending on the host OS
|
|
|
you're running this command on. Check the section on
|
|
|
<a href="#cross">cross-compilation</a> for more options.
|
|
|
</p>
|
|
@@ -333,25 +333,36 @@ directory where <tt>luajit.exe</tt> is installed
|
|
|
|
|
|
<h2 id="cross">Cross-compiling LuaJIT</h2>
|
|
|
<p>
|
|
|
+First, let's clear up some terminology:
|
|
|
+</p>
|
|
|
+<ul>
|
|
|
+<li>Host: This is your development system, usually based on a x64 or x86 CPU.</li>
|
|
|
+<li>Target: This is the target system you want LuaJIT to run on, e.g. Android/ARM.</li>
|
|
|
+<li>Toolchain: This comprises a C compiler, linker, assembler and a matching C library.</li>
|
|
|
+<li>Host (or system) toolchain: This is the toolchain used to build native binaries for your host system.</li>
|
|
|
+<li>Cross-compile toolchain: This is the toolchain used to build binaries for the target system. They can only be run on the target system.</li>
|
|
|
+</ul>
|
|
|
+<p>
|
|
|
The GNU Makefile-based build system allows cross-compiling on any host
|
|
|
-for any supported target, as long as both architectures have the same
|
|
|
-pointer size. If you want to cross-compile to any 32 bit target on an
|
|
|
-x64 OS, you need to install the multilib development package (e.g.
|
|
|
-<tt>libc6-dev-i386</tt> on Debian/Ubuntu) and build a 32 bit host part
|
|
|
-(<tt>HOST_CC="gcc -m32"</tt>).
|
|
|
+for any supported target:
|
|
|
</p>
|
|
|
+<ul>
|
|
|
+<li>Yes, you need a toolchain for both your host <em>and</em> your target!</li>
|
|
|
+<li>Both host and target architectures must have the same pointer size.</li>
|
|
|
+<li>E.g. if you want to cross-compile to a 32 bit target on a 64 bit host, you need to install the multilib development package (e.g. <tt>libc6-dev-i386</tt> on Debian/Ubuntu) and build a 32 bit host part (<tt>HOST_CC="gcc -m32"</tt>).</li>
|
|
|
+<li>64 bit targets always require compilation on a 64 bit host.</li>
|
|
|
+</ul>
|
|
|
<p>
|
|
|
You need to specify <tt>TARGET_SYS</tt> whenever the host OS and the
|
|
|
-target OS differ, or you'll get assembler or linker errors. E.g. if
|
|
|
-you're compiling on a Windows or OSX host for embedded Linux or Android,
|
|
|
-you need to add <tt>TARGET_SYS=Linux</tt> to the examples below. For a
|
|
|
-minimal target OS, you may need to disable the built-in allocator in
|
|
|
-<tt>src/Makefile</tt> and use <tt>TARGET_SYS=Other</tt>. Don't forget to
|
|
|
-specify the same <tt>TARGET_SYS</tt> for the install step, too.
|
|
|
+target OS differ, or you'll get assembler or linker errors:
|
|
|
</p>
|
|
|
+<ul>
|
|
|
+<li>E.g. if you're compiling on a Windows or OSX host for embedded Linux or Android, you need to add <tt>TARGET_SYS=Linux</tt> to the examples below.</li>
|
|
|
+<li>For a minimal target OS, you may need to disable the built-in allocator in <tt>src/Makefile</tt> and use <tt>TARGET_SYS=Other</tt>.</li>
|
|
|
+<li>Don't forget to specify the same <tt>TARGET_SYS</tt> for the install step, too.</li>
|
|
|
+</ul>
|
|
|
<p>
|
|
|
-The examples below only show some popular targets — please check
|
|
|
-the comments in <tt>src/Makefile</tt> for more details.
|
|
|
+Here are some examples where host and target have the same CPU:
|
|
|
</p>
|
|
|
<pre class="code">
|
|
|
# Cross-compile to a 32 bit binary on a multilib x64 OS
|
|
@@ -369,26 +380,30 @@ use the canonical toolchain triplets for Linux.
|
|
|
</p>
|
|
|
<p>
|
|
|
Since there's often no easy way to detect CPU features at runtime, it's
|
|
|
-important to compile with the proper CPU or architecture settings. You
|
|
|
-can specify these when building the toolchain yourself. Or add
|
|
|
-<tt>-mcpu=...</tt> or <tt>-march=...</tt> to <tt>TARGET_CFLAGS</tt>. For
|
|
|
-ARM it's important to have the correct <tt>-mfloat-abi=...</tt> setting,
|
|
|
-too. Otherwise LuaJIT may not run at the full performance of your target
|
|
|
-CPU.
|
|
|
+important to compile with the proper CPU or architecture settings:
|
|
|
+</o>
|
|
|
+<ul>
|
|
|
+<li>The best way to get consistent results is to specify the correct settings when building the toolchain yourself.</li>
|
|
|
+<li>For a pre-built, generic toolchain add <tt>-mcpu=...</tt> or <tt>-march=...</tt> and other necessary flags to <tt>TARGET_CFLAGS</tt>.</li>
|
|
|
+<li>For ARM it's important to have the correct <tt>-mfloat-abi=...</tt> setting, too. Otherwise LuaJIT may not run at the full performance of your target CPU.</li>
|
|
|
+<li>For MIPS it's important to select a supported ABI (o32 on MIPS32) and consistently compile your project either with hard-float or soft-float compiler settings. Do not use <tt>-mips16</tt>.</li>
|
|
|
+</ul>
|
|
|
+<p>
|
|
|
+Here are some examples for targets with a different CPU than the host:
|
|
|
</p>
|
|
|
<pre class="code">
|
|
|
# ARM soft-float
|
|
|
make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
|
|
|
TARGET_CFLAGS="-mfloat-abi=soft"
|
|
|
|
|
|
-# ARM soft-float ABI with VFP (example for Cortex-A8)
|
|
|
+# ARM soft-float ABI with VFP (example for Cortex-A9)
|
|
|
make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
|
|
|
- TARGET_CFLAGS="-mcpu=cortex-a8 -mfloat-abi=softfp"
|
|
|
+ TARGET_CFLAGS="-mcpu=cortex-a9 -mfloat-abi=softfp"
|
|
|
|
|
|
-# ARM hard-float ABI with VFP (armhf, requires recent toolchain)
|
|
|
+# ARM hard-float ABI with VFP (armhf, most modern toolchains)
|
|
|
make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabihf-
|
|
|
|
|
|
-# ARM64 (requires x64 host)
|
|
|
+# ARM64
|
|
|
make CROSS=aarch64-linux-
|
|
|
|
|
|
# PPC
|
|
@@ -400,7 +415,7 @@ make HOST_CC="gcc -m32" CROSS=mips-linux-
|
|
|
make HOST_CC="gcc -m32" CROSS=mipsel-linux-
|
|
|
</pre>
|
|
|
<p>
|
|
|
-You can cross-compile for <b id="android">Android</b> using the <a href="http://developer.android.com/sdk/ndk/index.html"><span class="ext">»</span> Android NDK</a>.
|
|
|
+You can cross-compile for <b id="android">Android</b> using the <a href="https://developer.android.com/ndk/index.html">Android NDK</a>.
|
|
|
The environment variables need to match the install locations and the
|
|
|
desired target platform. E.g. Android 4.0 corresponds to ABI level 14.
|
|
|
For details check the folder <tt>docs</tt> in the NDK directory.
|
|
@@ -414,7 +429,7 @@ to build/deploy or which lowest common denominator you want to pick:
|
|
|
# Android/ARM, armeabi (ARMv5TE soft-float), Android 2.2+ (Froyo)
|
|
|
NDK=/opt/android/ndk
|
|
|
NDKABI=8
|
|
|
-NDKVER=$NDK/toolchains/arm-linux-androideabi-4.6
|
|
|
+NDKVER=$NDK/toolchains/arm-linux-androideabi-4.9
|
|
|
NDKP=$NDKVER/prebuilt/linux-x86/bin/arm-linux-androideabi-
|
|
|
NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"
|
|
|
make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"
|
|
@@ -422,16 +437,16 @@ make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"
|
|
|
# Android/ARM, armeabi-v7a (ARMv7 VFP), Android 4.0+ (ICS)
|
|
|
NDK=/opt/android/ndk
|
|
|
NDKABI=14
|
|
|
-NDKVER=$NDK/toolchains/arm-linux-androideabi-4.6
|
|
|
+NDKVER=$NDK/toolchains/arm-linux-androideabi-4.9
|
|
|
NDKP=$NDKVER/prebuilt/linux-x86/bin/arm-linux-androideabi-
|
|
|
NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"
|
|
|
NDKARCH="-march=armv7-a -mfloat-abi=softfp -Wl,--fix-cortex-a8"
|
|
|
make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF $NDKARCH"
|
|
|
|
|
|
-# Android/MIPS, mips (MIPS32R1 hard-float), Android 4.0+ (ICS)
|
|
|
+# Android/MIPS, mipsel (MIPS32R1 hard-float), Android 4.0+ (ICS)
|
|
|
NDK=/opt/android/ndk
|
|
|
NDKABI=14
|
|
|
-NDKVER=$NDK/toolchains/mipsel-linux-android-4.6
|
|
|
+NDKVER=$NDK/toolchains/mipsel-linux-android-4.9
|
|
|
NDKP=$NDKVER/prebuilt/linux-x86/bin/mipsel-linux-android-
|
|
|
NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-mips"
|
|
|
make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"
|
|
@@ -439,7 +454,7 @@ make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"
|
|
|
# Android/x86, x86 (i686 SSE3), Android 4.0+ (ICS)
|
|
|
NDK=/opt/android/ndk
|
|
|
NDKABI=14
|
|
|
-NDKVER=$NDK/toolchains/x86-4.6
|
|
|
+NDKVER=$NDK/toolchains/x86-4.9
|
|
|
NDKP=$NDKVER/prebuilt/linux-x86/bin/i686-linux-android-
|
|
|
NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-x86"
|
|
|
make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"
|