Austin Schuh | 24adb6b | 2015-09-06 17:37:40 -0700 | [diff] [blame^] | 1 | default: all |
| 2 | |
| 3 | AR=ar |
| 4 | ARFLAGS=cru |
| 5 | CXX=@CXX@ |
| 6 | CXXFLAGS=@CXXFLAGS@ |
| 7 | VALGRIND=@VALGRIND@ |
| 8 | LDFLAGS=@LDFLAGS@ |
| 9 | # hack for drw gcc on ubuntu |
| 10 | GCC_MULTIARCH := $(shell gcc -print-multiarch 2>/dev/null) |
| 11 | ifneq ($(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) |
| 15 | endif |
| 16 | |
| 17 | C_SRC=src/main/c |
| 18 | TEST_SRC=src/test/c |
| 19 | APPS_SRC=src/app/c |
| 20 | |
| 21 | VERSION_STRING:=SeaSocks/$(or $(VERSION),unversioned) ($(shell git describe --always --dirty || echo non-git)) |
| 22 | |
| 23 | CXXFLAGS += -fPIC -Wall -Werror '-DSEASOCKS_VERSION_STRING="$(VERSION_STRING)"' -I$(C_SRC) |
| 24 | |
| 25 | .PHONY: all clean run test spotless header-checks valgrind-test |
| 26 | |
| 27 | OBJ_DIR=obj |
| 28 | BIN_DIR=bin |
| 29 | |
| 30 | CPP_SRCS=$(shell find $(C_SRC) -name '*.cpp') |
| 31 | H_SRCS=$(shell find $(C_SRC) -name '*.h') |
| 32 | TEST_SRCS=$(shell find $(TEST_SRC) -name '*.cpp') |
| 33 | APPS_CPP_SRCS=$(shell find $(APPS_SRC) -name '*.cpp') |
| 34 | TARGETS=$(patsubst $(APPS_SRC)/%.cpp,$(BIN_DIR)/%,$(APPS_CPP_SRCS)) |
| 35 | |
| 36 | apps: $(TARGETS) |
| 37 | all: apps $(BIN_DIR)/libseasocks.so $(BIN_DIR)/libseasocks.a test header-checks valgrind-test |
| 38 | |
| 39 | debug: |
| 40 | echo $($(DEBUG_VAR)) |
| 41 | |
| 42 | OBJS=$(patsubst $(C_SRC)/%.cpp,$(OBJ_DIR)/%.o,$(CPP_SRCS)) |
| 43 | HCS=$(patsubst $(C_SRC)/%.h,$(OBJ_DIR)/%.hc,$(H_SRCS)) |
| 44 | TEST_OBJS=$(patsubst $(TEST_SRC)/%.cpp,$(OBJ_DIR)/%.o,$(TEST_SRCS)) |
| 45 | APPS_OBJS=$(patsubst $(APPS_SRC)/%.cpp,$(OBJ_DIR)/%.o,$(APPS_CPP_SRCS)) |
| 46 | ALL_OBJS=$(OBJS) $(APPS_OBJS) $(TEST_OBJS) |
| 47 | GEN_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 | |
| 82 | EMBEDDED_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 | |
| 87 | header-checks: $(HCS) |
| 88 | |
| 89 | run: $(BIN_DIR)/ws_test |
| 90 | $(BIN_DIR)/ws_test |
| 91 | |
| 92 | ifneq ("@GMOCK_DIR@", "") |
| 93 | GMOCK_DIR = @GMOCK_DIR@ |
| 94 | GTEST_DIR = $(GMOCK_DIR)/gtest |
| 95 | CXXFLAGS += -isystem $(GTEST_DIR)/include -isystem $(GMOCK_DIR)/include |
| 96 | GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \ |
| 97 | $(GTEST_DIR)/include/gtest/internal/*.h |
| 98 | GMOCK_HEADERS = $(GMOCK_DIR)/include/gmock/*.h \ |
| 99 | $(GMOCK_DIR)/include/gmock/internal/*.h \ |
| 100 | $(GTEST_HEADERS) |
| 101 | GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS) |
| 102 | GMOCK_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 | |
| 121 | test: .tests-pass |
| 122 | |
| 123 | ifneq ("@VALGRIND@", "") |
| 124 | valgrind-test: .tests-pass |
| 125 | $(VALGRIND) --leak-check=full --error-exitcode=2 -- $(BIN_DIR)/tests |
| 126 | else |
| 127 | valgrind-test: |
| 128 | @echo "Not running valgrind-test as no valgrind binary found during configure" |
| 129 | endif |
| 130 | |
| 131 | else |
| 132 | |
| 133 | test: |
| 134 | @echo "Not running tests as no gmock/gtest specified during configure" |
| 135 | @echo "To configure, specify with --with-gmock=PATH_TO_GMOCK" |
| 136 | test-valgrind: test |
| 137 | |
| 138 | endif |
| 139 | |
| 140 | clean: |
| 141 | rm -rf $(OBJ_DIR) $(BIN_DIR) *.tar.gz .tests-pass |
| 142 | |
| 143 | spotless: clean |
| 144 | rm -rf lib include config.log configure config.status src/main/c/internal/Config.h Makefile autom4te.cache |
| 145 | |