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
.
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.
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
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.