| default: all |
| |
| AR=ar |
| ARFLAGS=cru |
| CXX=@CXX@ |
| CXXFLAGS=@CXXFLAGS@ |
| VALGRIND=@VALGRIND@ |
| LDFLAGS=@LDFLAGS@ |
| # hack for drw gcc on ubuntu |
| GCC_MULTIARCH := $(shell gcc -print-multiarch 2>/dev/null) |
| ifneq ($(GCC_MULTIARCH),) |
| export LIBRARY_PATH = /usr/lib/$(GCC_MULTIARCH) |
| export C_INCLUDE_PATH = /usr/include/$(GCC_MULTIARCH) |
| export CPLUS_INCLUDE_PATH = /usr/include/$(GCC_MULTIARCH) |
| endif |
| |
| C_SRC=src/main/c |
| TEST_SRC=src/test/c |
| APPS_SRC=src/app/c |
| |
| VERSION_STRING:=SeaSocks/$(or $(VERSION),unversioned) ($(shell git describe --always --dirty || echo non-git)) |
| |
| CXXFLAGS += -fPIC -Wall -Werror '-DSEASOCKS_VERSION_STRING="$(VERSION_STRING)"' -I$(C_SRC) |
| |
| .PHONY: all clean run test spotless header-checks valgrind-test |
| |
| OBJ_DIR=obj |
| BIN_DIR=bin |
| |
| CPP_SRCS=$(shell find $(C_SRC) -name '*.cpp') |
| H_SRCS=$(shell find $(C_SRC) -name '*.h') |
| TEST_SRCS=$(shell find $(TEST_SRC) -name '*.cpp') |
| APPS_CPP_SRCS=$(shell find $(APPS_SRC) -name '*.cpp') |
| TARGETS=$(patsubst $(APPS_SRC)/%.cpp,$(BIN_DIR)/%,$(APPS_CPP_SRCS)) |
| |
| apps: $(TARGETS) |
| all: apps $(BIN_DIR)/libseasocks.so $(BIN_DIR)/libseasocks.a test header-checks valgrind-test |
| |
| debug: |
| echo $($(DEBUG_VAR)) |
| |
| OBJS=$(patsubst $(C_SRC)/%.cpp,$(OBJ_DIR)/%.o,$(CPP_SRCS)) |
| HCS=$(patsubst $(C_SRC)/%.h,$(OBJ_DIR)/%.hc,$(H_SRCS)) |
| TEST_OBJS=$(patsubst $(TEST_SRC)/%.cpp,$(OBJ_DIR)/%.o,$(TEST_SRCS)) |
| APPS_OBJS=$(patsubst $(APPS_SRC)/%.cpp,$(OBJ_DIR)/%.o,$(APPS_CPP_SRCS)) |
| ALL_OBJS=$(OBJS) $(APPS_OBJS) $(TEST_OBJS) |
| GEN_OBJS=$(OBJ_DIR)/embedded.o |
| |
| -include $(ALL_OBJS:.o=.d) |
| |
| $(APPS_OBJS) : $(OBJ_DIR)/%.o : $(APPS_SRC)/%.cpp |
| @mkdir -p $(dir $@) |
| $(CXX) $(CXXFLAGS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -c -o "$@" "$<" |
| |
| $(OBJS) : $(OBJ_DIR)/%.o : $(C_SRC)/%.cpp |
| @mkdir -p $(dir $@) |
| $(CXX) $(CXXFLAGS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -c -o "$@" "$<" |
| |
| $(HCS) : $(OBJ_DIR)/%.hc : $(C_SRC)/%.h |
| @mkdir -p $(dir $@) |
| @echo "Checking header file is self-contained: $<" |
| @$(CXX) -fsyntax-only $(CXXFLAGS) -o /dev/null -c -w $< |
| @touch $@ |
| |
| $(TEST_OBJS) : $(OBJ_DIR)/%.o : $(TEST_SRC)/%.cpp |
| @mkdir -p $(dir $@) |
| $(CXX) $(CXXFLAGS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" -c -o "$@" "$<" |
| |
| $(TARGETS) : $(BIN_DIR)/% : $(OBJ_DIR)/%.o $(OBJS) $(GEN_OBJS) |
| @mkdir -p $(BIN_DIR) |
| $(CXX) $(CXXFLAGS) -o $@ $^ |
| |
| $(BIN_DIR)/libseasocks.so: $(OBJS) $(GEN_OBJS) |
| @mkdir -p $(BIN_DIR) |
| $(CXX) -shared $(CXXFLAGS) -o $@ $^ |
| |
| $(BIN_DIR)/libseasocks.a: $(OBJS) $(GEN_OBJS) |
| @mkdir -p $(BIN_DIR) |
| @-rm -f $(BIN_DIR)/libseasocks.a |
| $(AR) $(ARFLAGS) $@ $^ |
| |
| EMBEDDED_CONTENT:=$(shell find src/main/web -type f) |
| $(OBJ_DIR)/embedded.o: scripts/gen_embedded.py $(EMBEDDED_CONTENT) src/main/c/internal/Embedded.h |
| @mkdir -p $(dir $@) |
| scripts/gen_embedded.py $(EMBEDDED_CONTENT) | $(CXX) $(CXXFLAGS) -x c++ -c -o "$@" - |
| |
| header-checks: $(HCS) |
| |
| run: $(BIN_DIR)/ws_test |
| $(BIN_DIR)/ws_test |
| |
| ifneq ("@GMOCK_DIR@", "") |
| GMOCK_DIR = @GMOCK_DIR@ |
| GTEST_DIR = $(GMOCK_DIR)/gtest |
| CXXFLAGS += -isystem $(GTEST_DIR)/include -isystem $(GMOCK_DIR)/include |
| GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \ |
| $(GTEST_DIR)/include/gtest/internal/*.h |
| GMOCK_HEADERS = $(GMOCK_DIR)/include/gmock/*.h \ |
| $(GMOCK_DIR)/include/gmock/internal/*.h \ |
| $(GTEST_HEADERS) |
| GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS) |
| GMOCK_SRCS_ = $(GMOCK_DIR)/src/*.cc $(GMOCK_HEADERS) |
| |
| $(OBJ_DIR)/gtest-all.o : $(GTEST_SRCS_) |
| $(CXX) $(CXXFLAGS) -I$(GTEST_DIR) -I$(GMOCK_DIR) $(CXXFLAGS) \ |
| -c $(GTEST_DIR)/src/gtest-all.cc -o $@ |
| |
| $(OBJ_DIR)/gmock-all.o : $(GMOCK_SRCS_) |
| $(CXX) $(CXXFLAGS) -I$(GTEST_DIR) -I$(GMOCK_DIR) $(CXXFLAGS) \ |
| -c $(GMOCK_DIR)/src/gmock-all.cc -o $@ |
| |
| $(BIN_DIR)/tests: $(TEST_OBJS) $(BIN_DIR)/libseasocks.a \ |
| $(OBJ_DIR)/gmock-all.o $(OBJ_DIR)/gtest-all.o |
| $(CXX) $(LDFLAGS) $(CXXFLAGS) -I $(TEST_SRC) -o $@ $^ |
| |
| .tests-pass: $(BIN_DIR)/tests |
| @rm -f .tests-pass |
| $(BIN_DIR)/tests |
| @touch .tests-pass |
| |
| test: .tests-pass |
| |
| ifneq ("@VALGRIND@", "") |
| valgrind-test: .tests-pass |
| $(VALGRIND) --leak-check=full --error-exitcode=2 -- $(BIN_DIR)/tests |
| else |
| valgrind-test: |
| @echo "Not running valgrind-test as no valgrind binary found during configure" |
| endif |
| |
| else |
| |
| test: |
| @echo "Not running tests as no gmock/gtest specified during configure" |
| @echo "To configure, specify with --with-gmock=PATH_TO_GMOCK" |
| test-valgrind: test |
| |
| endif |
| |
| clean: |
| rm -rf $(OBJ_DIR) $(BIN_DIR) *.tar.gz .tests-pass |
| |
| spotless: clean |
| rm -rf lib include config.log configure config.status src/main/c/internal/Config.h Makefile autom4te.cache |
| |