1# Based on c_src.mk from erlang.mk by Loic Hoguin <essen@ninenines.eu>
2
3CURDIR := $(shell pwd)
4BASEDIR := $(abspath $(CURDIR)/..)
5
6PROJECT ?= $(notdir $(BASEDIR))
7PROJECT := $(strip $(PROJECT))
8
9ERTS_INCLUDE_DIR ?= $(shell erl -noshell -eval "io:format(\"~ts/erts-~ts/include/\", [code:root_dir(), erlang:system_info(version)])." -s init stop)
10ERL_INTERFACE_INCLUDE_DIR ?= $(shell erl -noshell -eval "io:format(\"~ts\", [code:lib_dir(erl_interface, include)])." -s init stop)
11ERL_INTERFACE_LIB_DIR ?= $(shell erl -noshell -eval "io:format(\"~ts\", [code:lib_dir(erl_interface, lib)])." -s init stop)
12
13C_SRC_DIR = $(CURDIR)
14C_SRC_OUTPUT ?= $(CURDIR)/../priv/$(PROJECT).so
15
16# System type and C compiler/flags.
17
18UNAME_SYS := $(shell uname -s)
19ifeq ($(UNAME_SYS), Darwin)
20	CC ?= cc
21	CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
22	CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
23	LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
24else ifeq ($(UNAME_SYS), DragonFly)
25	CC ?= cc
26	CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
27	CXXFLAGS ?= -O3 -finline-functions -Wall
28else ifeq ($(UNAME_SYS), Linux)
29	CC ?= gcc
30	CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
31	CXXFLAGS ?= -O3 -finline-functions -Wall
32endif
33
34CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
35CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
36
37LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lei
38LDFLAGS += -shared
39
40# Verbosity.
41
42c_verbose_0 = @echo " C     " $(?F);
43c_verbose = $(c_verbose_$(V))
44
45cpp_verbose_0 = @echo " CPP   " $(?F);
46cpp_verbose = $(cpp_verbose_$(V))
47
48link_verbose_0 = @echo " LD    " $(@F);
49link_verbose = $(link_verbose_$(V))
50
51SOURCES := $(shell find $(C_SRC_DIR) -type f \( -name "*.c" -o -name "*.C" -o -name "*.cc" -o -name "*.cpp" \))
52OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
53
54COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
55COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
56
57$(C_SRC_OUTPUT): $(OBJECTS)
58	@mkdir -p $(BASEDIR)/priv/
59	$(link_verbose) $(CC) $(OBJECTS) $(LDFLAGS) $(LDLIBS) -o $(C_SRC_OUTPUT)
60
61%.o: %.c
62	$(COMPILE_C) $(OUTPUT_OPTION) $<
63
64%.o: %.cc
65	$(COMPILE_CPP) $(OUTPUT_OPTION) $<
66
67%.o: %.C
68	$(COMPILE_CPP) $(OUTPUT_OPTION) $<
69
70%.o: %.cpp
71	$(COMPILE_CPP) $(OUTPUT_OPTION) $<
72
73clean:
74	@rm -f $(C_SRC_OUTPUT) $(OBJECTS)
75