blob: 6261306ce5f78f66c431b562c8bd34619c1cd2e6 [file] [log] [blame]
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