|
@@ -7,12 +7,32 @@
|
|
|
|
|
|
C_SRC_DIR ?= $(CURDIR)/c_src
|
|
C_SRC_DIR ?= $(CURDIR)/c_src
|
|
C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
|
|
C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
|
|
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
|
|
|
|
|
|
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
|
|
C_SRC_TYPE ?= shared
|
|
C_SRC_TYPE ?= shared
|
|
|
|
|
|
# System type and C compiler/flags.
|
|
# System type and C compiler/flags.
|
|
|
|
|
|
-ifeq ($(PLATFORM),darwin)
|
|
|
|
|
|
+ifeq ($(PLATFORM),msys2)
|
|
|
|
+ C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
|
|
|
|
+ C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
|
|
|
|
+else
|
|
|
|
+ C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
|
|
|
|
+ C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
|
|
|
|
+endif
|
|
|
|
+
|
|
|
|
+ifeq ($(C_SRC_TYPE),shared)
|
|
|
|
+ C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
|
|
|
|
+else
|
|
|
|
+ C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
|
|
|
|
+endif
|
|
|
|
+
|
|
|
|
+ifeq ($(PLATFORM),msys2)
|
|
|
|
+# We hardcode the compiler used on MSYS2. The default CC=cc does
|
|
|
|
+# not produce working code. The "gcc" MSYS2 package also doesn't.
|
|
|
|
+ CC = /mingw64/bin/gcc
|
|
|
|
+ CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
|
|
|
|
+ CXXFLAGS ?= -O3 -finline-functions -Wall
|
|
|
|
+else ifeq ($(PLATFORM),darwin)
|
|
CC ?= cc
|
|
CC ?= cc
|
|
CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
|
|
CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
|
|
CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
|
|
CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
|
|
@@ -27,10 +47,15 @@ else ifeq ($(PLATFORM),linux)
|
|
CXXFLAGS ?= -O3 -finline-functions -Wall
|
|
CXXFLAGS ?= -O3 -finline-functions -Wall
|
|
endif
|
|
endif
|
|
|
|
|
|
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
|
|
|
|
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
|
|
|
|
|
|
+ifneq ($(PLATFORM),msys2)
|
|
|
|
+ CFLAGS += -fPIC
|
|
|
|
+ CXXFLAGS += -fPIC
|
|
|
|
+endif
|
|
|
|
+
|
|
|
|
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
|
|
|
|
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
|
|
|
|
|
|
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
|
|
|
|
|
|
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
|
|
|
|
|
|
# Verbosity.
|
|
# Verbosity.
|
|
|
|
|
|
@@ -67,15 +92,15 @@ OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
|
|
COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
|
|
COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
|
|
COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
|
|
COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
|
|
|
|
|
|
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
|
|
|
|
|
|
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
|
|
|
|
|
|
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
|
|
|
|
|
|
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
|
|
|
|
|
|
-$(C_SRC_OUTPUT): $(OBJECTS)
|
|
|
|
|
|
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
|
|
$(verbose) mkdir -p priv/
|
|
$(verbose) mkdir -p priv/
|
|
$(link_verbose) $(CC) $(OBJECTS) \
|
|
$(link_verbose) $(CC) $(OBJECTS) \
|
|
$(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
|
|
$(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
|
|
- -o $(C_SRC_OUTPUT)
|
|
|
|
|
|
+ -o $(C_SRC_OUTPUT_FILE)
|
|
|
|
|
|
%.o: %.c
|
|
%.o: %.c
|
|
$(COMPILE_C) $(OUTPUT_OPTION) $<
|
|
$(COMPILE_C) $(OUTPUT_OPTION) $<
|
|
@@ -92,13 +117,13 @@ $(C_SRC_OUTPUT): $(OBJECTS)
|
|
clean:: clean-c_src
|
|
clean:: clean-c_src
|
|
|
|
|
|
clean-c_src:
|
|
clean-c_src:
|
|
- $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
|
|
|
|
|
|
+ $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
|
|
|
|
|
|
endif
|
|
endif
|
|
|
|
|
|
ifneq ($(wildcard $(C_SRC_DIR)),)
|
|
ifneq ($(wildcard $(C_SRC_DIR)),)
|
|
$(C_SRC_ENV):
|
|
$(C_SRC_ENV):
|
|
- $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
|
|
|
|
|
|
+ $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
|
|
io_lib:format( \
|
|
io_lib:format( \
|
|
\"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
|
|
\"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
|
|
\"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
|
|
\"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
|