blob: 6261306ce5f78f66c431b562c8bd34619c1cd2e6 [file] [log] [blame]
Austin Schuh24adb6b2015-09-06 17:37:40 -07001default: all
2
3AR=ar
4ARFLAGS=cru
5CXX=@CXX@
6CXXFLAGS=@CXXFLAGS@
7VALGRIND=@VALGRIND@
8LDFLAGS=@LDFLAGS@
9# hack for drw gcc on ubuntu
10GCC_MULTIARCH := $(shell gcc -print-multiarch 2>/dev/null)
11ifneq ($(GCC_MULTIARCH),)
12 export LIBRARY_PATH = /usr/lib/$(GCC_MULTIARCH)
13 export C_INCLUDE_PATH = /usr/include/$(GCC_MULTIARCH)
14 export CPLUS_INCLUDE_PATH = /usr/include/$(GCC_MULTIARCH)
15endif
16
17C_SRC=src/main/c
18TEST_SRC=src/test/c
19APPS_SRC=src/app/c
20
21VERSION_STRING:=SeaSocks/$(or $(VERSION),unversioned) ($(shell git describe --always --dirty || echo non-git))
22
23CXXFLAGS += -fPIC -Wall -Werror '-DSEASOCKS_VERSION_STRING="$(VERSION_STRING)"' -I$(C_SRC)
24
25.PHONY: all clean run test spotless header-checks valgrind-test
26
27OBJ_DIR=obj
28BIN_DIR=bin
29
30CPP_SRCS=$(shell find $(C_SRC) -name '*.cpp')
31H_SRCS=$(shell find $(C_SRC) -name '*.h')
32TEST_SRCS=$(shell find $(TEST_SRC) -name '*.cpp')
33APPS_CPP_SRCS=$(shell find $(APPS_SRC) -name '*.cpp')
34TARGETS=$(patsubst $(APPS_SRC)/%.cpp,$(BIN_DIR)/%,$(APPS_CPP_SRCS))
35
36apps: $(TARGETS)
37all: apps $(BIN_DIR)/libseasocks.so $(BIN_DIR)/libseasocks.a test header-checks valgrind-test
38
39debug:
40 echo $($(DEBUG_VAR))
41
42OBJS=$(patsubst $(C_SRC)/%.cpp,$(OBJ_DIR)/%.o,$(CPP_SRCS))
43HCS=$(patsubst $(C_SRC)/%.h,$(OBJ_DIR)/%.hc,$(H_SRCS))
44TEST_OBJS=$(patsubst $(TEST_SRC)/%.cpp,$(OBJ_DIR)/%.o,$(TEST_SRCS))
45APPS_OBJS=$(patsubst $(APPS_SRC)/%.cpp,$(OBJ_DIR)/%.o,$(APPS_CPP_SRCS))
46ALL_OBJS=$(OBJS) $(APPS_OBJS) $(TEST_OBJS)
47GEN_OBJS=$(OBJ_DIR)/embedded.o
48
49-include $(ALL_OBJS:.o=.d)
50
51$(APPS_OBJS) : $(OBJ_DIR)/%.o : $(APPS_SRC)/%.cpp
52 @mkdir -p $(dir $@)
53 $(CXX) $(CXXFLAGS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -c -o "$@" "$<"
54
55$(OBJS) : $(OBJ_DIR)/%.o : $(C_SRC)/%.cpp
56 @mkdir -p $(dir $@)
57 $(CXX) $(CXXFLAGS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -c -o "$@" "$<"
58
59$(HCS) : $(OBJ_DIR)/%.hc : $(C_SRC)/%.h
60 @mkdir -p $(dir $@)
61 @echo "Checking header file is self-contained: $<"
62 @$(CXX) -fsyntax-only $(CXXFLAGS) -o /dev/null -c -w $<
63 @touch $@
64
65$(TEST_OBJS) : $(OBJ_DIR)/%.o : $(TEST_SRC)/%.cpp
66 @mkdir -p $(dir $@)
67 $(CXX) $(CXXFLAGS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -c -o "$@" "$<"
68
69$(TARGETS) : $(BIN_DIR)/% : $(OBJ_DIR)/%.o $(OBJS) $(GEN_OBJS)
70 @mkdir -p $(BIN_DIR)
71 $(CXX) $(CXXFLAGS) -o $@ $^
72
73$(BIN_DIR)/libseasocks.so: $(OBJS) $(GEN_OBJS)
74 @mkdir -p $(BIN_DIR)
75 $(CXX) -shared $(CXXFLAGS) -o $@ $^
76
77$(BIN_DIR)/libseasocks.a: $(OBJS) $(GEN_OBJS)
78 @mkdir -p $(BIN_DIR)
79 @-rm -f $(BIN_DIR)/libseasocks.a
80 $(AR) $(ARFLAGS) $@ $^
81
82EMBEDDED_CONTENT:=$(shell find src/main/web -type f)
83$(OBJ_DIR)/embedded.o: scripts/gen_embedded.py $(EMBEDDED_CONTENT) src/main/c/internal/Embedded.h
84 @mkdir -p $(dir $@)
85 scripts/gen_embedded.py $(EMBEDDED_CONTENT) | $(CXX) $(CXXFLAGS) -x c++ -c -o "$@" -
86
87header-checks: $(HCS)
88
89run: $(BIN_DIR)/ws_test
90 $(BIN_DIR)/ws_test
91
92ifneq ("@GMOCK_DIR@", "")
93GMOCK_DIR = @GMOCK_DIR@
94GTEST_DIR = $(GMOCK_DIR)/gtest
95CXXFLAGS += -isystem $(GTEST_DIR)/include -isystem $(GMOCK_DIR)/include
96GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
97 $(GTEST_DIR)/include/gtest/internal/*.h
98GMOCK_HEADERS = $(GMOCK_DIR)/include/gmock/*.h \
99 $(GMOCK_DIR)/include/gmock/internal/*.h \
100 $(GTEST_HEADERS)
101GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)
102GMOCK_SRCS_ = $(GMOCK_DIR)/src/*.cc $(GMOCK_HEADERS)
103
104$(OBJ_DIR)/gtest-all.o : $(GTEST_SRCS_)
105 $(CXX) $(CXXFLAGS) -I$(GTEST_DIR) -I$(GMOCK_DIR) $(CXXFLAGS) \
106 -c $(GTEST_DIR)/src/gtest-all.cc -o $@
107
108$(OBJ_DIR)/gmock-all.o : $(GMOCK_SRCS_)
109 $(CXX) $(CXXFLAGS) -I$(GTEST_DIR) -I$(GMOCK_DIR) $(CXXFLAGS) \
110 -c $(GMOCK_DIR)/src/gmock-all.cc -o $@
111
112$(BIN_DIR)/tests: $(TEST_OBJS) $(BIN_DIR)/libseasocks.a \
113 $(OBJ_DIR)/gmock-all.o $(OBJ_DIR)/gtest-all.o
114 $(CXX) $(LDFLAGS) $(CXXFLAGS) -I $(TEST_SRC) -o $@ $^
115
116.tests-pass: $(BIN_DIR)/tests
117 @rm -f .tests-pass
118 $(BIN_DIR)/tests
119 @touch .tests-pass
120
121test: .tests-pass
122
123ifneq ("@VALGRIND@", "")
124valgrind-test: .tests-pass
125 $(VALGRIND) --leak-check=full --error-exitcode=2 -- $(BIN_DIR)/tests
126else
127valgrind-test:
128 @echo "Not running valgrind-test as no valgrind binary found during configure"
129endif
130
131else
132
133test:
134 @echo "Not running tests as no gmock/gtest specified during configure"
135 @echo "To configure, specify with --with-gmock=PATH_TO_GMOCK"
136test-valgrind: test
137
138endif
139
140clean:
141 rm -rf $(OBJ_DIR) $(BIN_DIR) *.tar.gz .tests-pass
142
143spotless: clean
144 rm -rf lib include config.log configure config.status src/main/c/internal/Config.h Makefile autom4te.cache
145