forked from AxisCommunications/acap-runtime
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
99 lines (79 loc) · 3.82 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
INSTALL ?= install
RM ?= rm -f
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
# Paths
#OUT_PATH ?= $(CURDIR)/build_$(shell $(CXX) -dumpmachine)
OUT_PATH ?= $(CURDIR)/build
API_PATH := $(CURDIR)/apis
SRC_PATH := $(CURDIR)/src
TEST_PATH := $(CURDIR)/test
INSTALL_PATH := $(DESTDIR)/usr/bin
GRPC_CPP_PLUGIN := grpc_cpp_plugin
GRPC_CPP_PLUGIN_PATH ?= $(shell which $(GRPC_CPP_PLUGIN))
# Output binary name matches the repository name
BINARY := $(subst -,,$(shell basename -s .git $$(git config --get remote.origin.url)))
TEST := $(addsuffix test, $(BINARY))
# Build files
PROTOBUF_FILES := $(call rwildcard, $(API_PATH),*.proto)
PROTOBUF_H := $(patsubst %.proto,%.pb.h,$(patsubst $(API_PATH)%,$(OUT_PATH)%,$(PROTOBUF_FILES)))
PROTOBUF_O := $(patsubst %.pb.h,%.pb.o,$(PROTOBUF_H))
PROTOBUF_GRPC_O := $(patsubst %.pb.h,%.grpc.pb.o,$(PROTOBUF_H))
SRC_FILES := $(wildcard $(SRC_PATH)/*.cpp $(SRC_PATH)/*.cc)
TEST_FILES := $(wildcard $(TEST_PATH)/*.cpp $(TEST_PATH)/*.cc)
# Compiler flags
# gRPC and protobuf packages don't play well with pkg-config for include so we do a little workaround
PKGS = protobuf grpc grpc++
PKG_CONFIG_CFLAGS_I := $(shell PKG_CONFIG_SYSROOT_DIR="" PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) pkg-config --cflags-only-I $(PKGS))
PKG_CONFIG_CFLAGS_OTHER := $(shell PKG_CONFIG_SYSROOT_DIR="" PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) pkg-config --cflags-only-other $(PKGS))
PKG_CONFIG_LDFLAGS := $(shell PKG_CONFIG_SYSROOT_DIR="" PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) pkg-config --libs-only-L $(PKGS))
PKG_CONFIG_LDLIBS := $(shell PKG_CONFIG_SYSROOT_DIR="" PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) pkg-config --libs-only-l $(PKGS))
PKGS = gio-2.0 glib-2.0 vdostream
PKG_CONFIG_CFLAGS_I += $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) pkg-config --cflags-only-I $(PKGS))
PKG_CONFIG_CFLAGS_OTHER += $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) pkg-config --cflags-only-other $(PKGS))
PKG_CONFIG_LDFLAGS += $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) pkg-config --libs-only-L $(PKGS))
PKG_CONFIG_LDLIBS += $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) pkg-config --libs-only-l $(PKGS))
CXXFLAGS += -DLAROD_API_VERSION_2 -std=c++17 -I$(OUT_PATH) $(PKG_CONFIG_CFLAGS_OTHER) $(PKG_CONFIG_CFLAGS_I)
LDLIBS += -llarod -lrt $(PKG_CONFIG_LDLIBS)
LDFLAGS += $(PKG_CONFIG_LDFLAGS)
.PHONY: clean install install/strip
# Do not remove intermediate files
.SECONDARY:
all: install/strip
# Main binary
$(OUT_PATH)/$(BINARY): $(SRC_FILES) $(PROTOBUF_H) $(PROTOBUF_O) $(PROTOBUF_GRPC_O)
$(CXX) $(CXXFLAGS) $(LDFLAGS) \
-I$(OUT_PATH)/tensorflow_serving/apis \
-o $@ src/main.c $(SRC_FILES) $(PROTOBUF_O) $(PROTOBUF_GRPC_O) $(LDLIBS)
# Test binary -fsanitize=leak
$(OUT_PATH)/$(TEST): $(TEST_FILES) $(SRC_FILES) $(PROTOBUF_H) $(PROTOBUF_O) $(PROTOBUF_GRPC_O)
$(CXX) -g $(CXXFLAGS) $(LDFLAGS) \
-I$(SRC_PATH) \
-I/usr/src/googletest/googletest/include \
-I/usr/src/googletest/googlemock/include \
-I$(OUT_PATH)/tensorflow_serving/apis \
-o $@ $(TEST_FILES) $(SRC_FILES) $(PROTOBUF_O) $(PROTOBUF_GRPC_O) -lgtest_main -lgtest $(LDLIBS)
# Build directory
$(OUT_PATH) $(INSTALL_PATH):
$(INSTALL) -d $@
# Protobuf object files
%.pb.o: %.pb.cc
$(CXX) -c $(CXXFLAGS) -I$(OUT_PATH) $^ -o $@
# Generate protobuf gRPC source files
$(OUT_PATH)/%.grpc.pb.cc $(OUT_PATH)/%grpc.pb.h: $(API_PATH)/%.proto | $(OUT_PATH)
protoc $(PKG_CONFIG_CFLAGS_I) \
-I$(API_PATH) \
--grpc_out=$(OUT_PATH) \
--plugin=protoc-gen-grpc=$(GRPC_CPP_PLUGIN_PATH) $<
# Generate protobuf source files
$(OUT_PATH)/%.pb.cc $(OUT_PATH)/%.pb.h: $(API_PATH)/%.proto | $(OUT_PATH)
protoc $(PKG_CONFIG_CFLAGS_I) -I$(API_PATH) --cpp_out=$(OUT_PATH) $<
$(BINARY): $(OUT_PATH)/$(BINARY)
cp $(OUT_PATH)/$(BINARY) $(CURDIR)
$(TEST): $(OUT_PATH)/$(TEST)
cp $(OUT_PATH)/$(TEST) $(CURDIR)
install/strip: $(BINARY) $(TEST)
$(STRIP) $^
clean:
$(RM) -r $(OUT_PATH)
test: $(OUT_PATH)/$(TEST)
$(OUT_PATH)/$(TEST)