-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
178 lines (145 loc) · 5.64 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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
.ONESHELL:
SHELL = /bin/bash
ARCH=$(shell uname -m)
CC = clang
GO ?= /usr/local/go/bin/go
MAIN = l7egg
TAG ?= latest
BASE_TAG ?= latest
DEBUG ?= 1
BUILD_DIR = build
TARGET_CLI_STATIC := $(BUILD_DIR)/$(MAIN)-cli-static
TARGET_CLI_DYN := $(BUILD_DIR)/$(MAIN)-cli-dynamic
TARGET_K8S_STATIC := $(BUILD_DIR)/$(MAIN)-k8s-static
TARGET_K8S_DYN := $(BUILD_DIR)/$(MAIN)-k8s-dynamic
TARGET_BPF := $(BUILD_DIR)/$(MAIN).bpf.o
VMLINUX_H := ./kernel/vmlinux.h
# $make in libbpf/src will create libbpf.a, libbpf.so
PRJ_DIR := $(shell pwd)
LIBBPF_DIR ?= $(PRJ_DIR)/libbpf/src
LIBBPF_STATIC_LIB = $(LIBBPF_DIR)/libbpf.a
LIBBPF_INCLUDES = $(LIBBPF_DIR)
LIBBPF_DYN_LIB_PATH = $(LIBBPF_DIR)
LIBBPF_DYN_LIB = $(LIBBPF_DIR)/libbpf.so
CMD_CLI_GO_SRC := ./cmd/cli/*.go
CMD_K8S_GO_SRC := ./cmd/kubernetes/*.go
BPF_SRC := $(wildcard ./kernel/*.c)
BPF_HEADERS := $(wildcard ./kernel/*.h)
CFLAGS = -g -O2 -Wall -fpie
CGO_CFLAGS = "-I$(abspath $(LIBBPF_INCLUDES))"
#CGO_LDFLAGS_STATIC = "-Wl,-Bstatic -L$(LIBBPF_STATIC_LIB) -lbpf -Wl,-Bdynamic -lz -lelf"
CGO_LDFLAGS_STATIC = "-lelf -lz -L$(LIBBPF_STATIC_LIB) -lbpf"
#CGO_EXTLDFLAGS_STATIC = '-extldflags "-Wl,-Bstatic -L$(LIBBPF_STATIC_LIB) -lbpf -Wl,-Bdynamic -lz -lelf"'
CGO_EXTLDFLAGS_STATIC = '-extldflags "-static"'
# inject shared library search path into the executable: -Wl,rpath=...:
# -w - removed (reason: https://youtrack.jetbrains.com/issue/GO-15231/Remote-debugging-breakpoint-not-reachable-could-not-find-file)
#CGO_LDFLAGS_DYN = '-lelf -lz -Wl,-rpath=$(LIBBPF_DYN_LIB) -L$(LIBBPF_DYN_LIB) -lbpf'
CGO_EXTLDFLAGS_DYN = '-extldflags "-lelf -lz -Wl,-rpath=$(LIBBPF_DYN_LIB_PATH) -L$(LIBBPF_DYN_LIB_PATH) -lbpf"'
build:
mkdir -p $(BUILD_DIR)
.PHONY: dynamic
dynamic: $(LIBBPF_DYN_LIB) $(TARGET_BPF) $(TARGET_CLI_DYN) $(TARGET_K8S_DYN)
.PHONY: dynamic-with-libbpf-dev
dynamic-with-libbpf-dev: $(TARGET_BPF) $(TARGET_K8S_DYN)
.PHONY: static
static: $(LIBBPF_STATIC_LIB) $(TARGET_BPF) $(TARGET_CLI_STATIC) $(TARGET_K8S_STATIC)
.PHONY: static-with-libbpf-dev
static-with-libbpf-dev: $(TARGET_BPF) $(TARGET_K8S_STATIC)
$(BPF_SRC): $(BPF_HEADERS) $(VMLINUX_H)
$(LIBBPF_STATIC_LIB): $(wildcard $(LIBBPF_DIR)/*.c) $(wildcard $(LIBBPF_DIR)/*.h)
BUILD_STATIC_ONLY=y $(MAKE) -C $(LIBBPF_DIR)
$(LIBBPF_DYN_LIB): $(wildcard $(LIBBPF_DIR)/*.c) $(wildcard $(LIBBPF_DIR)/*.h)
$(MAKE) -C $(LIBBPF_DIR)
# -D__TARGET_ARCH_$(ARCH) - removed - needed only for tracing
$(TARGET_BPF): build $(BPF_SRC)
$(CC) \
-MJ compile_commands.json \
-g \
-Wall \
-fpie \
-I$(LIBBPF_INCLUDES) \
-DDEBUG=$(DEBUG) \
-O2 \
-target bpf \
-c $^ \
-o $@
$(TARGET_CLI_STATIC): build $(LIBBPF_STATIC_LIB) $(CMD_CLI_GO_SRC) $(TARGET_BPF)
CGO_CFLAGS=$(CGO_CFLAGS) \
CGO_LDFLAGS=$(CGO_LDFLAGS_STATIC) \
$(GO) build \
-tags osusergo,netgo \
-ldflags $(CGO_EXTLDFLAGS_STATIC) \
-o $@ ./cmd/cli/$(MAIN).go
$(TARGET_CLI_DYN): build $(LIBBPF_DYN_LIB) $(CMD_CLI_GO_SRC) $(TARGET_BPF)
CGO_CFLAGS=$(CGO_CFLAGS) \
$(GO) build \
-ldflags $(CGO_EXTLDFLAGS_DYN) \
-o $@ ./cmd/cli/$(MAIN).go
.PHONY: clean
clean:
$(GO) clean -i
rm $(TARGET_BPF) $(TARGET_CLI) $(TARGET_K8S_STATIC) $(TARGET_CLI_STATIC) $(TARGET_K8S_DYN) $(TARGET_CLI_DYN) compile_commands.json 2> /dev/null || true
$(VMLINUX_H):
bpftool btf dump file /sys/kernel/btf/vmlinux format c > ./kernel/vmlinux.h
.PHONY: remote-build2
remote-build2:
rsync -ahv --delete --exclude '.git' . mlk@ubu-ebpf2:/home/mlk/go/src/github.com/MaciekLeks/l7egg
ssh mlk@ubu-ebpf2 "cd /home/mlk/go/src/github.com/MaciekLeks/l7egg && make clean && make dynamic"
.PHONY: remote-build3
remote-build3:
rsync -ahv --delete --exclude '.git' . mlk@ubu-ebpf3:/home/mlk/go/src/github.com/MaciekLeks/l7egg
ssh mlk@ubu-ebpf3 "cd /home/mlk/go/src/github.com/MaciekLeks/l7egg && make clean && make dynamic"
.PHONY: remote-build-all
remote-build-all: remote-build2 remote-build3
.PHONY: docker
docker:
docker build -t maciekleks/l7egg-base:latest -t maciekleks/l7egg-base:$(TAG) -f Dockerfile-base .
docker push maciekleks/l7egg-base --all-tags
docker build -t maciekleks/l7egg:debug-$(TAG) -f Dockerfile-debug .
docker push maciekleks/l7egg:debug-$(TAG)
docker build --no-cache --build-arg BASE_TAG=$(TAG) -t maciekleks/l7egg:distroless-$(TAG) -f Dockerfile-distroless .
docker push maciekleks/l7egg:distroless-$(TAG)
#
# code-genartor must be set in the K8S_CODE_GENERATOR
# Generates:
# - deepcopy objects
# - clientsets
# - informers
# - listers
K8S_CODE_GENERATOR ?= ${GOPATH}/src/github.com/k8s.io/code-generator
.PHONY: k8s-build-client
k8s-build-client:
$(K8S_CODE_GENERATOR)/generate-groups.sh \
all \
github.com/MaciekLeks/l7egg/pkg/client \
github.com/MaciekLeks/l7egg/pkg/apis \
"maciekleks.dev:v1alpha1" \
--go-header-file $(K8S_CODE_GENERATOR)/hack/boilerplate.go.txt
#-gcflags "all=-N -l" - debug only
$(TARGET_K8S_STATIC): build $(LIBBPF_STATIC_LIB) $(CMD_K8S_GO_SOURCE) $(TARGET_BPF)
CC=$(CC) \
CGO_ENABLED=1 \
CGO_CFLAGS=$(CGO_CFLAGS) \
CGO_LDFLAGS=$(CGO_LDFLAGS_STATIC) \
$(GO) build \
-trimpath \
-tags osusergo,netgo \
-ldflags $(CGO_EXTLDFLAGS_STATIC) \
-gcflags "all=-N -l" \
-o $@ ./cmd/kubernetes/$(MAIN).go
$(TARGET_K8S_DYN): build $(LIBBPF_DYN_LIB) $(CMD_K8S_GO_SOURCE) $(TARGET_BPF)
CC=$(CC) \
CGO_ENABLED=1 \
CGO_CFLAGS=$(CGO_CFLAGS) \
$(GO) build \
-ldflags $(CGO_EXTLDFLAGS_DYN) \
-gcflags "all=-N -l" \
-o $@ ./cmd/kubernetes/$(MAIN).go
.PHONY: k8s-build-cmd-dynamic
k8s-build-cmd-dynamic: $(TARGET_K8S_DYN)
# K8S_CONTROLLER_GEN ?= ${GOPATH}/src/github.com/kubernetes-sigs/controller-tools/cmd/controller-gen
# before use build controller-gen in $K8S_CONTROLLER_GEN using command `go build -o controller-gen`
# see files in tools: {tools.go, generate.go}
.PHONY: k8s-build-crds
k8s-build-crds:
$(GO) generate ./...