From 5a041bcf96a903202d6384d414f1c992ddf76e47 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= <essen@ninenines.eu>
Date: Tue, 4 Dec 2018 11:02:45 +0100
Subject: Document cross compiling

---
 doc/src/guide/cross_compiling.asciidoc | 94 ++++++++++++++++++++++++++++++++++
 1 file changed, 94 insertions(+)
 create mode 100644 doc/src/guide/cross_compiling.asciidoc

(limited to 'doc/src/guide/cross_compiling.asciidoc')

diff --git a/doc/src/guide/cross_compiling.asciidoc b/doc/src/guide/cross_compiling.asciidoc
new file mode 100644
index 0000000..23e14b9
--- /dev/null
+++ b/doc/src/guide/cross_compiling.asciidoc
@@ -0,0 +1,94 @@
+[[cross_compiling]]
+== Cross compiling
+
+Erlang.mk supports cross-compiling. While the compiled
+Erlang code is portable as-is, the C code is not and
+releases need to use the correct runtime system for the
+target environment.
+
+There are therefore two steps that might require some
+intervention: compiling and building the release. If
+you do not have any C code you can just compile as you
+would normally, however.
+
+=== Compiling
+
+To cross-compile the C code you need a cross compiler. If you
+were to target Windows from an Arch Linux machine you would
+install the https://aur.archlinux.org/packages/mingw-w64-gcc/[mingw-w64-gcc]
+package. You would then need to define the `CC` environment
+variable to point to this compiler instead of the default:
+
+[source,bash]
+CC=/usr/bin/x86_64-w64-mingw32-gcc
+
+Additionally, on Windows the shared libraries use a different
+extension than on Linux, so it needs to be specified as well:
+
+[source,bash]
+C_SRC_OUTPUT_SHARED_EXTENSION=.dll
+
+These values can be added to the Makefile or given from the
+command line, for example:
+
+[source,bash]
+----
+$ CC=/usr/bin/x86_64-w64-mingw32-gcc C_SRC_OUTPUT_SHARED_EXTENSION=.dll make
+ DEPEND my_nif.d
+ ERLC   my_nif.erl
+ APP    my_nif
+ C      my_nif.c
+ LD     my_nif.dll
+$ file priv/my_nif.dll                                              
+priv/my_nif.dll: PE32+ executable (DLL) (console) x86-64, for MS Windows
+----
+
+You could also add this configuration to your Makefile hidden
+behind a flag:
+
+[source,make]
+----
+ifdef WINDOWS_BUILD
+CC = /usr/bin/x86_64-w64-mingw32-gcc
+C_SRC_OUTPUT_SHARED_EXTENSION = .dll
+endif
+----
+
+And then just compile like this:
+
+[source,bash]
+$ make WINDOWS_BUILD=1
+
+=== Building the release
+
+For the release there are two options. You can either include
+the correct runtime system directly in the release; or you
+can not include the runtime system in the release and instead
+let it use the one installed in the target environment.
+
+To include the target runtime system, add the `include_erts`
+tuple to your 'relx.config' file:
+
+[source,erlang]
+{include_erts, "/path/to/alternate/erlang"}.
+
+If you were to target Windows for example, you could copy
+the Erlang installation from the 'Program Files' directory
+and then configure 'relx.config' like this:
+
+[source,erlang]
+{include_erts, "/path/to/erl10.1"}.
+
+You need to make sure that the runtime system version you
+will use is capable of running the compiled Erlang code
+you used to build your project, otherwise it will fail
+to run.
+
+If you choose to not include the runtime system at all,
+configure 'relx.config' as follow:
+
+[source,erlang]
+{include_erts, false}.
+
+In that case the runtime system needs to be available
+in the `$PATH` of the target environment.
-- 
cgit v1.2.3

