forked from i96751414/libtorrent-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
210 lines (180 loc) · 5.31 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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
PROJECT = i96751414
NAME = libtorrent-go
GO_PACKAGE = github.com/i96751414/$(NAME)
CC = cc
CXX = c++
PKG_CONFIG = pkg-config
DOCKER = docker
CROSS_COMPILER_TAG = 0.0.4
TAG = $(shell git describe --tags | cut -c2-)
ifeq ($(TAG),)
TAG := dev
endif
PLATFORMS = \
android-arm \
android-arm64 \
android-x64 \
android-x86 \
darwin-x64 \
linux-arm \
linux-armv7 \
linux-arm64 \
linux-x64 \
linux-x86 \
windows-x64 \
windows-x86
BOOST_VERSION = 1.72.0
BOOST_SHA256 = 59c9b274bc451cf91a9ba1dd2c7fdcaf5d60b1b3aa83f2c9fa143417cc660722
OPENSSL_VERSION = 1.1.1f
OPENSSL_SHA256 = 186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35
SWIG_VERSION = 61ea3c05decb295e072ec4d42ec34a512b0000f9 # master on 2020/09/28 (4.0.2+)
SWIG_SHA256 = 2355ba947dce5b9379a3f366252f66d07cbadab0b143ecf78f4a6b1867fce424
GOLANG_VERSION = 1.16.2
GOLANG_SRC_SHA256 = 37ca14287a23cb8ba2ac3f5c3dd8adbc1f7a54b9701a57824bf19a0b271f83ea
GOLANG_BOOTSTRAP_VERSION = 1.4-bootstrap-20170531
GOLANG_BOOTSTRAP_SHA256 = 49f806f66762077861b7de7081f586995940772d29d4c45068c134441a743fa2
LIBTORRENT_VERSION = 33a10d5a723a6c27d9baee7d9bf2028eb81c88ed # RC_1_2 (1.2.14)
ifeq ($(GOPATH),)
GOPATH = $(shell go env GOPATH)
endif
include platform_host.mk
ifneq ($(CROSS_TRIPLE),)
CC := $(CROSS_TRIPLE)-$(CC)
CXX := $(CROSS_TRIPLE)-$(CXX)
endif
include platform_target.mk
ifeq ($(TARGET_ARCH), x86)
GOARCH = 386
else ifeq ($(TARGET_ARCH), x64)
GOARCH = amd64
else ifeq ($(TARGET_ARCH), arm)
GOARCH = arm
GOARM = 6
else ifeq ($(TARGET_ARCH), armv7)
GOARCH = arm
GOARM = 7
PATH_SUFFIX = v7
PKGDIR = -pkgdir $(GOPATH)/pkg/linux_armv7
else ifeq ($(TARGET_ARCH), arm64)
GOARCH = arm64
GOARM =
endif
ifeq ($(TARGET_OS), windows)
GOOS = windows
ifeq ($(TARGET_ARCH), x64)
CC_DEFINES = -DSWIGWORDSIZE32
endif
else ifeq ($(TARGET_OS), darwin)
GOOS = darwin
CC = $(CROSS_ROOT)/bin/$(CROSS_TRIPLE)-clang
CXX = $(CROSS_ROOT)/bin/$(CROSS_TRIPLE)-clang++
CC_DEFINES = -DSWIGMAC
else ifeq ($(TARGET_OS), linux)
GOOS = linux
ifeq ($(TARGET_ARCH), arm64)
CC_DEFINES = -DSWIGWORDSIZE64
endif
else ifeq ($(TARGET_OS), android)
GOOS = android
ifeq ($(TARGET_ARCH), arm)
GOARM = 7
else
GOARM =
endif
CC = $(CROSS_ROOT)/bin/$(CROSS_TRIPLE)-clang
CXX = $(CROSS_ROOT)/bin/$(CROSS_TRIPLE)-clang++
GO_LDFLAGS = -flto -extldflags=-pie
ifeq ($(TARGET_ARCH), arm64)
CC_DEFINES = -DSWIGWORDSIZE64
endif
endif
ifneq ($(CROSS_ROOT),)
CROSS_CFLAGS = -I$(CROSS_ROOT)/include -I$(CROSS_ROOT)/$(CROSS_TRIPLE)/include
CROSS_LDFLAGS = -L$(CROSS_ROOT)/lib
PKG_CONFIG_PATH = $(CROSS_ROOT)/lib/pkgconfig
endif
DOCKER_GOPATH = "/go"
DOCKER_WORKDIR = "$(DOCKER_GOPATH)/src/$(GO_PACKAGE)"
DOCKER_GOCACHE = "/tmp/.cache"
WORKDIR = "$(shell pwd)"
DEFINES = $(WORKDIR)/interfaces/defines.i
LIBTORRENT_SWIG=$(WORKDIR)/libtorrent_swig.go
WORK = $(WORKDIR)/work
OUT_PATH = "$(GOPATH)/pkg/$(GOOS)_$(GOARCH)$(PATH_SUFFIX)"
OUT_LIBRARY = "$(OUT_PATH)/$(GO_PACKAGE).a"
USERGRP = "$(shell id -u):$(shell id -g)"
.PHONY: $(PLATFORMS) build
all:
for i in $(PLATFORMS); do \
$(MAKE) $$i; \
done
$(PLATFORMS):
$(DOCKER) run --rm \
-u $(USERGRP) \
-v "$(GOPATH)":$(DOCKER_GOPATH) \
-v $(WORKDIR):$(DOCKER_WORKDIR) \
-w $(DOCKER_WORKDIR) \
-e GOCACHE=$(DOCKER_GOCACHE) \
-e GOPATH=$(DOCKER_GOPATH) \
$(PROJECT)/$(NAME)-$@:latest make re
debug:
ifeq ($(PLATFORM),)
$(MAKE) debug PLATFORM=linux-x64
else
$(DOCKER) run --rm \
-u $(USERGRP) \
-v "$(GOPATH)":$(DOCKER_GOPATH) \
-v $(WORKDIR):$(DOCKER_WORKDIR) \
-w $(DOCKER_WORKDIR) \
-e GOCACHE=$(DOCKER_GOCACHE) \
-e GOPATH=$(DOCKER_GOPATH) \
$(PROJECT)/$(NAME)-$(PLATFORM):latest bash -c \
'make re OPTS=-work; \
cp -rf /tmp/go-build* $(DOCKER_WORKDIR)/work'
cp $(WORK)/*/_libtorrent_swig.go $(LIBTORRENT_SWIG)
endif
defines:
( \
echo $(CC_DEFINES) | sed -E 's/-D([a-zA-Z0-9_()]+)=?/\n#define \1 /g' && \
$(CC) -dM -E - </dev/null | grep -E "__WORDSIZE|__x86_64|__x86_64__" | sed -E 's/#define[[:space:]]+([a-zA-Z0-9_()]+)(.*)/#ifndef \1\n#define \1\2\n#endif/g' \
) > $(DEFINES)
build:
CC=$(CC) CXX=$(CXX) \
PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
CGO_ENABLED=1 \
GOOS=$(GOOS) GOARCH=$(GOARCH) GOARM=$(GOARM) \
PATH=.:$$PATH \
go install $(OPTS) -v -ldflags '$(GO_LDFLAGS)' -x $(PKGDIR)
clean:
rm -rf $(OUT_LIBRARY) $(DEFINES) $(WORK) $(LIBTORRENT_SWIG)
re: clean defines build
env:
$(DOCKER) build \
--build-arg BOOST_VERSION=$(BOOST_VERSION) \
--build-arg BOOST_SHA256=$(BOOST_SHA256) \
--build-arg OPENSSL_VERSION=$(OPENSSL_VERSION) \
--build-arg OPENSSL_SHA256=$(OPENSSL_SHA256) \
--build-arg SWIG_VERSION=$(SWIG_VERSION) \
--build-arg SWIG_SHA256=$(SWIG_SHA256) \
--build-arg GOLANG_VERSION=$(GOLANG_VERSION) \
--build-arg GOLANG_SRC_SHA256=$(GOLANG_SRC_SHA256) \
--build-arg GOLANG_BOOTSTRAP_VERSION=$(GOLANG_BOOTSTRAP_VERSION) \
--build-arg GOLANG_BOOTSTRAP_SHA256=$(GOLANG_BOOTSTRAP_SHA256) \
--build-arg LIBTORRENT_VERSION=$(LIBTORRENT_VERSION) \
-t $(PROJECT)/$(NAME)-$(PLATFORM):$(TAG) \
-t $(PROJECT)/$(NAME)-$(PLATFORM):latest \
--build-arg IMAGE_TAG=$(CROSS_COMPILER_TAG) \
-f docker/$(PLATFORM).Dockerfile docker
envs:
for i in $(PLATFORMS); do \
$(MAKE) env PLATFORM=$$i; \
done
pull-all:
for i in $(PLATFORMS); do \
$(MAKE) pull PLATFORM=$$i; \
done
pull:
docker pull $(PROJECT)/$(NAME)-$(PLATFORM):latest
push:
docker push $(PROJECT)/$(NAME)-$(PLATFORM):latest
docker push $(PROJECT)/$(NAME)-$(PLATFORM):$(TAG)