From 24c2e3e41eebbcf8f0601cf3cd2f3af765312b17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Thu, 22 Oct 2015 17:51:34 +0200 Subject: Update user guide --- guide/ch08.html | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) (limited to 'guide/ch08.html') diff --git a/guide/ch08.html b/guide/ch08.html index d8cf4cd..23f8429 100644 --- a/guide/ch08.html +++ b/guide/ch08.html @@ -31,7 +31,63 @@ div.navfooter{margin-bottom:1em}
-

Chapter 8. NIFs and port drivers

Placeholder chapter.

+

Chapter 8. NIFs and port drivers

Erlang.mk can not only build Erlang projects, but also the C code +that some projects come with, like NIFs and port drivers.

There are two ways to build the C code: using a custom Makefile, +or making Erlang.mk do it directly. The C code will be built +as needed when you run make.

8.1. C source code location and Erlang environment

The C source code should be located in the $(C_SRC_DIR) directory. +It defaults to c_src/. Should you need to modify it, all you +need to do is to set the variable in your Makefile before including +Erlang.mk:

C_SRC_DIR = $(CURDIR)/my_nif_source

When this directory exists, Erlang.mk will automatically create a +file named $(C_SRC_ENV). This file defaults to $(C_SRC_DIR)/env.mk. +This can also be changed:

C_SRC_ENV = $(C_SRC_DIR)/erlang_env.mk

It contains a few variable definitions for the environment used for the build:

+ERTS_INCLUDE_DIR +
+ Path to the ERTS include files (erl_driver.h, erl_nif.h and more). +
+ERL_INTERFACE_INCLUDE_DIR +
+ Path to the Erl_Interface include files (ei.h and related). +
+ERL_INTERFACE_LIB_DIR +
+ Path to the Erl_Interface static libraries. +

8.2. Using a custom Makefile

Erlang.mk will automatically run make if it detects a Makefile +in $(C_SRC_DIR)/Makefile.

The Makefile should have at least two targets: a default target +(which can be anything, for example all) which is invoked when +building the C code, and a clean target invoked when cleaning +it.

You can include the env.mk file to benefit from the Erlang +environment detection:

include env.mk

8.3. Using Erlang.mk directly

You don’t need to write a Makefile to build C source code, however. +Erlang.mk comes with rules to build both shared libraries and +executables, using the source files it finds in $(C_SRC_DIR).

By default, Erlang.mk will create a shared library. To change +this and create an executable instead, put this in your Makefile +before including Erlang.mk:

C_SRC_TYPE = executable

The generated file will be saved to $(C_SRC_OUTPUT). It +defaults to $(CURDIR)/priv/$(PROJECT).so, the filename +adequately fitting a Unix shared library.

Erlang.mk sets appropriate compile and linker flags by default. +These flags vary depending on the platform, and can of course +be overriden.

+CC +
+ The compiler to be used. +
+CFLAGS +
+ C compiler flags. +
+CXXFLAGS +
+ C++ compiler flags. +
+LDFLAGS +
+ Linker flags. +
+LDLIBS +
+ Libraries to link against. +

The source files are automatically gathered from the contents +of $(C_SRC_DIR). Erlang.mk looks for .c, .C, .cc and .cpp +source files. You can define the variable SOURCES to manually +list the files to compile.

-- cgit v1.2.3