fork
Configure Feed
Select the types of activity you want to include in your feed.
Live video on the AT Protocol
fork
Configure Feed
Select the types of activity you want to include in your feed.
1OUT_DIR?="bin"
2$(shell mkdir -p $(OUT_DIR))
3
4.PHONY: default
5default: streamplace
6
7VERSION?=$(shell go run ./pkg/config/git/git.go -v)
8VERSION_NO_V=$(subst v,,$(VERSION))
9VERSION_ELECTRON=$(subst -,-z,$(subst v,,$(VERSION)))
10UUID?=$(shell go run ./pkg/config/uuid/uuid.go)
11BRANCH?=$(shell go run ./pkg/config/git/git.go --branch)
12
13BUILDOS ?= $(shell uname -s | tr '[:upper:]' '[:lower:]')
14BUILDARCH ?= $(shell uname -m | tr '[:upper:]' '[:lower:]')
15ifeq ($(BUILDARCH),aarch64)
16 BUILDARCH=arm64
17endif
18ifeq ($(BUILDARCH),x86_64)
19 BUILDARCH=amd64
20endif
21MACOS_VERSION_FLAG=
22ifeq ($(BUILDOS),darwin)
23 MACOS_VERSION_FLAG=-mmacosx-version-min=$(shell sw_vers -productVersion)
24endif
25BUILDDIR?=build-$(BUILDOS)-$(BUILDARCH)
26PKG_CONFIG_PATH=$(shell pwd)/$(BUILDDIR)/lib/pkgconfig:$(shell pwd)/$(BUILDDIR)/lib/gstreamer-1.0/pkgconfig:$(shell pwd)/$(BUILDDIR)/meson-uninstalled
27
28.PHONY: version
29version:
30 @go run ./pkg/config/git/git.go -v \
31 && go run ./pkg/config/git/git.go --env -o .ci/build.env
32
33# _____ _____
34# /\ | __ \| __ \
35# / \ | |__) | |__) |
36# / /\ \ | ___/| ___/
37# / ____ \| | | |
38# /_/ \_\_| |_|
39
40# front-end stuff innit
41
42.PHONY: install
43install:
44 pnpm install
45
46.PHONY: app
47app: install
48 pnpm run build
49
50.PHONY: app-cached
51app-cached:
52 if [ ! -f js/app/dist/index.html ]; then $(MAKE) app; else echo "js/app/dist/index.html exists, not rebuilding, run make app to rebuild"; fi
53
54.PHONY: ci-ios
55ci-ios: version install app
56 $(MAKE) ios
57 $(MAKE) ci-upload-ios
58
59.PHONY: ci-android
60ci-android: version install android ci-upload-android
61
62.PHONY: ci-android-debug
63ci-android-debug: version install
64 pnpm run app prebuild
65 $(MAKE) android-debug
66 $(MAKE) ci-upload-android-debug
67
68.PHONY: ci-android-release
69ci-android-release: version install
70 pnpm run app prebuild
71 $(MAKE) android-release
72 $(MAKE) ci-upload-android-release
73
74
75ANDROID_KEYSTORE_PASSWORD?=streamplace
76ANDROID_KEYSTORE_ALIAS?=alias_name
77ANDROID_KEYSTORE_BASE64?=
78
79.PHONY: android-keystore
80android-keystore:
81 if [ -n "$$ANDROID_KEYSTORE_BASE64" ]; then \
82 echo "$$ANDROID_KEYSTORE_BASE64" | base64 -d > my-release-key.keystore; \
83 fi; \
84 if [ ! -f my-release-key.keystore ]; then \
85 keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000 -storepass $(ANDROID_KEYSTORE_PASSWORD) -keypass $(ANDROID_KEYSTORE_PASSWORD) -dname "CN=Streamplace, OU=Streamplace, O=Streamplace, L=Streamplace, S=Streamplace, C=US"; \
86 fi
87
88.PHONY: android
89android: app .build/bundletool.jar
90 $(MAKE) android-release
91 $(MAKE) android-debug
92
93.PHONY: android-release
94android-release: .build/bundletool.jar android-keystore
95 export NODE_ENV=production \
96 && cd ./js/app/android \
97 && ./gradlew :app:bundleRelease \
98 && cd - \
99 && mv ./js/app/android/app/build/outputs/bundle/release/app-release.aab ./bin/streamplace-$(VERSION)-android-release.aab \
100 && cd bin \
101 && java -jar ../.build/bundletool.jar build-apks --ks ../my-release-key.keystore --ks-key-alias alias_name --ks-pass pass:$(ANDROID_KEYSTORE_PASSWORD) --bundle=streamplace-$(VERSION)-android-release.aab --output=streamplace-$(VERSION)-android-release.apks --mode=universal \
102 && unzip streamplace-$(VERSION)-android-release.apks && mv universal.apk streamplace-$(VERSION)-android-release.apk && rm toc.pb
103
104.PHONY: android-debug
105android-debug: .build/bundletool.jar android-keystore
106 export NODE_ENV=production \
107 && cd ./js/app/android \
108 && ./gradlew :app:bundleDebug \
109 && cd - \
110 && mv ./js/app/android/app/build/outputs/bundle/debug/app-debug.aab ./bin/streamplace-$(VERSION)-android-debug.aab \
111 && cd bin \
112 && java -jar ../.build/bundletool.jar build-apks --ks ../my-release-key.keystore --ks-key-alias alias_name --ks-pass pass:$(ANDROID_KEYSTORE_PASSWORD) --bundle=streamplace-$(VERSION)-android-debug.aab --output=streamplace-$(VERSION)-android-debug.apks --mode=universal \
113 && unzip streamplace-$(VERSION)-android-debug.apks && mv universal.apk streamplace-$(VERSION)-android-debug.apk && rm toc.pb
114
115.PHONY: ios
116ios: app
117 xcodebuild \
118 -workspace ./js/app/ios/Streamplace.xcworkspace \
119 -sdk iphoneos \
120 -configuration Release \
121 -scheme Streamplace \
122 -archivePath ./bin/streamplace-$(VERSION)-ios-release.xcarchive \
123 CODE_SIGN_IDENTITY=- \
124 AD_HOC_CODE_SIGNING_ALLOWED=YES \
125 CODE_SIGN_STYLE=Automatic \
126 DEVELOPMENT_TEAM=ZZZZZZZZZZ \
127 clean archive | xcpretty \
128 && cd bin \
129 && tar -czvf streamplace-$(VERSION)-ios-release.xcarchive.tar.gz streamplace-$(VERSION)-ios-release.xcarchive
130
131# _____ ____
132# / ____|/ __ \
133# | | __| | | |
134# | | |_ | | | |
135# | |__| | |__| |
136# \_____|\____/
137
138.PHONY: rtcrec
139rtcrec:
140 go build -o $(BUILDDIR)/rtcrec ./pkg/rtcrec/cmd/...
141
142# Go takes care of this automatically but we can speed up the build by downloading go deps while the build is running
143.PHONY: godeps
144godeps:
145 go get ./pkg/...
146
147# __ __ ______ _____ ____ _ _
148# | \/ | ____|/ ____|/ __ \| \ | |
149# | \ / | |__ | (___ | | | | \| |
150# | |\/| | __| \___ \| | | | . ` |
151# | | | | |____ ____) | |__| | |\ |
152# |_| |_|______|_____/ \____/|_| \_|
153
154BASE_OPTS = \
155 --buildtype=debugoptimized \
156 -D "gst-plugins-base:audioresample=enabled" \
157 -D "gst-plugins-base:playback=enabled" \
158 -D "gst-plugins-base:opus=enabled" \
159 -D "gst-plugins-base:gio-typefinder=enabled" \
160 -D "gst-plugins-base:videotestsrc=enabled" \
161 -D "gst-plugins-base:videoconvertscale=enabled" \
162 -D "gst-plugins-base:typefind=enabled" \
163 -D "gst-plugins-base:compositor=enabled" \
164 -D "gst-plugins-base:videorate=enabled" \
165 -D "gst-plugins-base:app=enabled" \
166 -D "gst-plugins-base:audiorate=enabled" \
167 -D "gst-plugins-base:audiotestsrc=enabled" \
168 -D "gst-plugins-base:audioconvert=enabled" \
169 -D "gst-plugins-good:matroska=enabled" \
170 -D "gst-plugins-good:multifile=enabled" \
171 -D "gst-plugins-good:rtp=enabled" \
172 -D "gst-plugins-bad:fdkaac=enabled" \
173 -D "gst-plugins-bad:rtmp2=enabled" \
174 -D "gst-plugins-good:audioparsers=enabled" \
175 -D "gst-plugins-good:isomp4=enabled" \
176 -D "gst-plugins-good:png=enabled" \
177 -D "gst-plugins-good:videobox=enabled" \
178 -D "gst-plugins-good:jpeg=enabled" \
179 -D "gst-plugins-good:audioparsers=enabled" \
180 -D "gst-plugins-bad:videoparsers=enabled" \
181 -D "gst-plugins-bad:mpegtsmux=enabled" \
182 -D "gst-plugins-bad:mpegtsdemux=enabled" \
183 -D "gst-plugins-bad:codectimestamper=enabled" \
184 -D "gst-plugins-bad:opus=enabled" \
185 -D "gst-plugins-bad:rtmp2=enabled" \
186 -D "gst-plugins-good:flv=enabled" \
187 -D "gst-plugins-ugly:x264=enabled" \
188 -D "gst-plugins-ugly:gpl=enabled" \
189 -D "x264:asm=enabled" \
190 -D "gstreamer-full:gst-full=enabled" \
191 -D "gstreamer-full:gst-full-plugins=libgstflv.a;libgstrtmp2.a;libgstopusparse.a;libgstcodectimestamper.a;libgstrtp.a;libgstaudioresample.a;libgstlibav.a;libgstmatroska.a;libgstmultifile.a;libgstjpeg.a;libgstaudiotestsrc.a;libgstaudioconvert.a;libgstaudioparsers.a;libgstfdkaac.a;libgstisomp4.a;libgstapp.a;libgstvideoconvertscale.a;libgstvideobox.a;libgstvideorate.a;libgstpng.a;libgstcompositor.a;libgstaudiorate.a;libgstx264.a;libgstopus.a;libgstvideotestsrc.a;libgstvideoparsersbad.a;libgstaudioparsers.a;libgstmpegtsmux.a;libgstmpegtsdemux.a;libgstplayback.a;libgsttypefindfunctions.a;libgstcoretracers.a;libgstcodec2json.a" \
192 -D "gstreamer-full:gst-full-libraries=gstreamer-controller-1.0,gstreamer-plugins-base-1.0,gstreamer-pbutils-1.0" \
193 -D "gstreamer-full:gst-full-elements=coreelements:concat,filesrc,filesink,queue,queue2,multiqueue,typefind,tee,capsfilter,fakesink,identity" \
194 -D "gstreamer-full:bad=enabled" \
195 -D "gstreamer-full:tls=disabled" \
196 -D "gstreamer-full:libav=enabled" \
197 -D "gstreamer-full:ugly=enabled" \
198 -D "gstreamer-full:gpl=enabled" \
199 -D "gstreamer-full:gst-full-typefind-functions=" \
200 -D "gstreamer:coretracers=enabled" \
201 -D "gstreamer-full:glib_assert=false" \
202 -D "gstreamer:glib_assert=false" \
203 -D "gst-plugins-good:glib_assert=false" \
204 -D "gst-plugins-bad:glib_assert=false" \
205 -D "gst-plugins-base:glib_assert=false" \
206 -D "gst-plugins-ugly:glib_assert=false" \
207 -D "glib:glib_assert=false" \
208 -D "glib:glib_assert=false" \
209 -D "gst-libav:glib_assert=false" \
210 -D "gst-plugins-good:adaptivedemux2=disabled" \
211 -D "gst-plugins-bad:codec2json=enabled"
212
213STATIC_OPTS = \
214 $(BASE_OPTS) \
215 -D "gstreamer-full:gst-full-target-type=static_library" \
216 -D "gstreamer:registry=false"
217
218SHARED_OPTS = \
219 $(BASE_OPTS) \
220 -D "FFmpeg:default_library=shared" \
221 -D "gstreamer:registry=true"
222
223.PHONY: meson
224meson:
225 $(MAKE) meson-setup
226 $(MAKE) meson-compile
227
228MESON_SETUP_OPTS?=
229.PHONY: meson-setup
230meson-setup:
231 @meson setup $(BUILDDIR) $(MESON_SETUP_OPTS)
232 @meson configure $(BUILDDIR) $(OPTS)
233
234.PHONY: meson-setup-static
235meson-setup-static:
236 @meson setup $(BUILDDIR) $(MESON_SETUP_OPTS) $(STATIC_OPTS)
237 @meson configure $(BUILDDIR) $(STATIC_OPTS)
238
239.PHONY: meson-compile
240meson-compile:
241 meson install -C $(BUILDDIR)
242
243
244# _____ _______ _______ _____ _____
245# / ____|__ __|/\|__ __|_ _/ ____|
246# | (___ | | / \ | | | || |
247# \___ \ | | / /\ \ | | | || |
248# ____) | | |/ ____ \| | _| || |____
249# |_____/ |_/_/ \_\_| |_____\_____|
250
251# Production distributions of Streamplace with bundled node and app.
252
253static:
254 $(MAKE) meson-setup meson-compile app OPTS=$(STATIC_OPTS) -j16
255 $(MAKE) streamplace
256
257.PHONY: static-test
258static-test:
259 go install github.com/jstemmer/go-junit-report/v2@latest \
260 && PKG_CONFIG_PATH=$(shell realpath $(BUILDDIR)/meson-uninstalled) \
261 bash -euo pipefail -c "go test -p 1 -timeout 300s ./pkg/... -v | tee /dev/stderr | go-junit-report -out test.xml"
262
263# _____ ________ __
264# | __ \| ____\ \ / /
265# | | | | |__ \ \ / /
266# | | | | __| \ \/ /
267# | |__| | |____ \ /
268# |_____/|______| \/
269
270# Local builds of Streamplace with node and app.
271
272.PHONY: dev-setup
273dev-setup:
274 $(MAKE) -j16 app-cached dev-setup-meson
275
276.PHONY: dev
277dev: app-cached
278 if [ ! -d $(BUILDDIR) ]; then $(MAKE) dev-setup; fi
279 cp ./util/streamplace-dev.sh $(BUILDDIR)/streamplace
280 $(MAKE) dev-rust
281 PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
282 CGO_LDFLAGS="$(MACOS_VERSION_FLAG)" \
283 LD_LIBRARY_PATH=$(BUILDDIR)/lib go build -tags mainnet -o $(BUILDDIR)/libstreamplace ./cmd/libstreamplace/...
284
285.PHONY: dev-setup-meson
286dev-setup-meson:
287 $(MAKE) dev-setup-meson-configure
288 $(MAKE) meson-compile
289
290.PHONY: dev-setup-meson-configure
291dev-setup-meson-configure:
292 meson setup --default-library=shared $(BUILDDIR) $(SHARED_OPTS)
293 meson configure --default-library=shared $(BUILDDIR) $(SHARED_OPTS)
294
295.PHONY: dev-rust
296dev-rust: .build/bin/uniffi-bindgen-go-forked
297 cargo build
298 EXT=so; \
299 if [ "$(BUILDOS)" = "darwin" ]; then EXT=dylib; fi; \
300 .build/bin/uniffi-bindgen-go-forked --out-dir pkg/iroh/generated --library ./target/debug/libiroh_streamplace.$$EXT \
301 && mkdir -p $(BUILDDIR)/rust/iroh-streamplace/ \
302 && mkdir -p $(BUILDDIR)/lib/ \
303 && cp ./target/debug/libiroh_streamplace.$$EXT $(BUILDDIR)/rust/iroh-streamplace/libiroh_streamplace.$$EXT.tmp \
304 && mv $(BUILDDIR)/rust/iroh-streamplace/libiroh_streamplace.$$EXT.tmp $(BUILDDIR)/rust/iroh-streamplace/libiroh_streamplace.$$EXT \
305 && cp ./target/debug/libiroh_streamplace.$$EXT $(BUILDDIR)/lib/libiroh_streamplace.$$EXT.tmp \
306 && mv $(BUILDDIR)/lib/libiroh_streamplace.$$EXT.tmp $(BUILDDIR)/lib/libiroh_streamplace.$$EXT
307
308.PHONY: dev-test
309dev-test:
310 go install github.com/jstemmer/go-junit-report/v2@latest \
311 && PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
312 LD_LIBRARY_PATH=$(shell realpath $(BUILDDIR))/lib \
313 CGO_LDFLAGS="-lm" \
314 bash -euo pipefail -c "go test -p 1 -timeout 30m ./pkg/... -v | tee /dev/stderr | go-junit-report -out test.xml"
315
316.PHONY: iroh-test
317iroh-test:
318 $(MAKE) dev-rust
319 PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
320 LD_LIBRARY_PATH=$(shell realpath $(BUILDDIR))/lib \
321 go build -o $(BUILDDIR)/iroh-test ./pkg/iroh/iroh_test/...
322
323# _ _____ _ _ _______ _____ _ _ _____
324# | | |_ _| \ | |__ __|_ _| \ | |/ ____|
325# | | | | | \| | | | | | | \| | | __
326# | | | | | . ` | | | | | | . ` | | |_ |
327# | |____ _| |_| |\ | | | _| |_| |\ | |__| |
328# |______|_____|_| \_| |_| |_____|_| \_|\_____|
329
330.PHONY: check
331check: install
332 $(MAKE) golangci-lint
333 pnpm run check
334 if [ "`gofmt -l . | wc -l`" -gt 0 ]; then echo 'gofmt failed, run make fix'; exit 1; fi
335 RUSTFLAGS="-D warnings" cargo check
336
337.PHONY: fix
338fix:
339 pnpm run fix
340 gofmt -w .
341 cargo fix --allow-dirty
342
343.PHONY: golangci-lint
344golangci-lint:
345 @PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
346 go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint run -c ./.golangci.yaml
347
348# _ ________ _______ _____ ____ _ _ _____
349# | | | ____\ \ / /_ _/ ____/ __ \| \ | |/ ____|
350# | | | |__ \ V / | || | | | | | \| | (___
351# | | | __| > < | || | | | | | . ` |\___ \
352# | |____| |____ / . \ _| || |___| |__| | |\ |____) |
353# |______|______/_/ \_\_____\_____\____/|_| \_|_____/
354
355# Mostly codegen for lexicons.
356
357.PHONY: lexicons
358lexicons:
359 $(MAKE) go-lexicons \
360 && $(MAKE) js-lexicons \
361 && $(MAKE) md-lexicons \
362 && make fix
363
364.PHONY: go-lexicons
365go-lexicons:
366 rm -rf ./pkg/streamplace \
367 && mkdir -p ./pkg/streamplace \
368 && rm -rf ./pkg/streamplace/cbor_gen.go \
369 && $(MAKE) lexgen \
370 && sed -i.bak 's/\tlexutil\.RegisterType/\/\/\tlexutil.RegisterType/' $$(find ./pkg/streamplace -type f) \
371 && go run golang.org/x/tools/cmd/goimports@latest -w $$(find ./pkg/streamplace -type f) \
372 && go run ./pkg/gen/gen.go \
373 && $(MAKE) lexgen \
374 && find . | grep bak$$ | xargs rm \
375 && rm -rf api
376
377.PHONY: js-lexicons
378js-lexicons:
379 node_modules/.bin/lex gen-api ./js/streamplace/src/lexicons $$(find ./lexicons -type f -name '*.json') --yes \
380 && rm -rf ./js/streamplace/src/lexicons/types/com ./js/streamplace/src/lexicons/types/app \
381 && sed -i.bak "s/^..port.*app\/bsky.*//g" $$(find ./js/streamplace/src/lexicons -type f) \
382 && sed -i.bak "s/^..port.*com\/atproto.*//g" $$(find ./js/streamplace/src/lexicons -type f) \
383 && sed -i.bak "s/\(..port .*\)\.js\(.*\)/\1\2/g" $$(find ./js/streamplace/src/lexicons -type f) \
384 && sed -i.bak 's/AppBskyGraphBlock\.Main/AppBskyGraphBlock\.Record/' $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \
385 && sed -i.bak 's/PlaceStreamMultistreamTarget\.Main/PlaceStreamMultistreamTarget\.Record/' $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \
386 && sed -i.bak 's/PlaceStreamChatProfile\.Main/PlaceStreamChatProfile\.Record/' $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \
387 && for x in $$(find ./js/streamplace/src/lexicons -type f -name '*.ts'); do \
388 echo 'import { AppBskyRichtextFacet, AppBskyGraphBlock, ComAtprotoRepoStrongRef, AppBskyActorDefs, ComAtprotoSyncListRepos, AppBskyActorGetProfile, AppBskyFeedGetFeedSkeleton, ComAtprotoIdentityResolveHandle, ComAtprotoModerationCreateReport, ComAtprotoRepoCreateRecord, ComAtprotoRepoDeleteRecord, ComAtprotoRepoDescribeRepo, ComAtprotoRepoGetRecord, ComAtprotoRepoListRecords, ComAtprotoRepoPutRecord, ComAtprotoRepoUploadBlob, ComAtprotoServerDescribeServer, ComAtprotoSyncGetRecord, ComAtprotoSyncListReposComAtprotoRepoCreateRecord, ComAtprotoRepoDeleteRecord, ComAtprotoRepoGetRecord, ComAtprotoRepoListRecords, ComAtprotoIdentityRefreshIdentity } from "@atproto/api"' >> $$x; \
389 done \
390 && npx prettier --write $$(find ./js/streamplace/src/lexicons -type f -name '*.ts') \
391 && find . | grep bak$$ | xargs rm
392
393.PHONY: md-lexicons
394md-lexicons:
395 pnpm exec lexmd \
396 ./lexicons \
397 .build/temp \
398 subprojects/atproto/lexicons \
399 js/docs/src/content/docs/lex-reference/openapi.json \
400 && ls -R .build/temp \
401 && cp -rf .build/temp/place/stream/* js/docs/src/content/docs/lex-reference/ \
402 && rm -rf .build/temp \
403 && $(MAKE) fix
404
405.PHONY: lexgen
406lexgen:
407 $(MAKE) lexgen-types
408 $(MAKE) lexgen-server
409
410.PHONY: lexgen-types
411lexgen-types:
412 go run github.com/bluesky-social/indigo/cmd/lexgen \
413 -outdir ./pkg/spxrpc \
414 --build-file util/lexgen-types.json \
415 --external-lexicons subprojects/atproto/lexicons \
416 lexicons/place/stream \
417 ./subprojects/atproto/lexicons
418
419.PHONY: lexgen-server
420lexgen-server:
421 mkdir -p ./pkg/spxrpc \
422 && go run github.com/bluesky-social/indigo/cmd/lexgen \
423 --gen-server \
424 --types-import place.stream:stream.place/streamplace/pkg/streamplace \
425 --types-import app.bsky:github.com/bluesky-social/indigo/api/bsky \
426 --types-import com.atproto:github.com/bluesky-social/indigo/api/atproto \
427 --types-import chat.bsky:github.com/bluesky-social/indigo/api/chat \
428 --types-import tools.ozone:github.com/bluesky-social/indigo/api/ozone \
429 -outdir ./pkg/spxrpc \
430 --build-file util/lexgen-types.json \
431 --external-lexicons subprojects/atproto/lexicons \
432 --package spxrpc \
433 lexicons/place/stream \
434 lexicons/app/bsky \
435 lexicons/com/atproto
436
437.PHONY: ci-lexicons
438ci-lexicons:
439 $(MAKE) lexicons \
440 && if ! git diff --exit-code >/dev/null; then echo "lexicons are out of date, run 'make lexicons' to fix"; exit 1; fi
441
442# _______ ______ _____ _______ _____ _ _ _____
443# |__ __| ____|/ ____|__ __|_ _| \ | |/ ____|
444# | | | |__ | (___ | | | | | \| | | __
445# | | | __| \___ \ | | | | | . ` | | |_ |
446# | | | |____ ____) | | | _| |_| |\ | |__| |
447# |_| |______|_____/ |_| |_____|_| \_|\_____|
448
449# test to make sure we haven't added any more dynamic dependencies
450LINUX_LINK_COUNT=5
451.PHONY: link-test-linux
452link-test-linux:
453 count=$(shell ldd ./build-linux-amd64/streamplace | wc -l) \
454 && echo $$count \
455 && if [ "$$count" != "$(LINUX_LINK_COUNT)" ]; then echo "ldd reports new libaries linked! want $(LINUX_LINK_COUNT) got $$count" \
456 && ldd ./build-linux-amd64/streamplace \
457 && exit 1; \
458 fi
459
460MACOS_LINK_COUNT=10
461.PHONY: link-test-macos
462link-test-macos:
463 count=$(shell otool -L ./build-darwin-arm64/streamplace | wc -l | xargs) \
464 && echo $$count \
465 && if [ "$$count" != "$(MACOS_LINK_COUNT)" ]; then echo "otool -L reports new libaries linked! want $(MACOS_LINK_COUNT) got $$count" \
466 && otool -L ./build-darwin-arm64/streamplace \
467 && exit 1; \
468 fi
469
470WINDOWS_LINK_COUNT=19
471.PHONY: link-test-windows
472link-test-windows:
473 count=$(shell x86_64-w64-mingw32-objdump -p ./build-windows-amd64/streamplace.exe | grep "DLL Name" | tr '[:upper:]' '[:lower:]' | sort | uniq | wc -l | xargs) \
474 && echo $$count \
475 && if [ "$$count" != "$(WINDOWS_LINK_COUNT)" ]; then echo "x86_64-w64-mingw32-objdump -p reports new libaries linked! want $(WINDOWS_LINK_COUNT) got $$count" \
476 && x86_64-w64-mingw32-objdump -p ./build-windows-amd64/streamplace.exe | grep "DLL Name" \
477 && exit 1; \
478 fi
479
480.PHONY: ci
481ci: version install app node-all-platforms ci-upload-node
482
483
484.PHONY: ci-desktop-darwin
485ci-desktop-darwin: version install
486 ./util/mac-codesign.sh \
487 && for arch in amd64 arm64; do \
488 curl -v --fail-with-body -O "$$CI_API_V4_URL/projects/$$CI_PROJECT_ID/packages/generic/$(BRANCH)/$(VERSION)/streamplace-$(VERSION)-darwin-$$arch.tar.gz" || exit 1 \
489 && tar -xzvf streamplace-$(VERSION)-darwin-$$arch.tar.gz \
490 && ./streamplace --version \
491 && ./streamplace self-test \
492 && mkdir -p build-darwin-$$arch \
493 && mv ./streamplace ./build-darwin-$$arch/streamplace; \
494 done \
495 && $(MAKE) desktop-darwin \
496 && for arch in amd64 arm64; do \
497 export file=streamplace-desktop-$(VERSION)-darwin-$$arch.zip \
498 && $(MAKE) ci-upload-file upload_file=$$file \
499 && export file=streamplace-desktop-$(VERSION)-darwin-$$arch.dmg \
500 && $(MAKE) ci-upload-file upload_file=$$file; \
501 done
502
503.PHONY: ci-test
504ci-test: app
505 meson setup $(BUILDDIR) $(OPTS)
506 meson test -C $(BUILDDIR) go-tests
507
508.PHONY: ci-npm-release
509ci-npm-release: install
510 echo //registry.npmjs.org/:_authToken=$$NPM_TOKEN > ~/.npmrc \
511 && npx lerna publish from-package --yes
512
513.build/bin/uniffi-bindgen-go-forked:
514 mkdir -p .build \
515 && cargo install uniffi-bindgen-go --git https://github.com/kegsay/uniffi-bindgen-go --rev f1f1064871faf05377c75e098d525d530d402d38 --root .build \
516 && mv .build/bin/uniffi-bindgen-go .build/bin/uniffi-bindgen-go-forked
517
518.build/bundletool.jar:
519 mkdir -p .build \
520 && curl -L -o ./.build/bundletool.jar https://github.com/google/bundletool/releases/download/1.17.0/bundletool-all-1.17.0.jar
521
522.PHONY: selftest-macos
523selftest-macos:
524 js/desktop/out/Streamplace-darwin-arm64/Streamplace.app/Contents/MacOS/Streamplace -- --self-test
525
526# _____ _____ ____ _____ _____
527# / ____| __ \ / __ \ / ____/ ____|
528# | | | |__) | | | | (___| (___
529# | | | _ /| | | |\___ \\___ \
530# | |____| | \ \| |__| |____) |___) |
531# \_____|_| \_\\____/|_____/_____/
532# _____ ____ __ __ _____ _____ _ _____ _ _ _____
533# / ____/ __ \| \/ | __ \_ _| | |_ _| \ | |/ ____|
534# | | | | | | \ / | |__) || | | | | | | \| | | __
535# | | | | | | |\/| | ___/ | | | | | | | . ` | | |_ |
536# | |___| |__| | | | | | _| |_| |____ _| |_| |\ | |__| |
537# \_____\____/|_| |_|_| |_____|______|_____|_| \_|\_____|
538
539# Cross-compiling is exclusively right now from linux-amd64 to:
540
541# linux-amd64 (native)
542# linux-arm64
543# windows-amd64
544# darwin-amd64
545# darwin-arm64
546
547.PHONY: node-all-platforms
548node-all-platforms: app
549 meson setup build-linux-amd64 $(OPTS) --buildtype debugoptimized
550 meson compile -C build-linux-amd64 archive
551 $(MAKE) link-test-linux
552 $(MAKE) linux-arm64
553 $(MAKE) windows-amd64
554 $(MAKE) windows-amd64-startup-test
555 $(MAKE) desktop-linux
556 $(MAKE) desktop-windows-amd64
557
558.PHONY: desktop-linux
559desktop-linux:
560 $(MAKE) desktop-linux-amd64
561 $(MAKE) desktop-linux-arm64
562
563.PHONY: desktop-linux-amd64
564desktop-linux-amd64:
565 cd js/desktop \
566 && pnpm run make --platform linux --arch x64 \
567 && cd - \
568 && mv "js/desktop/out/make/AppImage/x64/Streamplace-$(VERSION_ELECTRON)-x64.AppImage" ./bin/streamplace-desktop-$(VERSION)-linux-amd64.AppImage
569
570.PHONY: desktop-linux-arm64
571desktop-linux-arm64:
572 cd js/desktop \
573 && pnpm run make --platform linux --arch arm64 \
574 && cd - \
575 && mv "js/desktop/out/make/AppImage/arm64/Streamplace-$(VERSION_ELECTRON)-arm64.AppImage" ./bin/streamplace-desktop-$(VERSION)-linux-arm64.AppImage
576
577.PHONY: desktop-windows-amd64
578desktop-windows-amd64:
579 cd js/desktop \
580 && pnpm run make --platform win32 --arch x64 \
581 && cd - \
582 && export SUM=$$(cat ./js/desktop/out/make/squirrel.windows/x64/streamplace_desktop-$(VERSION_ELECTRON)-full.nupkg | openssl sha1 | awk '{ print $$2 }') \
583 && echo $$SUM > ./bin/streamplace-desktop-$(VERSION)-windows-amd64.nupkg.sha1 \
584 && mv "js/desktop/out/make/squirrel.windows/x64/streamplace_desktop-$(VERSION_ELECTRON)-full.nupkg" ./bin/streamplace-desktop-$(VERSION)-windows-amd64.$$SUM.nupkg \
585 && mv "js/desktop/out/make/squirrel.windows/x64/Streamplace-$(VERSION_ELECTRON) Setup.exe" ./bin/streamplace-desktop-$(VERSION)-windows-amd64.exe
586
587.PHONY: streamplace
588streamplace: app-cached meson-setup-static
589 meson compile -C $(BUILDDIR) streamplace | grep -v drectve
590
591.PHONY: archive
592archive: app-cached meson-setup-static godeps
593 meson compile -C $(BUILDDIR) archive | grep -v drectve
594
595.PHONY: linux-amd64
596linux-amd64:
597 $(MAKE) -j $(shell nproc) archive
598 $(MAKE) link-test-linux
599
600.PHONY: linux-arm64
601linux-arm64:
602 rustup target add aarch64-unknown-linux-gnu \
603 && CC=aarch64-linux-gnu-gcc \
604 LD=aarch64-linux-gnu-ld \
605 CROSS_COMPILE=1 \
606 MESON_SETUP_OPTS="--cross-file util/linux-arm64-gnu.ini" \
607 BUILDDIR=build-linux-arm64 \
608 CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
609 $(MAKE) -j $(shell nproc) archive
610
611.PHONY: windows-amd64
612windows-amd64:
613 rustup target add x86_64-pc-windows-gnu \
614 && CC=x86_64-w64-mingw32-gcc \
615 LD=x86_64-w64-mingw32-ld \
616 CROSS_COMPILE=1 \
617 MESON_SETUP_OPTS="--cross-file util/windows-amd64-gnu.ini" \
618 BUILDDIR=build-windows-amd64 \
619 $(MAKE) -j $(shell nproc) archive
620
621.PHONY: darwin-amd64
622darwin-amd64:
623 export CC=x86_64-apple-darwin24.4-clang \
624 && export CC_X86_64_APPLE_DARWIN=x86_64-apple-darwin24.4-clang \
625 && export CXX_X86_64_APPLE_DARWIN=x86_64-apple-darwin24.4-clang++ \
626 && export AR_X86_64_APPLE_DARWIN=x86_64-apple-darwin24.4-ar \
627 && export CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER=x86_64-apple-darwin24.4-clang \
628 && export LD=x86_64-apple-darwin24.4-ld \
629 && export CROSS_COMPILE=1 \
630 && export MESON_SETUP_OPTS="--cross-file util/osxcross-darwin-amd64.ini" \
631 && export BUILDDIR=build-darwin-amd64 \
632 && $(MAKE) -j $(shell nproc) streamplace \
633 && ./util/osxcross-codesign.sh ./build-darwin-amd64/streamplace \
634 && mkdir -p bin \
635 && cd build-darwin-amd64 \
636 && tar -czvf ../bin/streamplace-$(VERSION)-darwin-amd64.tar.gz ./streamplace \
637 && cd -
638
639.PHONY: darwin-arm64gofmt -w .
640darwin-arm64:
641 export CC=aarch64-apple-darwin24.4-clang \
642 && export CC_AARCH64_APPLE_DARWIN=aarch64-apple-darwin24.4-clang \
643 && export CXX_AARCH64_APPLE_DARWIN=aarch64-apple-darwin24.4-clang++ \
644 && export AR_AARCH64_APPLE_DARWIN=aarch64-apple-darwin24.4-ar \
645 && export CARGO_TARGET_AARCH64_APPLE_DARWIN_LINKER=aarch64-apple-darwin24.4-clang \
646 && export LD=aarch64-apple-darwin24.4-ld \
647 && export CROSS_COMPILE=1 \
648 && export MESON_SETUP_OPTS="--cross-file util/osxcross-darwin-arm64.ini" \
649 && export BUILDDIR=build-darwin-arm64 \
650 && $(MAKE) -j $(shell nproc) streamplace \
651 && ./util/osxcross-codesign.sh ./build-darwin-arm64/streamplace \
652 && mkdir -p bin \
653 && cd build-darwin-arm64 \
654 && tar -czvf ../bin/streamplace-$(VERSION)-darwin-arm64.tar.gz ./streamplace \
655 && cd -
656
657# unbuffer here is a workaround for wine trying to pop up a terminal window and failing
658.PHONY: windows-amd64-startup-test
659windows-amd64-startup-test:
660 bash -c 'set -euo pipefail && unbuffer wine64 ./build-windows-amd64/streamplace.exe self-test | cat'
661
662.PHONY: desktop-darwin-amd64
663desktop-darwin-amd64:
664 echo "TODO"
665
666.PHONY: desktop-darwin-arm64
667desktop-darwin-arm64:
668 echo "TODO"
669
670.PHONY: desktop-darwin
671desktop-darwin:
672 export DEBUG="electron-osx-sign*" \
673 && cd js/desktop \
674 && pnpm run make --platform darwin --arch arm64 \
675 && pnpm run make --platform darwin --arch x64 \
676 && cd - \
677 && mv js/desktop/out/make/Streamplace-$(VERSION_ELECTRON)-x64.dmg ./bin/streamplace-desktop-$(VERSION)-darwin-amd64.dmg \
678 && mv js/desktop/out/make/Streamplace-$(VERSION_ELECTRON)-arm64.dmg ./bin/streamplace-desktop-$(VERSION)-darwin-arm64.dmg \
679 && mv js/desktop/out/make/zip/darwin/x64/Streamplace-darwin-x64-$(VERSION_ELECTRON).zip ./bin/streamplace-desktop-$(VERSION)-darwin-amd64.zip \
680 && mv js/desktop/out/make/zip/darwin/arm64/Streamplace-darwin-arm64-$(VERSION_ELECTRON).zip ./bin/streamplace-desktop-$(VERSION)-darwin-arm64.zip
681
682# link your local version of mist for dev
683.PHONY: link-mist
684link-mist:
685 rm -rf subprojects/mistserver
686 ln -s $$(realpath ../mistserver) ./subprojects/mistserver
687
688# link your local version of gstreamer
689.PHONY: link-gstreamer
690link-gstreamer:
691 rm -rf subprojects/gstreamer-full
692 ln -s $$(realpath ../gstreamer) ./subprojects/gstreamer-full
693
694# link your local version of ffmpeg for dev
695.PHONY: link-ffmpeg
696link-ffmpeg:
697 rm -rf subprojects/FFmpeg
698 ln -s $$(realpath ../ffmpeg) ./subprojects/FFmpeg
699
700# _____ ____ _____ _ ________ _____
701# | __ \ / __ \ / ____| |/ / ____| __ \
702# | | | | | | | | | ' /| |__ | |__) |
703# | | | | | | | | | < | __| | _ /
704# | |__| | |__| | |____| . \| |____| | \ \
705# |_____/ \____/ \_____|_|\_\______|_| \_\
706
707# Actually, Podman. I'm not sure if these commands will actually run on Docker, untested.
708
709.PHONY: docker
710docker:
711 docker build -f docker/local.Dockerfile -t dist.stream.place/streamplace/streamplace:local .
712
713.PHONY: docker-build
714docker-build: docker-build-builder docker-build-in-container
715
716.PHONY: docker-test
717docker-test: docker-build-builder docker-test-in-container
718
719DOCKER_BUILD_OPTS?=
720BUILDER_TARGET?=builder
721.PHONY: docker-build-builder
722docker-build-builder:
723 podman build --target=$(BUILDER_TARGET) --os=linux --arch=amd64 -f docker/build.Dockerfile -t dist.stream.place/streamplace/streamplace:$(BUILDER_TARGET) $(DOCKER_BUILD_OPTS) .
724
725.PHONY: precommit
726precommit: dockerfile-hash-precommit
727
728.PHONY: dockefile-hash-precommit
729dockerfile-hash-precommit:
730 @bash -c 'printf "variables:\n DOCKERFILE_HASH: `git hash-object docker/build.Dockerfile`" > .ci/dockerfile-hash.yaml' \
731 && git add .ci/dockerfile-hash.yaml
732
733# tricks the github action for golangci-lint to run inside a container
734.PHONY: golangci-lint-container
735golangci-lint-container: docker-build-builder
736 podman run \
737 -v $$(pwd):$$(pwd) \
738 -w $$(pwd) \
739 -e PKG_CONFIG_PATH=$$(pwd)/build-linux-amd64/lib/pkgconfig \
740 -d \
741 --name golangci-lint \
742 dist.stream.place/streamplace/streamplace:$(BUILDER_TARGET) \
743 tail -f /dev/null
744 podman exec golangci-lint mkdir -p js/app/dist
745 podman exec golangci-lint touch js/app/dist/index.html
746 podman exec golangci-lint make dev
747
748# runs a command in the build container, building if necessary
749IN_CONTAINER_CMD?=echo 'usage: make in-container IN_CONTAINER_CMD=\"<command>\"'
750DOCKER_BIN?=podman
751DOCKER_REF?=dist.stream.place/streamplace/streamplace:$(BUILDER_TARGET)
752DOCKER_OPTS?=
753.PHONY: in-container
754in-container: docker-build-builder
755 $(DOCKER_BIN) run $(DOCKER_OPTS) -v $$(pwd):$$(pwd) -w $$(pwd) --rm $(DOCKER_REF) bash -c "$(IN_CONTAINER_CMD)"
756
757.PHONY: docker-shell
758docker-shell:
759 $(MAKE) in-container IN_CONTAINER_CMD="bash" DOCKER_OPTS="-it -v $$(pwd):$$(pwd) -w $$(pwd)"
760
761STREAMPLACE_URL?=https://git.stream.place/streamplace/streamplace/-/package_files/10122/download
762.PHONY: docker-release
763docker-release:
764 cd docker \
765 && docker build -f release.Dockerfile \
766 --build-arg TARGETARCH=$(BUILDARCH) \
767 --build-arg STREAMPLACE_URL=$(STREAMPLACE_URL) \
768 -t dist.stream.place/streamplace/streamplace \
769 .
770
771.PHONY: docker-mistserver
772docker-mistserver:
773 cd docker \
774 && docker build -f mistserver.Dockerfile \
775 --build-arg TARGETARCH=$(BUILDARCH) \
776 --build-arg STREAMPLACE_URL=$(STREAMPLACE_URL) \
777 -t dist.stream.place/streamplace/streamplace:mistserver \
778
779# _____ _____ _____ _______ _____ ____
780# | __ \_ _|/ ____|__ __| __ \ / __ \
781# | | | || | | (___ | | | |__) | | | |
782# | | | || | \___ \ | | | _ /| | | |
783# | |__| || |_ ____) | | | | | \ \| |__| |
784# |_____/_____|_____/ |_| |_| \_\\____/
785
786# distro: cut new versions, build apt and brew packages, upload to S3/gitlab
787
788.PHONY: release
789release: install
790 $(MAKE) lexicons
791 pnpm run release
792
793.PHONY: ci-release
794ci-release:
795 go install gitlab.com/gitlab-org/release-cli/cmd/release-cli
796 go run ./pkg/config/git/git.go -release -o release.yml
797 release-cli create-from-file --file release.yml
798
799.PHONY: homebrew
800homebrew:
801 $(MAKE) ci-download-file download_file=streamplace-$(VERSION)-linux-amd64.tar.gz
802 $(MAKE) ci-download-file download_file=streamplace-$(VERSION)-linux-arm64.tar.gz
803 $(MAKE) ci-download-file download_file=streamplace-$(VERSION)-darwin-amd64.tar.gz
804 $(MAKE) ci-download-file download_file=streamplace-$(VERSION)-darwin-arm64.tar.gz
805 git clone git@github.com:streamplace/homebrew-streamplace.git /tmp/homebrew-streamplace
806 go run ./pkg/config/git/git.go -homebrew -o /tmp/homebrew-streamplace/Formula/streamplace.rb
807
808.PHONY: ci-homebrew
809ci-homebrew:
810 git config --global user.name "Streamplace Homebrew Robot"
811 git config --global user.email support@stream.place
812 mkdir -p ~/.ssh
813 echo "Host * \n\
814 StrictHostKeyChecking no \n\
815 UserKnownHostsFile=/dev/null" > ~/.ssh/config
816 echo "$$CI_HOMEBREW_KEY_BASE64" | base64 -d > ~/.ssh/id_ed25519
817 chmod 600 ~/.ssh/id_ed25519
818
819 chmod 600 ~/.ssh/config
820 $(MAKE) homebrew
821 cd /tmp/homebrew-streamplace \
822 && git add . \
823 && git commit -m "Update streamplace $(VERSION)" \
824 && git push
825
826FPM_BASE_OPTS= \
827 -s dir \
828 -t deb \
829 -v $(VERSION_NO_V) \
830 --force \
831 --license=GPL-3.0-or-later \
832 --maintainer="Streamplace <support@stream.place>" \
833 --vendor="Streamplace" \
834 --url="https://stream.place"
835SP_ARCH_NAME?=amd64
836.PHONY: deb-pkg
837deb-pkg:
838 fpm $(FPM_BASE_OPTS) \
839 -n streamplace \
840 -a $(SP_ARCH_NAME) \
841 -p bin/streamplace-$(VERSION)-linux-$(SP_ARCH_NAME).deb \
842 --deb-systemd=util/systemd/streamplace.service \
843 --deb-systemd-restart-after-upgrade \
844 --after-install=util/systemd/after-install.sh \
845 --description="Live video for the AT Protocol. Solving video for everybody forever." \
846 build-linux-$(SP_ARCH_NAME)/streamplace=/usr/bin/streamplace
847
848.PHONY: pkg-linux-amd64
849pkg-linux-amd64:
850 $(MAKE) deb-pkg SP_ARCH_NAME=amd64
851
852.PHONY: pkg-linux-arm64
853pkg-linux-arm64:
854 $(MAKE) deb-pkg SP_ARCH_NAME=arm64
855
856.PHONY: pkg-darwin-amd64
857pkg-darwin-amd64:
858 echo todo
859
860.PHONY: pkg-darwin-arm64
861pkg-darwin-arm64:
862 echo todo
863
864.PHONY: pkg-windows-amd64
865pkg-windows-amd64:
866 echo todo
867
868.PHONY: deb-release
869deb-release:
870 aptly repo create -distribution=all -component=main streamplace-releases
871 aptly mirror create old-version $$S3_PUBLIC_URL/debian all
872 aptly mirror update old-version
873 aptly repo import old-version streamplace-releases streamplace
874 aptly repo add streamplace-releases \
875 bin/streamplace-$(VERSION)-linux-arm64.deb \
876 bin/streamplace-$(VERSION)-linux-amd64.deb
877 aptly snapshot create streamplace-$(VERSION) from repo streamplace-releases
878 aptly publish snapshot -distribution=all streamplace-$(VERSION) s3:streamplace-releases:
879
880.PHONY: ci-deb-release
881ci-deb-release:
882 $(MAKE) ci-download-file download_file=streamplace-$(VERSION)-linux-amd64.deb
883 $(MAKE) ci-download-file download_file=streamplace-$(VERSION)-linux-arm64.deb
884 echo $$CI_SIGNING_KEY_BASE64 | base64 -d | gpg --import
885 gpg --armor --export | gpg --no-default-keyring --keyring trustedkeys.gpg --import
886 echo '{"S3PublishEndpoints":{"streamplace-releases":{"region":"'$$S3_REGION'","bucket":"'$$S3_BUCKET_NAME'","endpoint":"'$$S3_ENDPOINT'","acl":"public-read","prefix":"debian"}}}' > ~/.aptly.conf
887 $(MAKE) deb-release
888
889# _____ _____
890# / ____|_ _|
891# | | | |
892# | | | |
893# | |____ _| |_
894# \_____|_____|
895
896# mostly "do a thing and then gitlab upload the artifact"
897
898.PHONY: ci-upload
899ci-upload: ci-upload-node ci-upload-android
900
901.PHONY: ci-upload-node-linux-amd64
902ci-upload-node-linux-amd64:
903 $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-linux-amd64.tar.gz \
904 && $(MAKE) ci-upload-file upload_file=streamplace-desktop-$(VERSION)-linux-amd64.AppImage \
905 && $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-linux-amd64.deb
906
907.PHONY: ci-upload-node-linux-arm64
908ci-upload-node-linux-arm64:
909 $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-linux-arm64.tar.gz \
910 && $(MAKE) ci-upload-file upload_file=streamplace-desktop-$(VERSION)-linux-arm64.AppImage \
911 && $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-linux-arm64.deb
912
913.PHONY: ci-upload-node-darwin-arm64
914ci-upload-node-darwin-arm64:
915 export file=streamplace-$(VERSION)-darwin-arm64.tar.gz \
916 && $(MAKE) ci-upload-file upload_file=$$file;
917
918.PHONY: ci-upload-node-darwin-amd64
919ci-upload-node-darwin-amd64:
920 export file=streamplace-$(VERSION)-darwin-amd64.tar.gz \
921 && $(MAKE) ci-upload-file upload_file=$$file;
922
923.PHONY: ci-upload-node-windows-amd64
924ci-upload-node-windows-amd64:
925 export file=streamplace-$(VERSION)-windows-amd64.zip \
926 && $(MAKE) ci-upload-file upload_file=$$file; \
927 export file=streamplace-desktop-$(VERSION)-windows-amd64.exe \
928 && $(MAKE) ci-upload-file upload_file=$$file; \
929 export SUM=$$(cat bin/streamplace-desktop-$(VERSION)-windows-amd64.nupkg.sha1) \
930 && export file=streamplace-desktop-$(VERSION)-windows-amd64.$$SUM.nupkg \
931 && $(MAKE) ci-upload-file upload_file=$$file;
932
933.PHONY: ci-upload-node-macos
934ci-upload-node-macos: node-all-platforms-macos
935 for GOOS in darwin; do \
936 for GOARCH in amd64 arm64; do \
937 export file=streamplace-$(VERSION)-$$GOOS-$$GOARCH.tar.gz \
938 && $(MAKE) ci-upload-file upload_file=$$file; \
939 export file=streamplace-desktop-$(VERSION)-$$GOOS-$$GOARCH.dmg \
940 && $(MAKE) ci-upload-file upload_file=$$file; \
941 export file=streamplace-desktop-$(VERSION)-$$GOOS-$$GOARCH.zip \
942 && $(MAKE) ci-upload-file upload_file=$$file; \
943 done \
944 done;
945
946.PHONY: ci-upload-android
947ci-upload-android: android
948 $(MAKE) ci-upload-android-debug \
949 && $(MAKE) ci-upload-android-release
950
951.PHONY: ci-upload-android-debug
952ci-upload-android-debug:
953 $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-android-debug.apk \
954 && $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-android-debug.aab
955
956.PHONY: ci-upload-android-release
957ci-upload-android-release:
958 $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-android-release.apk \
959 && $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-android-release.aab
960
961.PHONY: ci-upload-ios
962ci-upload-ios: ios
963 $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-ios-release.xcarchive.tar.gz
964
965upload_file?=""
966.PHONY: ci-upload-file
967ci-upload-file:
968 curl \
969 --fail-with-body \
970 --header "JOB-TOKEN: $$CI_JOB_TOKEN" \
971 --upload-file bin/$(upload_file) \
972 "$$CI_API_V4_URL/projects/$$CI_PROJECT_ID/packages/generic/$(BRANCH)/$(VERSION)/$(upload_file)";
973
974download_file?=""
975.PHONY: ci-download-file
976ci-download-file:
977 curl \
978 --fail-with-body \
979 --header "JOB-TOKEN: $$CI_JOB_TOKEN" \
980 -o bin/$(download_file) \
981 "$$CI_API_V4_URL/projects/$$CI_PROJECT_ID/packages/generic/$(BRANCH)/$(VERSION)/$(download_file)";
982
983.PHONY: c2pa-types
984c2pa-types:
985 $(MAKE) dev-rust
986 ./target/debug/export_c2pa_schema
987 npx quicktype --lang go --src-lang schema --package c2patypes --out pkg/c2patypes/c2patypes.go ./target/schema/C2PA.schema.json
988 gofmt -w pkg/c2patypes/c2patypes.go