Repository navigation
Expand file tree
/
Copy pathMakefile
More file actions
204 lines (160 loc) · 8.72 KB
/
Copy pathMakefile
File metadata and controls
204 lines (160 loc) · 8.72 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
GOROOT = $(shell go env GOROOT)
GO_PATCH_1230 = "https://github.com/golang/go/commit/76a8409eb81eda553363783dcdd9d6224368ae0e.patch"
GO_PATCH_1234 = "https://github.com/golang/go/commit/59b7d40774b29bd1da1aa624f13233111aff4ad2.patch"
CLIP = sh -c 'if [ -n "$$WAYLAND_DISPLAY" ]; then exec wl-copy; \
elif [ -n "$$DISPLAY" ]; then exec xclip -selection clipboard; \
else echo "No display detected (WAYLAND_DISPLAY/DISPLAY missing)"; exit 1; fi'
# androidx sqlite-bundled ships no libsqliteJni for every platform, and without it
# Room cannot open the database. darwin/amd64 (osx_x64) is dropped for good; windows/arm64
# is only commented out, waiting for https://issuetracker.google.com/issues/426464784.
DARWIN_AMD64_SQLITE_ISSUE = https://issuetracker.google.com/issues/495864182
DESKTOP_TARGETS_COMMON = linux/amd64,linux/arm64,darwin/arm64,windows/amd64
DESKTOP_TARGETS_LINUX = linux/amd64 linux/arm64
# DESKTOP_TARGETS_WINDOWS = windows/amd64 windows/arm64
DESKTOP_TARGETS_WINDOWS = windows/amd64
LINUX_PACKAGE_FORMATS ?= deb,rpm,pacman
HOST_OS = $(shell uname -s)
DESKTOP_TARGET_GRADLE_ARG = $(if $(DESKTOP_TARGET),-PdesktopTarget=$(DESKTOP_TARGET),)
DESKTOP_TARGET_SCRIPT_ARG = $(if $(DESKTOP_TARGET),--target $(DESKTOP_TARGET),)
DESKTOP_APP_ARGS = $(if $(strip $(ARGS)),--args="$(ARGS)",)
DARWIN_SDK_SCRIPT_ARG = $(if $(DARWIN_SDK),--darwinsdk "$(DARWIN_SDK)",)
WINDOWS_NO_SIGN_SCRIPT_ARG = $(if $(filter 1,$(WINDOWS_NO_SIGN)),--no-sign,)
LAUNCHER_ZIG_TARGET = $(subst linux/amd64,x86_64-linux-musl,$(subst linux/arm64,aarch64-linux-musl,$(subst darwin/arm64,aarch64-macos,$(subst windows/amd64,x86_64-windows,$(subst windows/arm64,aarch64-windows,$(DESKTOP_TARGET))))))
LAUNCHER_ZIG_TARGET_ARG = $(if $(LAUNCHER_ZIG_TARGET),-Dtarget=$(LAUNCHER_ZIG_TARGET),)
# make expands DESKTOP_TARGETS into a single literal word, so the shell's IFS
# never gets to split it — commas have to become spaces here instead.
COMMA = ,
.PHONY: libcore_android core_desktop core_desktop_common aboutlibraries aboutlibraries_go aboutlibraries_android aboutlibraries_desktop apk apk_debug assets icon desktop desktop_release desktop_package desktop_package_linux desktop_package_linux_all desktop_package_macos desktop_package_windows desktop_package_windows_jbr desktop_package_windows_all desktop_uberjar launcher lint_go lint_android proto proto_install test_go test_zig plugin generate_option lint_go_linux lint_go_android lint_go_windows lint_go_install fmt_go fmt_go_install
build: libcore_android assets apk
libcore_android:
./run lib core --android
# The husi-core binary of each target into libcore/build/<os>_<arch>/.
# DESKTOP_TARGETS defaults to the host.
core_desktop:
./run lib core --desktop --desktoptargets $(if $(DESKTOP_TARGETS),$(DESKTOP_TARGETS),host) $(DARWIN_SDK_SCRIPT_ARG)
core_desktop_common:
$(MAKE) core_desktop DESKTOP_TARGETS=$(DESKTOP_TARGETS_COMMON)
desktop:
BUILD_PLUGIN=none ./gradlew -p composeApp run $(DESKTOP_APP_ARGS)
desktop_release:
BUILD_PLUGIN=none ./gradlew -p composeApp runRelease $(DESKTOP_APP_ARGS)
desktop_package:
ifeq ($(HOST_OS),Linux)
$(MAKE) desktop_package_linux $(if $(DESKTOP_TARGET),DESKTOP_TARGET=$(DESKTOP_TARGET),) LINUX_PACKAGE_FORMATS=$(LINUX_PACKAGE_FORMATS)
else ifeq ($(HOST_OS),Darwin)
$(MAKE) desktop_package_macos $(if $(DESKTOP_TARGET),DESKTOP_TARGET=$(DESKTOP_TARGET),)
else ifneq (,$(filter MINGW% MSYS% CYGWIN%,$(HOST_OS)))
$(MAKE) desktop_package_windows $(if $(DESKTOP_TARGET),DESKTOP_TARGET=$(DESKTOP_TARGET),)
else
@echo "desktop_package only supports Linux, macOS or Windows/MSYS hosts."
@exit 1
endif
desktop_package_linux:
BUILD_PLUGIN=none ./gradlew -p composeApp packageReleaseUberJarForCurrentOS $(DESKTOP_TARGET_GRADLE_ARG)
$(MAKE) launcher
$(MAKE) core_desktop DESKTOP_TARGETS=$(if $(DESKTOP_TARGET),$(DESKTOP_TARGET),host)
./release/linux/package.sh --formats $(LINUX_PACKAGE_FORMATS) $(DESKTOP_TARGET_SCRIPT_ARG)
desktop_package_linux_all:
@for desktop_target in $(DESKTOP_TARGETS_LINUX); do \
$(MAKE) desktop_package_linux DESKTOP_TARGET=$$desktop_target LINUX_PACKAGE_FORMATS=$(LINUX_PACKAGE_FORMATS) || exit $$?; \
done
desktop_package_macos:
@if [ "$(HOST_OS)" != "Darwin" ] && [ -z "$(DESKTOP_TARGET)" ]; then \
echo "desktop_package_macos on non-macOS hosts requires DESKTOP_TARGET, e.g. make desktop_package_macos DESKTOP_TARGET=darwin/arm64"; \
exit 1; \
fi
BUILD_PLUGIN=none ./gradlew -p composeApp packageReleaseUberJarForCurrentOS $(DESKTOP_TARGET_GRADLE_ARG)
$(MAKE) launcher
$(MAKE) core_desktop DESKTOP_TARGETS=$(if $(DESKTOP_TARGET),$(DESKTOP_TARGET),host)
./release/macos/package.sh $(DESKTOP_TARGET_SCRIPT_ARG)
desktop_package_windows:
@if [ -z "$(DESKTOP_TARGET)" ]; then \
echo "desktop_package_windows requires DESKTOP_TARGET, e.g. make desktop_package_windows DESKTOP_TARGET=windows/amd64"; \
exit 1; \
fi
BUILD_PLUGIN=none ./gradlew -p composeApp packageReleaseUberJarForCurrentOS $(DESKTOP_TARGET_GRADLE_ARG)
$(MAKE) launcher
$(MAKE) core_desktop DESKTOP_TARGETS=$(DESKTOP_TARGET)
./release/windows/package.sh $(DESKTOP_TARGET_SCRIPT_ARG) $(WINDOWS_NO_SIGN_SCRIPT_ARG)
# Same inputs as desktop_package_windows. Also links a JetBrains Runtime into a
# second pair of packages (names carry -jbr) so they need no system Java. Thin
# zip/NSIS are still emitted from the same signed payloads. JBR_JMODS points at
# the modules; without it they are fetched into build/jbr/ first. The fetch
# script prints the resolved path last, after the banner ./run puts in front of
# it.
desktop_package_windows_jbr:
@if [ -z "$(DESKTOP_TARGET)" ]; then \
echo "desktop_package_windows_jbr requires DESKTOP_TARGET, e.g. make desktop_package_windows_jbr DESKTOP_TARGET=windows/amd64"; \
exit 1; \
fi
BUILD_PLUGIN=none ./gradlew -p composeApp packageReleaseUberJarForCurrentOS $(DESKTOP_TARGET_GRADLE_ARG)
$(MAKE) launcher
$(MAKE) core_desktop DESKTOP_TARGETS=$(DESKTOP_TARGET)
jbr_jmods="$(JBR_JMODS)"; \
if [ -z "$$jbr_jmods" ]; then \
jbr_jmods="$$(./run lib jbr $(DESKTOP_TARGET) | tail -n 1)" || exit $$?; \
fi; \
./release/windows/package.sh $(DESKTOP_TARGET_SCRIPT_ARG) $(WINDOWS_NO_SIGN_SCRIPT_ARG) --jbr-jmods "$$jbr_jmods"
desktop_package_windows_all:
@for desktop_target in $(DESKTOP_TARGETS_WINDOWS); do \
$(MAKE) desktop_package_windows_jbr DESKTOP_TARGET=$$desktop_target WINDOWS_NO_SIGN=$(WINDOWS_NO_SIGN) || exit $$?; \
done
# ProGuard-shrunk release jar. Place husi-core next to the jar, or on PATH, before running.
desktop_uberjar:
BUILD_PLUGIN=none ./gradlew packageReleaseUberJarForCurrentOS $(DESKTOP_TARGET_GRADLE_ARG)
aboutlibraries: aboutlibraries_go aboutlibraries_android aboutlibraries_desktop
aboutlibraries_go:
cd libcore && go run ./cmd/internal/licencecollect -d ../composeApp/src/commonMain/aboutlibraries/libraries -clean
aboutlibraries_android:
./gradlew :composeApp:exportLibraryDefinitions
aboutlibraries_desktop:
./gradlew :composeApp:exportLibraryDefinitionsDesktop $(DESKTOP_TARGET_GRADLE_ARG)
launcher:
cd launcher && zig build -Doptimize=ReleaseSmall $(LAUNCHER_ZIG_TARGET_ARG)
apk:
BUILD_PLUGIN=none ./gradlew androidApp:assembleFossRelease
apk_debug:
BUILD_PLUGIN=none ./gradlew androidApp:assembleFossDebug
assets:
./run lib assets
icon:
./run icon
proto:
./run proto
proto_install:
@echo "protoc: install via your package manager (e.g. pacman -S protobuf)."
@echo "Go plugins are built from libcore/go.mod pins automatically."
lint_go: lint_go_linux lint_go_android lint_go_windows lint_go_darwin
# husi-core ships without cgo on Linux and Windows, so lint that configuration.
lint_go_linux:
cd libcore/ && GOOS=linux CGO_ENABLED=0 golangci-lint run ./...
lint_go_android:
cd libcore/ && GOOS=android GOARCH=arm64 golangci-lint run ./...
lint_go_windows:
cd libcore/ && GOOS=windows GOARCH=amd64 CGO_ENABLED=0 golangci-lint run ./...
lint_go_darwin:
cd libcore/ && GOOS=darwin GOARCH=arm64 golangci-lint run ./...
lint_go_install:
go install -v github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest
fmt_go:
cd libcore/ && golangci-lint fmt ./...
fmt_go_install: lint_go_install
test: test_gradle test_go test_zig
test_gradle:
./gradlew :composeApp:allTests
# Android lint, NewApi only: commonMain compiles against the desktop JDK, so a JDK API
# missing below minSdk passes compilation and crashes old Android at runtime.
lint_android:
BUILD_PLUGIN=none ./gradlew :composeApp:lintAndroidMain
test_go:
cd libcore/ && go test -v -count=1 -tags with_quic,badlinkname -ldflags=-checklinkname=0 ./...
test_zig:
cd launcher && zig build test
plugin:
BUILD_PLUGIN=$(PLUGIN) ./gradlew :plugin:$(PLUGIN):assembleFossRelease
generate_option:
cd ./libcore/cmd/internal/boxoption && go run . | $(CLIP)
patch_go1230:
curl $(GO_PATCH_1230) | sudo patch --verbose -p 1 -d $(GOROOT)
patch_go1234:
curl $(GO_PATCH_1234) | sudo patch --verbose -p 1 -d $(GOROOT)