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