# Flags to pass to the compiler CFLAGS = -std=c99 -D_GNU_SOURCE -fPIC -Iinclude -I. -Wunused -Wall -Wextra -Wpedantic # Additional CFLAGS for debug build DCFLAGS = -Og -g3 # Addditional CFLAGS for release build RCFLAGS = -O3 -s # Flags to pass to the linker LDFLAGS = # Flags to enable sanitize checker SFLAGS = -fsanitize=address -fsanitize=leak # Destination directory DESTDIR ?= $(realpath .)/binary ############################################## ### Do not modify anything below this line ### ############################################## ifeq ($(OS),Windows_NT) PLATFORM := Windows else PLATFORM := $(shell uname -s) endif ifeq "$(PLATFORM)" "Darwin" CC := clang CP := cp -v MD := mkdir -p RM := rm -rfv LDFLAGS := $(LDFLAGS) -Wl,-export_dynamic -undefined dynamic_lookup LIBS := -ldl -lm EXESUFFIX := LIBSUFFIX := .dylib endif ifeq "$(PLATFORM)" "FreeBSD" CC := clang CP := cp -v MD := mkdir -p RM := rm -rfv LDFLAGS := $(LDFLAGS) -Wl,--export-dynamic LIBS := -lm EXESUFFIX := LIBSUFFIX := .so endif ifeq "$(PLATFORM)" "Linux" CC := gcc CP := cp -v MD := mkdir -p RM := rm -rfv LDFLAGS := $(LDFLAGS) -Wl,--export-dynamic LIBS := -ldl -lm EXESUFFIX := LIBSUFFIX := .so endif ifeq "$(PLATFORM)" "OpenBSD" CC := clang CP := cp -v MD := mkdir -p RM := rm -rfv LDFLAGS := $(LDFLAGS) -Wl,--export-dynamic LIBS := -lm EXESUFFIX := LIBSUFFIX := .so endif ifeq "$(PLATFORM)" "Windows" CC := gcc CP := copy MD := md RM := del /F LDFLAGS := $(LDFLAGS) -Wl,--export-all-symbols LIBS := EXESUFFIX := .exe LIBSUFFIX := .dll endif ASTYLE_FLAGS =\ --style=java \ --indent=force-tab \ --attach-closing-while \ --attach-inlines \ --attach-classes \ --indent-classes \ --indent-modifiers \ --indent-switches \ --indent-cases \ --indent-preproc-block \ --indent-preproc-define \ --indent-col1-comments \ --pad-oper \ --pad-comma \ --unpad-paren \ --delete-empty-lines \ --align-pointer=name \ --align-reference=name \ --break-one-line-headers \ --add-braces \ --verbose \ --formatted \ --lineend=linux BINARY := aer BUILD_DIR := build CFLAGS := $(CFLAGS) -DPH7_LIBRARY_SUFFIX=\"$(LIBSUFFIX)\" LIBFLAGS := -Wl,-rpath,$(DESTDIR) -L$(BUILD_DIR) -l$(BINARY) ENGINE_DIRS := engine/lib engine ENGINE_SRCS := $(foreach dir,$(ENGINE_DIRS),$(wildcard $(dir)/*.c)) ENGINE_MAKE := $(ENGINE_SRCS:.c=.o) ENGINE_OBJS := $(addprefix $(BUILD_DIR)/,$(ENGINE_MAKE)) MODULE := $(subst /,,$(subst modules/,,$(dir $(wildcard modules/*/)))) SAPI := $(subst /,,$(subst sapi/,,$(dir $(wildcard sapi/*/)))) TEST_DIR := tests TEST_EXT := aer TESTS := $(subst .$(TEST_EXT),.test,$(wildcard $(TEST_DIR)/*.$(TEST_EXT))) .SUFFIXES: .PHONY: clean debug install release style tests debug: export CFLAGS := $(CFLAGS) $(DCFLAGS) debug: engine sapi modules release: export CFLAGS := $(CFLAGS) $(RCFLAGS) release: engine sapi modules sanitize: export CFLAGS := $(CFLAGS) $(DCFLAGS) $(SFLAGS) sanitize: $(eval LDFLAGS := $(LDFLAGS) $(SFLAGS)) sanitize: engine sapi modules engine: $(ENGINE_OBJS) $(CC) -o $(BUILD_DIR)/lib$(BINARY)$(LIBSUFFIX) $(LDFLAGS) $(LIBS) -shared $(ENGINE_OBJS) modules: $(MODULE) sapi: $(SAPI) $(BUILD_DIR)/%.o: %.c $(MD) $(dir $@) $(CC) $(CFLAGS) -c $< -o $@ $(MODULE): $(eval MODULE_DIRS := $@) $(eval MODULE_SRCS := $(foreach dir,modules/$(MODULE_DIRS),$(wildcard $(dir)/*.c))) $(eval MODULE_MAKE := $(MODULE_SRCS:.c=.o)) $(eval MODULE_OBJS := $(addprefix $(BUILD_DIR)/,$(MODULE_MAKE))) $(eval MODULE_PROG := $(MODULE_DIRS)$(LIBSUFFIX)) $(MAKE) $(MODULE_OBJS) $(CC) -o $(BUILD_DIR)/$(MODULE_PROG) $(LDFLAGS) -shared $(MODULE_OBJS) $(SAPI): $(eval SAPI_DIRS := $@) $(eval SAPI_SRCS := $(foreach dir,sapi/$(SAPI_DIRS),$(wildcard $(dir)/*.c))) $(eval SAPI_MAKE := $(SAPI_SRCS:.c=.o)) $(eval SAPI_OBJS := $(addprefix $(BUILD_DIR)/,$(SAPI_MAKE))) $(eval SAPI_PROG := $(subst -cli,,$(BINARY)-$(SAPI_DIRS))$(EXESUFFIX)) $(MAKE) $(SAPI_OBJS) $(CC) -o $(BUILD_DIR)/$(SAPI_PROG) $(LDFLAGS) $(LIBFLAGS) $(SAPI_OBJS) %.test: %.exp %.$(TEST_EXT) @$(MD) ${BUILD_DIR}/${TEST_DIR} @echo -n "Executing test: $*.$(TEST_EXT) ... " @if [ "x`echo $* | grep args`" != "x" ]; \ then \ binary/$(BINARY)$(EXESUFFIX) $*.$(TEST_EXT) - arg1 arg2 arg3 arg4 2>&1 >$(BUILD_DIR)/$*.out; \ else \ binary/$(BINARY)$(EXESUFFIX) $*.$(TEST_EXT) 2>&1 >$(BUILD_DIR)/$*.out; \ fi @if [ "x`diff -qbu $*.exp $(BUILD_DIR)/$*.out`" != "x" ]; \ then \ echo "ERROR!"; \ diff -u $*.exp $(BUILD_DIR)/$*.out; \ rm -f $(BUILD_DIR)/$(TEST_DIR)/*.out \ exit 1; \ fi; @rm -f $(BUILD_DIR)/$(TEST_DIR)/*.out @echo "OK!" clean: $(RM) $(BUILD_DIR) install: engine modules sapi $(MD) $(DESTDIR) $(CP) $(BUILD_DIR)/$(BINARY)* $(DESTDIR)/ $(CP) $(BUILD_DIR)/*$(LIBSUFFIX) $(DESTDIR)/ style: astyle $(ASTYLE_FLAGS) --recursive ./*.c,*.h tests: $(TESTS)