-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMakefile
More file actions
306 lines (260 loc) · 10.4 KB
/
Makefile
File metadata and controls
306 lines (260 loc) · 10.4 KB
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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
# NOT RECOMMENDED TO EDIT
-include custom.mk
include core.env
default: help
.PHONY: default
prepare: ## Prepare environment
$(call PREPARE_DUMMY)
dart pub global activate protoc_plugin
go mod -C go tidy
$(call PROTO_GO)
$(call PROTO_DART)
ifeq ($(wildcard web/.),)
flutter create -e --platforms=web .
$(call UPDATE_WEB)
endif
ifeq ($(wildcard android/.),)
$(call PREPARE_ANDROID)
endif
ifeq ($(wildcard ios/.),)
$(call PREPARE_IOS)
endif
ifeq ($(wildcard macos/.),)
$(call PREPARE_MACOS)
endif
.PHONY: prepare
define UPDATE_WEB
mkdir -p web
cp -fr platform_templates/web/. web/
endef
update_web: ## Update Web
$(call UPDATE_WEB)
.PHONY: update_web
define PREPARE_DUMMY
touch packages/web_internal/lib/worker.wasm
endef
define PREPARE_ANDROID
flutter create -e --platforms=android .
perl -pi -e 's/(<manifest .*?>)/$$1\n <uses-permission android:name="android.permission.INTERNET" \/>/' android/app/src/main/AndroidManifest.xml;
endef
define PREPARE_IOS
flutter create -e --platforms=ios .
perl -pi -e 's/(<\/dict>)/\t<key>com.apple.security.network.client<\/key>\n\t<true\/>\n\t<key>keychain-access-groups<\/key>\n\t<array\/>\n$$1/' ios/Runner/DebugProfile.entitlements
perl -pi -e 's/(<\/dict>)/\t<key>com.apple.security.network.client<\/key>\n\t<true\/>\n\t<key>keychain-access-groups<\/key>\n\t<array\/>\n$$1/' ios/Runner/Release.entitlements
endef
define PREPARE_MACOS
flutter create -e --platforms=macos .
perl -pi -e 's/(<\/dict>)/\t<key>com.apple.security.network.client<\/key>\n\t<true\/>\n\t<key>keychain-access-groups<\/key>\n\t<array\/>\n$$1/' macos/Runner/DebugProfile.entitlements
perl -pi -e 's/(<\/dict>)/\t<key>com.apple.security.network.client<\/key>\n\t<true\/>\n\t<key>keychain-access-groups<\/key>\n\t<array\/>\n$$1/' macos/Runner/Release.entitlements
endef
define UPDATE_GO_BUILD_VERSION
go run go/cmd/gen_go_build_version/main.go lib/version/go_build_version.dart
endef
define UPDATE_GO_BUILD_VERSION_WEB
perl -pi -e "s/const asset.*?$$/$$1const asset = \"assets\/packages\/web_internal\/worker.wasm\?v=$(shell date +%s)\"\;/" web/worker.js
endef
prepare_go_wasm_test: web/sqlite3.js web/sqlite3.js web/sqlite3-opfs-async-proxy.js web/sqlite3.wasm ## Prepare Go Wasm test environment
cp web/sqlite3.js go/cmd/go_js_wasm_exec/
cp web/sqlite3.wasm go/cmd/go_js_wasm_exec/
cp web/sqlite3-opfs-async-proxy.js go/cmd/go_js_wasm_exec/
go install -C go/cmd/go_js_wasm_exec
.PHONY: prepare_go_wasm_test
web: update_web proto wasm_tinygo ## Build for Web browser
flutter build web --release
.PHONY: web
web_run: update_web proto wasm ## Run for Web browser
flutter run -d web-server
.PHONY: web_run
web_run_opt: update_web proto wasm_tinygo ## Run for Web browser optimized
flutter run -d web-server
.PHONY: web_run_opt
wasm: wasm_exec web/sqlite3.js ## Build Wasm worker
GOOS=js GOARCH=wasm go build -C go -ldflags='-w -s' -o ../packages/web_internal/lib/worker.wasm
$(call UPDATE_GO_BUILD_VERSION)
$(call UPDATE_GO_BUILD_VERSION_WEB)
.PHONY: wasm
wasm_tinygo: wasm_exec_tinygo web/sqlite3.js ## Build Wasm worker with TinyGo
GOOS=js GOARCH=wasm tinygo build -C go -no-debug -panic=trap -opt=2 -o ../packages/web_internal/lib/worker.wasm
$(call UPDATE_GO_BUILD_VERSION)
$(call UPDATE_GO_BUILD_VERSION_WEB)
.PHONY: wasm_tinygo
wasm_exec:
cp $(shell go env GOROOT)/lib/wasm/wasm_exec.js web/
.PHONY: wasm_exec
wasm_exec_tinygo:
cp $(shell tinygo env TINYGOROOT)/targets/wasm_exec.js web/
.PHONY: wasm_exec_tinygo
web/sqlite3.js:
npm install @sqlite.org/sqlite-wasm@">=3.51.1-build1"
cp node_modules/@sqlite.org/sqlite-wasm/sqlite-wasm/jswasm/sqlite3-opfs-async-proxy.js web/sqlite3-opfs-async-proxy.js
cp node_modules/@sqlite.org/sqlite-wasm/sqlite-wasm/jswasm/sqlite3.wasm web/sqlite3.wasm
cp node_modules/@sqlite.org/sqlite-wasm/sqlite-wasm/jswasm/sqlite3.js web/sqlite3.js
apk: proto android_lib_arm64-v8a android_lib_x86_64 ffi ## Build Android apk
flutter build apk --release --dart-define-from-file=core.env
.PHONY: apk
appbundle: proto android_lib_arm64-v8a android_lib_x86_64 ffi ## Build Android appbundle
flutter build appbundle --release --dart-define-from-file=core.env
.PHONY: appbundle
NDK_TOOLCHAIN=${NDK_PATH}/toolchains/llvm/prebuilt/darwin-x86_64/bin
android_lib_arm64-v8a: go/dart_api/dart_api_dl.h ## Build Android arm64-v8a library
CGO_ENABLED=1 GOOS=android GOARCH=arm64 \
CC=$(NDK_TOOLCHAIN)/aarch64-linux-android21-clang \
go build -C go -ldflags="-w -s -extldflags=-Wl,-soname,${LIB_NAME}" -buildmode=c-shared -tags='android' \
-o build/android-arm64-v8a/${LIB_NAME}.so .
mkdir -p packages/native_internal/android/src/main/jniLibs/arm64-v8a
cp go/build/android-arm64-v8a/${LIB_NAME}.so packages/native_internal/android/src/main/jniLibs/arm64-v8a/
cp go/build/android-arm64-v8a/${LIB_NAME}.h exported.h
.PHONY: android_lib_arm64-v8a
android_lib_x86_64: go/dart_api/dart_api_dl.h ## Build Android x86_64 library
CGO_ENABLED=1 GOOS=android GOARCH=amd64 \
CC=$(NDK_TOOLCHAIN)/x86_64-linux-android21-clang \
go build -C go -ldflags="-w -s -extldflags=-Wl,-soname,${LIB_NAME}" -buildmode=c-shared -tags='android' \
-o build/android-x86_64/${LIB_NAME}.so .
mkdir -p packages/native_internal/android/src/main/jniLibs/x86_64
cp go/build/android-x86_64/${LIB_NAME}.so packages/native_internal/android/src/main/jniLibs/x86_64/
cp go/build/android-x86_64/${LIB_NAME}.h exported.h
.PHONY: android_lib_x86_64
ios: proto ios_lib ffi ## Build for iOS
flutter build ios --release --dart-define-from-file=core.env
.PHONY: ios
ios_lib: go/dart_api/dart_api_dl.h ## Build iOS native library
CGO_ENABLED=1 GOOS=ios GOARCH=arm64 CGO_CFLAGS="-fembed-bitcode" \
SDK=iphoneos PLATFORM=ios CC=$(PWD)/clangwrap.sh \
go build -C go -buildmode=c-archive -tags='ios' \
-o build/ios-arm64/${LIB_NAME}.a .
cp go/build/ios-arm64/${LIB_NAME}.a packages/native_internal/ios/
cp go/build/ios-arm64/${LIB_NAME}.h exported.h
.PHONY: ios_lib
macos_run: proto macos_lib ffi ## Run for macOS (for testing)
flutter run -d macos --dart-define-from-file=core.env
.PHONY: macos
macos_lib: go/dart_api/dart_api_dl.h ## Build macOS native library (for testing)
CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 \
go build -C go -ldflags='-w -s' -buildmode=c-shared -trimpath -tags debug \
-o build/macos-arm64/${LIB_NAME}.dylib .
cp go/build/macos-arm64/${LIB_NAME}.dylib packages/native_internal/macos/
cp go/build/macos-arm64/${LIB_NAME}.dylib macos/
cp go/build/macos-arm64/${LIB_NAME}.h exported.h
.PHONY: macos_lib
go/dart_api/dart_api_dl.h:
$(call DART_API)
dart_api: ## Update Dart C API headers
$(call DART_API)
.PHONY: dart_api
define DART_API
git clone --depth 1 --branch stable https://github.com/dart-lang/sdk /tmp/github.com/dart-lang/sdk
cp -r /tmp/github.com/dart-lang/sdk/runtime/include/* go/dart_api/
cp /tmp/github.com/dart-lang/sdk/LICENSE go/dart_api/
rm -rf /tmp/github.com/dart-lang/sdk
endef
lib/bridge/native_library.g.dart: exported.h
$(call NATIVE_BRIDGE)
ffi: exported.h ## Generate Dart native bridge
$(call NATIVE_BRIDGE)
.PHONY: ffi
define NATIVE_BRIDGE
dart run ffigen --config ffigen_config.yaml --verbose severe && flutter pub get
endef
proto: ## Generate protobuf code
$(call PROTO_GO)
$(call PROTO_DART)
.PHONY: proto
proto_go: ## Generate protobuf Go code (for CI)
$(call PROTO_GO)
.PHONY: proto_go
define PROTO_GO
go install -C go/cmd/protoc-gen-go-flap
# 0. Clean proto gen files
rm -rf go/pb/*
mkdir -p go/pb
# 1. Generate standard Go Protobuf (for non-TinyGo)
protoc -I=proto \
--plugin protoc-gen-go="$(shell go tool -C go -n protoc-gen-go)" \
--go_out=go --go_opt=module=flap **/*.proto
# 2. Add build tag to standard Go files
for f in go/pb/*.pb.go; do \
if ! grep -q "go:build" $$f; then \
if [ "$$(uname)" = "Darwin" ]; then \
sed -i '' '1s/^/\/\/go:build !js\n\n/' $$f; \
else \
sed -i '1s/^/\/\/go:build !js\n\n/' $$f; \
fi \
fi \
done
# 3. Temporarily move standard files to avoid overwrite
mkdir -p go/pb/tmp_std
mv go/pb/*.pb.go go/pb/tmp_std/
# 4. Generate Lite Go Protobuf (for TinyGo) and Flap Protobuf
protoc -I=proto \
--plugin protoc-gen-go-lite="$(shell go tool -C go -n protoc-gen-go-lite)" \
--plugin protoc-gen-go-flap="$(shell go env GOPATH)/bin/protoc-gen-go-flap" \
--go-lite_out=go --go-lite_opt=module=flap,features=marshal+unmarshal+size+equal+clone \
--go-flap_out=go --go-flap_opt=module=flap \
**/*.proto
# 5. Rename Lite files and add build tag
for f in go/pb/*.pb.go; do \
if [ "$$(uname)" = "Darwin" ]; then \
sed -i '' '1s/^/\/\/go:build js\n\n/' $$f; \
else \
sed -i '1s/^/\/\/go:build js\n\n/' $$f; \
fi; \
mv $$f $${f%.go}_lite.go; \
done
# 6. Restore standard files
mv go/pb/tmp_std/*.pb.go go/pb/
rmdir go/pb/tmp_std
# 7. Generate MarshalVT wrappers for standard Go
go run go/cmd/gen_marshal_std/main.go go/pb
endef
define PROTO_DART
rm -rf lib/pb/*
mkdir -p lib/pb
go install -C go/cmd/protoc-gen-dart-flap
# 10. Generate Dart code
protoc -I=proto \
--plugin protoc-gen-dart-flap="$(shell go env GOPATH)/bin/protoc-gen-dart-flap" \
--dart_out=lib/pb \
--dart-flap_out=lib/pb \
**/*.proto
endef
clean: ## Clean all build artifacts
rm -f web/wasm_exec.js
rm -f web/sqlite3.js
rm -f web/sqlite3-opfs-async-proxy.js
rm -f web/sqlite3.wasm
rm -f go/cmd/go_js_wasm_exec/sqlite3.js
rm -f go/cmd/go_js_wasm_exec/sqlite3-opfs-async-proxy.js
rm -f go/cmd/go_js_wasm_exec/sqlite3.wasm
rm -f go/cmd/go_js_wasm_exec/wasm_exec.js
rm -f packages/web_internal/lib/worker.wasm
rm -rf node_modules
rm -rf go/build/
rm -rf go/pb/
rm -rf lib/pb/
rm -f packages/native_internal/macos/${LIB_NAME}.dylib
rm -f macos/${LIB_NAME}.dylib
rm -f packages/native_internal/ios/${LIB_NAME}.a
rm -f packages/native_internal/android/src/main/jniLibs/x86_64/${LIB_NAME}.so
rm -f packages/native_internal/android/src/main/jniLibs/arm64-v8a/${LIB_NAME}.so
rm -f exported.h
rm -f lib/bridge/*.g.dart
rm -f lib/version/go_build_version.dart
flutter clean
.PHONY: clean
reset: clean ## Reset the project to template state
rm -rf web
rm -rf android
rm -rf ios
rm -rf macos
.PHONY: reset
action: ## Test GitHub Action locally
act -s GITHUB_TOKEN="$(shell gh auth token)" --container-architecture linux/amd64
.PHONY: action
FLAP_VERSION ?= $(shell git describe --tags --exact-match 2>/dev/null || echo "latest")
flap: ## Install flap CLI
go install -C go -ldflags="-X main.Version=$(FLAP_VERSION)" ./cmd/flap
.PHONY: flap
help: ## Show this help
@grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(firstword $(MAKEFILE_LIST)) | \
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
.PHONY: help