1#
2# Copyright (c) 2013 No Face Press, LLC
3# License http://opensource.org/licenses/mit-license.php MIT License
4#
5
6#
7# For help try, "make help"
8#
9
10default: lib
11WITH_WEBSOCKET=1
12COPT='-DNO_SSL -DNO_CACHING'
13
14include resources/Makefile.in-os
15
16CPROG = civetweb
17#CXXPROG = civetweb
18UNIT_TEST_PROG = civetweb_test
19
20BUILD_DIR = out
21
22# Installation directories by convention
23# http://www.gnu.org/prep/standards/html_node/Directory-Variables.html
24PREFIX ?= /usr/local
25EXEC_PREFIX = $(PREFIX)
26BINDIR = $(EXEC_PREFIX)/bin
27DATAROOTDIR = $(PREFIX)/share
28DOCDIR = $(DATAROOTDIR)/doc/$(CPROG)
29SYSCONFDIR = $(PREFIX)/etc
30HTMLDIR = $(DOCDIR)
31INCLUDEDIR = $(DESTDIR)$(PREFIX)/include
32LIBDIR = $(DESTDIR)$(EXEC_PREFIX)/lib
33
34# build tools
35MKDIR = mkdir -p
36RMF = rm -f
37RMRF = rm -rf
38
39# desired configuration of the document root
40# never assume that the document_root actually
41# exists on the build machine.  When building
42# a chroot, PREFIX if just a directory which
43# later becomes /.
44DOCUMENT_ROOT = $(HTMLDIR)
45PORTS = 8080
46USE_STACK_SIZE ?= 102400
47
48BUILD_DIRS = $(BUILD_DIR) $(BUILD_DIR)/src $(BUILD_DIR)/resources
49
50LIB_SOURCES = src/civetweb.c
51LIB_INLINE  = src/mod_lua.inl src/md5.inl
52APP_SOURCES = src/main.c
53WINDOWS_RESOURCES = resources/res.rc
54UNIT_TEST_SOURCES = test/unit_test.c
55SOURCE_DIRS =
56
57OBJECTS = $(LIB_SOURCES:.c=.o) $(APP_SOURCES:.c=.o)
58HEADERS = include/civetweb.h
59BUILD_RESOURCES =
60
61# The unit tests include the source files directly to get visibility to the
62# static functions.  So we clear OBJECTS so that we don't try to build or link
63# with any external object.  Later if we find WITH_LUA=1, we'll add lua objects
64# to this variable so we can run lua-specific unit tests.
65ifeq ($(MAKECMDGOALS), unit_test)
66OBJECTS =
67BUILD_DIRS += $(BUILD_DIR)/test
68endif
69
70# only set main compile options if none were chosen
71CFLAGS += -Wall -Wextra -Wshadow -Wformat-security -Winit-self -Wmissing-prototypes -D$(TARGET_OS) -Iinclude $(COPT) -DUSE_STACK_SIZE=$(USE_STACK_SIZE)
72
73LIBS = -lpthread -lm
74
75ifdef WITH_DEBUG
76  CFLAGS += -g -DDEBUG
77else
78  CFLAGS += -O2 -DNDEBUG
79endif
80
81ifdef WITH_CPP
82  OBJECTS += src/CivetServer.o
83  HEADERS += include/CivetServer.h
84  LCC = $(CXX)
85else
86  LCC = $(CC)
87endif
88
89ifdef WITH_ALL
90  WITH_WEBSOCKET = 1
91  WITH_IPV6 = 1
92  WITH_LUA = 1
93  WITH_DUKTAPE = 1
94  WITH_SERVER_STATS = 1
95  WITH_ZLIB = 1
96  WITH_EXPERIMENTAL = 1
97  #WITH_CPP is not defined, ALL means only real features, not wrappers
98endif
99
100# Use Lua?
101ifdef WITH_LUA_VERSION
102  WITH_LUA = 1
103endif
104
105ifdef WITH_LUA_SHARED
106  WITH_LUA = 1
107endif
108
109ifdef WITH_LUAJIT_SHARED
110  WITH_LUA_SHARED = 1
111  WITH_LUA = 1
112  WITH_LUA_VERSION = 501
113endif
114
115ifdef WITH_LUA
116  include resources/Makefile.in-lua
117endif
118
119# Use Duktape?
120ifdef WITH_SSJS
121  WITH_DUKTAPE = 1
122endif
123
124ifdef WITH_DUKTAPE_VERSION
125  WITH_DUKTAPE = 1
126endif
127
128ifdef WITH_DUKTAPE_SHARED
129  WITH_DUKTAPE = 1
130endif
131
132ifdef WITH_DUKTAPE
133  include resources/Makefile.in-duktape
134endif
135
136# Use zlib?
137ifdef WITH_COMPRESSION
138  WITH_ZLIB = 1
139endif
140
141ifdef WITH_ZLIB
142  LIBS += -lz
143  CFLAGS += -DUSE_ZLIB
144endif
145
146# Other features
147ifdef WITH_EXPERIMENTAL
148  CFLAGS += -DMG_EXPERIMENTAL_INTERFACES
149endif
150
151ifdef WITH_IPV6
152  CFLAGS += -DUSE_IPV6
153endif
154
155ifdef WITH_WEBSOCKET
156  CFLAGS += -DUSE_WEBSOCKET
157endif
158ifdef WITH_WEBSOCKETS
159  CFLAGS += -DUSE_WEBSOCKET
160endif
161
162ifdef WITH_SERVER_STAT
163  CFLAGS += -DUSE_SERVER_STATS
164endif
165ifdef WITH_SERVER_STATS
166  CFLAGS += -DUSE_SERVER_STATS
167endif
168
169# File names
170ifdef CONFIG_FILE
171  CFLAGS += -DCONFIG_FILE=\"$(CONFIG_FILE)\"
172endif
173
174ifdef CONFIG_FILE2
175  CFLAGS += -DCONFIG_FILE2=\"$(CONFIG_FILE2)\"
176endif
177
178ifdef SSL_LIB
179  CFLAGS += -DSSL_LIB=\"$(SSL_LIB)\"
180endif
181
182ifdef CRYPTO_LIB
183  CFLAGS += -DCRYPTO_LIB=\"$(CRYPTO_LIB)\"
184endif
185
186BUILD_DIRS += $(addprefix $(BUILD_DIR)/, $(SOURCE_DIRS))
187BUILD_OBJECTS = $(addprefix $(BUILD_DIR)/, $(OBJECTS))
188MAIN_OBJECTS = $(addprefix $(BUILD_DIR)/, $(APP_SOURCES:.c=.o))
189LIB_OBJECTS = $(filter-out $(MAIN_OBJECTS), $(BUILD_OBJECTS))
190
191ifeq ($(TARGET_OS),LINUX)
192  LIBS += -lrt -ldl
193  CAN_INSTALL = 1
194endif
195
196# CYGWIN defines WIN32 but has no del command because using bash
197# ifeq ($(TARGET_OS),WIN32)
198#   MKDIR = mkdir
199#   RMF = del /q
200#   RMRF = rmdir /s /q
201# endif
202
203ifdef WITH_LUAJIT_SHARED
204  LIBS += -lluajit-5.1
205else
206ifdef WITH_LUA_SHARED
207  LIBS += $(LUA_SHARED_LIB_FLAG)
208endif
209endif
210
211ifneq (, $(findstring mingw32, $(shell $(CC) -dumpmachine)))
212  BUILD_RESOURCES = $(BUILD_DIR)/$(WINDOWS_RESOURCES:.rc=.o)
213  LIBS += -lws2_32 -mwindows
214  SHARED_LIB = dll
215else
216  SHARED_LIB = so
217endif
218
219all: build
220
221help:
222	@echo "make help                show this message"
223	@echo "make build               compile"
224	@echo "make install             install on the system"
225	@echo "make clean               clean up the mess"
226	@echo "make install-headers     install headers"
227	@echo "make lib                 build a static library"
228	@echo "make install-lib         install the static library"
229	@echo "make slib                build a shared library"
230	@echo "make install-slib        install the shared library"
231	@echo "make unit_test           build unit tests executable"
232	@echo ""
233	@echo " Make Options"
234	@echo "   WITH_LUA=1            build with Lua support; include Lua as static library"
235	@echo "   WITH_LUA_SHARED=1     build with Lua support; use dynamic linking to liblua5.2.so"
236	@echo "   WITH_LUA_VERSION=502  build with Lua 5.2.x (501 for Lua 5.1.x to 503 for 5.3.x)"
237	@echo "   WITH_DUKTAPE=1        build with Duktape support; include as static library"
238	@echo "   WITH_DUKTAPE_SHARED=1 build with Duktape support; use libduktape1.3.so"
239	@echo "   WITH_DUKTAPE_VERSION=108 build with Duktape 1.8.x"
240	@echo "   WITH_DEBUG=1          build with GDB debug support"
241	@echo "   WITH_IPV6=1           with IPV6 support"
242	@echo "   WITH_WEBSOCKET=1      build with web socket support"
243	@echo "   WITH_SERVER_STATS=1   build includes support for server statistics"
244	@echo "   WITH_ZLIB=1           build includes support for on-the-fly compression using zlib"
245	@echo "   WITH_CPP=1            build library with c++ classes"
246	@echo "   WITH_EXPERIMENTAL=1   build with experimental features"
247	@echo "   CONFIG_FILE=file      use 'file' as the config file"
248	@echo "   CONFIG_FILE2=file     use 'file' as the backup config file"
249	@echo "   DOCUMENT_ROOT=/path   document root override when installing"
250	@echo "   PORTS=8080            listening ports override when installing"
251	@echo "   SSL_LIB=libssl.so.0   use versioned SSL library"
252	@echo "   CRYPTO_LIB=libcrypto.so.0 system versioned CRYPTO library"
253	@echo "   PREFIX=/usr/local     sets the install directory"
254	@echo "   COPT='-DNO_SSL'       method to insert compile flags"
255	@echo ""
256	@echo " Compile Flags"
257	@echo "   NDEBUG                strip off all debug code"
258	@echo "   DEBUG                 build debug version (very noisy)"
259	@echo "   NO_CGI                disable CGI support"
260	@echo "   NO_SSL                disable SSL functionality"
261	@echo "   NO_SSL_DL             link against system libssl library"
262	@echo "   NO_FILES              do not serve files from a directory"
263	@echo "   NO_CACHING            disable caching (useful for systems without timegm())"
264	@echo ""
265	@echo " Variables"
266	@echo "   TARGET_OS='$(TARGET_OS)'"
267	@echo "   CFLAGS='$(CFLAGS)'"
268	@echo "   CXXFLAGS='$(CXXFLAGS)'"
269	@echo "   LDFLAGS='$(LDFLAGS)'"
270	@echo "   CC='$(CC)'"
271	@echo "   CXX='$(CXX)'"
272
273build: $(CPROG) $(CXXPROG)
274
275unit_test: $(UNIT_TEST_PROG)
276
277ifeq ($(CAN_INSTALL),1)
278install: $(HTMLDIR)/index.html $(SYSCONFDIR)/civetweb.conf
279	install -d -m 755  "$(DOCDIR)"
280	install -m 644 *.md "$(DOCDIR)"
281	install -d -m 755 "$(BINDIR)"
282	install -m 755 $(CPROG) "$(BINDIR)/"
283
284install-headers:
285	install -m 644 $(HEADERS) "$(INCLUDEDIR)"
286
287install-lib: lib$(CPROG).a
288	install -m 644 $< "$(LIBDIR)"
289
290install-slib: lib$(CPROG).so
291	$(eval version=$(shell grep -w "define CIVETWEB_VERSION" include/civetweb.h | sed 's|.*VERSION "\(.*\)"|\1|g'))
292	$(eval major=$(shell echo $(version) | cut -d'.' -f1))
293	install -m 644 $< "$(LIBDIR)"
294	install -m 777 $<.$(major) "$(LIBDIR)"
295	install -m 777 $<.$(version).0 "$(LIBDIR)"
296
297# Install target we do not want to overwrite
298# as it may be an upgrade
299$(HTMLDIR)/index.html:
300	install -d -m 755  "$(HTMLDIR)"
301	install -m 644 resources/itworks.html $(HTMLDIR)/index.html
302	install -m 644 resources/civetweb_64x64.png $(HTMLDIR)/
303
304# Install target we do not want to overwrite
305# as it may be an upgrade
306$(SYSCONFDIR)/civetweb.conf:
307	install -d -m 755  "$(SYSCONFDIR)"
308	install -m 644 resources/civetweb.conf  "$(SYSCONFDIR)/"
309	@sed -i 's#^document_root.*$$#document_root $(DOCUMENT_ROOT)#' "$(SYSCONFDIR)/civetweb.conf"
310	@sed -i 's#^listening_ports.*$$#listening_ports $(PORTS)#' "$(SYSCONFDIR)/civetweb.conf"
311
312else
313install:
314	@echo "Target not flagged for installation.  Use CAN_INSTALL=1 to force"
315	@echo "As a precaution only LINUX targets are set as installable."
316	@echo "If the target is linux-like, use CAN_INSTALL=1 option."
317endif
318
319lib: lib$(CPROG).a
320
321slib: lib$(CPROG).$(SHARED_LIB)
322
323clean:
324	$(RMRF) $(BUILD_DIR)
325	$(eval version=$(shell grep -w "define CIVETWEB_VERSION" include/civetweb.h | sed 's|.*VERSION "\(.*\)"|\1|g'))
326	$(eval major=$(shell echo $(version) | cut -d'.' -f1))
327	$(RMRF) lib$(CPROG).a
328	$(RMRF) lib$(CPROG).so
329	$(RMRF) lib$(CPROG).so.$(major)
330	$(RMRF) lib$(CPROG).so.$(version).0
331	$(RMRF) $(CPROG)
332	$(RMF) $(UNIT_TEST_PROG)
333
334distclean: clean
335	@$(RMRF) VS2012/Debug VS2012/*/Debug  VS2012/*/*/Debug
336	@$(RMRF) VS2012/Release VS2012/*/Release  VS2012/*/*/Release
337	$(RMF) $(CPROG) lib$(CPROG).so lib$(CPROG).a *.dmg *.msi *.exe lib$(CPROG).dll lib$(CPROG).dll.a
338	$(RMF) $(UNIT_TEST_PROG)
339
340lib$(CPROG).a: CFLAGS += -fPIC
341lib$(CPROG).a: $(LIB_OBJECTS)
342	@$(RMF) $@
343	ar cq $@ $(LIB_OBJECTS)
344
345lib$(CPROG).so: CFLAGS += -fPIC
346lib$(CPROG).so: $(LIB_OBJECTS)
347	$(eval version=$(shell grep -w "define CIVETWEB_VERSION" include/civetweb.h | sed 's|.*VERSION "\(.*\)"|\1|g'))
348	$(eval major=$(shell echo $(version) | cut -d'.' -f1))
349	$(LCC) -shared -Wl,-soname,$@.$(major) -o $@.$(version).0 $(CFLAGS) $(LDFLAGS) $(LIB_OBJECTS)
350	ln -s -f $@.$(major) $@
351	ln -s -f $@.$(version).0 $@.$(major)
352
353lib$(CPROG).dll: CFLAGS += -fPIC
354lib$(CPROG).dll: $(LIB_OBJECTS)
355	$(LCC) -shared -o $@ $(CFLAGS) $(LDFLAGS) $(LIB_OBJECTS) $(LIBS) -Wl,--out-implib,lib$(CPROG).dll.a
356
357$(UNIT_TEST_PROG): CFLAGS += -Isrc -g
358$(UNIT_TEST_PROG): $(LIB_SOURCES) $(LIB_INLINE) $(UNIT_TEST_SOURCES) $(BUILD_OBJECTS)
359	$(LCC) -o $@ $(CFLAGS) $(LDFLAGS) $(UNIT_TEST_SOURCES) $(BUILD_OBJECTS) $(LIBS)
360
361$(CPROG): $(BUILD_OBJECTS) $(BUILD_RESOURCES)
362	$(LCC) -o $@ $(CFLAGS) $(LDFLAGS) $(BUILD_OBJECTS) $(BUILD_RESOURCES) $(LIBS)
363
364$(CXXPROG): $(BUILD_OBJECTS)
365	$(CXX) -o $@ $(CFLAGS) $(LDFLAGS) $(BUILD_OBJECTS) $(LIBS)
366
367$(BUILD_OBJECTS): $(BUILD_DIRS)
368
369$(BUILD_DIRS):
370	-@$(MKDIR) "$@"
371
372$(BUILD_DIR)/%.o : %.cpp
373	$(CXX) -c $(CFLAGS) $(CXXFLAGS) $< -o $@
374
375$(BUILD_DIR)/%.o : %.c
376	$(CC) -c $(CFLAGS) $< -o $@
377
378$(BUILD_RESOURCES) : $(WINDOWS_RESOURCES)
379	windres $(WINDRES_FLAGS) $< $@
380
381# This rules is used to keep the code formatted in a reasonable manor
382# For this to work astyle must be installed and in the path
383# http://sourceforge.net/projects/astyle
384indent:
385	astyle --suffix=none --style=linux --indent=spaces=4 --lineend=linux  include/*.h src/*.c src/*.cpp src/*.inl examples/*/*.c  examples/*/*.cpp
386
387.PHONY: all help build install clean lib so
388
389