1OS := $(shell uname) 2 3ifeq ($(OS), Darwin) 4 SO_EXT := dylib 5else 6 SO_EXT := so 7endif 8 9############################################################################# 10# 11# Binaries we are going to build 12# 13############################################################################# 14# 15C_SO_NAME = libac.$(SO_EXT) 16LUA_SO_NAME = ahocorasick.$(SO_EXT) 17AR_NAME = libac.a 18 19############################################################################# 20# 21# Compile and link flags 22# 23############################################################################# 24PREFIX ?= /usr/local 25LUA_VERSION := 5.1 26LUA_INCLUDE_DIR := $(PREFIX)/include/lua$(LUA_VERSION) 27SO_TARGET_DIR := $(PREFIX)/lib/lua/$(LUA_VERSION) 28LUA_TARGET_DIR := $(PREFIX)/share/lua/$(LUA_VERSION) 29 30# Available directives: 31# -DDEBUG : Turn on debugging support 32# -DVERIFY : To verify if the slow-version and fast-version implementations 33# get exactly the same result. Note -DVERIFY implies -DDEBUG. 34# 35COMMON_FLAGS = -O3 #-g -DVERIFY -msse2 -msse3 -msse4.1 36COMMON_FLAGS += -fvisibility=hidden -Wall $(CXXFLAGS) $(MY_CXXFLAGS) $(CPPFLAGS) 37 38SO_CXXFLAGS = $(COMMON_FLAGS) -fPIC 39SO_LFLAGS = $(COMMON_FLAGS) $(LDFLAGS) 40AR_CXXFLAGS = $(COMMON_FLAGS) 41 42# -DVERIFY implies -DDEBUG 43ifneq ($(findstring -DVERIFY, $(COMMON_FLAGS)), ) 44ifeq ($(findstring -DDEBUG, $(COMMON_FLAGS)), ) 45 COMMON_FLAGS += -DDEBUG 46endif 47endif 48 49AR = ar 50AR_FLAGS = cru 51 52############################################################################# 53# 54# Divide source codes and objects into several categories 55# 56############################################################################# 57# 58SRC_COMMON := ac_fast.cxx ac_slow.cxx 59LIBAC_SO_SRC := $(SRC_COMMON) ac.cxx # source for libac.so 60LUA_SO_SRC := $(SRC_COMMON) ac_lua.cxx # source for ahocorasick.so 61LIBAC_A_SRC := $(LIBAC_SO_SRC) # source for libac.a 62 63############################################################################# 64# 65# Make rules 66# 67############################################################################# 68# 69.PHONY = all clean test benchmark prepare 70all : $(C_SO_NAME) $(LUA_SO_NAME) $(AR_NAME) 71 72-include c_so_dep.txt 73-include lua_so_dep.txt 74-include ar_dep.txt 75 76BUILD_SO_DIR := build_so 77BUILD_AR_DIR := build_ar 78 79$(BUILD_SO_DIR) :; mkdir $@ 80$(BUILD_AR_DIR) :; mkdir $@ 81 82$(BUILD_SO_DIR)/%.o : %.cxx | $(BUILD_SO_DIR) 83 $(CXX) $< -c $(SO_CXXFLAGS) -I$(LUA_INCLUDE_DIR) -MMD -o $@ 84 85$(BUILD_AR_DIR)/%.o : %.cxx | $(BUILD_AR_DIR) 86 $(CXX) $< -c $(AR_CXXFLAGS) -I$(LUA_INCLUDE_DIR) -MMD -o $@ 87 88ifneq ($(OS), Darwin) 89$(C_SO_NAME) : $(addprefix $(BUILD_SO_DIR)/, ${LIBAC_SO_SRC:.cxx=.o}) 90 $(CXX) $+ -shared -Wl,-soname=$(C_SO_NAME) $(SO_LFLAGS) -o $@ 91 cat $(addprefix $(BUILD_SO_DIR)/, ${LIBAC_SO_SRC:.cxx=.d}) > c_so_dep.txt 92 93$(LUA_SO_NAME) : $(addprefix $(BUILD_SO_DIR)/, ${LUA_SO_SRC:.cxx=.o}) 94 $(CXX) $+ -shared -Wl,-soname=$(LUA_SO_NAME) $(SO_LFLAGS) -o $@ 95 cat $(addprefix $(BUILD_SO_DIR)/, ${LUA_SO_SRC:.cxx=.d}) > lua_so_dep.txt 96 97else 98$(C_SO_NAME) : $(addprefix $(BUILD_SO_DIR)/, ${LIBAC_SO_SRC:.cxx=.o}) 99 $(CXX) $+ -shared $(SO_LFLAGS) -o $@ 100 cat $(addprefix $(BUILD_SO_DIR)/, ${LIBAC_SO_SRC:.cxx=.d}) > c_so_dep.txt 101 102$(LUA_SO_NAME) : $(addprefix $(BUILD_SO_DIR)/, ${LUA_SO_SRC:.cxx=.o}) 103 $(CXX) $+ -shared $(SO_LFLAGS) -o $@ -Wl,-undefined,dynamic_lookup 104 cat $(addprefix $(BUILD_SO_DIR)/, ${LUA_SO_SRC:.cxx=.d}) > lua_so_dep.txt 105endif 106 107$(AR_NAME) : $(addprefix $(BUILD_AR_DIR)/, ${LIBAC_A_SRC:.cxx=.o}) 108 $(AR) $(AR_FLAGS) $@ $+ 109 cat $(addprefix $(BUILD_AR_DIR)/, ${LIBAC_A_SRC:.cxx=.d}) > lua_so_dep.txt 110 111############################################################################# 112# 113# Misc 114# 115############################################################################# 116# 117test : $(C_SO_NAME) 118 $(MAKE) -C tests && \ 119 luajit tests/lua_test.lua && \ 120 luajit tests/load_ac_test.lua 121 122benchmark: $(C_SO_NAME) 123 $(MAKE) benchmark -C tests 124 125clean : 126 -rm -rf *.o *.d c_so_dep.txt lua_so_dep.txt ar_dep.txt $(TEST) \ 127 $(C_SO_NAME) $(LUA_SO_NAME) $(TEST) $(BUILD_SO_DIR) $(BUILD_AR_DIR) \ 128 $(AR_NAME) 129 make clean -C tests 130 131install: 132 install -D -m 755 $(C_SO_NAME) $(DESTDIR)/$(SO_TARGET_DIR)/$(C_SO_NAME) 133 install -D -m 755 $(LUA_SO_NAME) $(DESTDIR)/$(SO_TARGET_DIR)/$(LUA_SO_NAME) 134 install -D -m 664 load_ac.lua $(DESTDIR)/$(LUA_TARGET_DIR)/load_ac.lua 135