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: app node
6
7VERSION?=$(shell go run ./pkg/config/git/git.go -v)
8VERSION_ELECTRON=$(subst -,-z,$(subst v,,$(VERSION)))
9UUID?=$(shell go run ./pkg/config/uuid/uuid.go)
10BRANCH?=$(shell go run ./pkg/config/git/git.go --branch)
11
12BUILDOS ?= $(shell uname -s | tr '[:upper:]' '[:lower:]')
13BUILDARCH ?= $(shell uname -m | tr '[:upper:]' '[:lower:]')
14ifeq ($(BUILDARCH),aarch64)
15 BUILDARCH=arm64
16endif
17ifeq ($(BUILDARCH),x86_64)
18 BUILDARCH=amd64
19endif
20BUILDDIR?=build-$(BUILDOS)-$(BUILDARCH)
21SHARED_LD_LIBRARY_PATH=$(shell pwd)/$(BUILDDIR)/lib/usr/local/lib/x86_64-linux-gnu
22SHARED_DYLD_LIBRARY_PATH=$(shell pwd)/$(BUILDDIR)/lib/usr/local/lib
23SHARED_PKG_CONFIG_PATH=$(shell pwd)/$(BUILDDIR)/meson-uninstalled
24
25.PHONY: version
26version:
27 @go run ./pkg/config/git/git.go -v \
28 && go run ./pkg/config/git/git.go --env -o .ci/build.env
29
30.PHONY: install
31install:
32 pnpm install
33
34.PHONY: app-and-node
35app-and-node:
36 $(MAKE) app
37 $(MAKE) node
38
39.PHONY: app-and-node-and-test
40app-and-node-and-test:
41 $(MAKE) app
42 $(MAKE) node
43 $(MAKE) test
44.PHONY: app
45app: schema install
46 pnpm run build
47
48.PHONY: node
49node: schema
50 $(MAKE) meson-setup
51 meson compile -C $(BUILDDIR) streamplace
52
53js/app/dist/index.html: install
54 pnpm run build
55
56.PHONY: dev-setup
57dev-setup: schema install js/app/dist/index.html
58 $(MAKE) dev-setup-meson
59 $(MAKE) dev
60
61.PHONY: dev-setup-meson
62dev-setup-meson:
63 $(MAKE) dev-setup-meson-configure
64 $(MAKE) dev-setup-meson-compile
65
66.PHONY: dev-setup-meson-configure
67dev-setup-meson-configure:
68 meson setup --default-library=shared $(BUILDDIR) $(SHARED_OPTS)
69 meson configure --default-library=shared $(BUILDDIR) $(SHARED_OPTS)
70
71.PHONY: dev-setup-meson-compile
72dev-setup-meson-compile:
73 meson compile -C $(BUILDDIR) streamplace
74 meson install --destdir lib -C $(BUILDDIR)
75
76.PHONY: dev
77dev:
78 cp ./util/streamplace-dev.sh $(BUILDDIR)/streamplace
79 PKG_CONFIG_PATH=$(SHARED_PKG_CONFIG_PATH) \
80 LD_LIBRARY_PATH=$(SHARED_LD_LIBRARY_PATH) \
81 DYLD_LIBRARY_PATH=$(SHARED_DYLD_LIBRARY_PATH) \
82 go build -o $(BUILDDIR)/libstreamplace ./cmd/libstreamplace/...
83
84.PHONY: golangci-lint
85golangci-lint:
86 @PKG_CONFIG_PATH=$(SHARED_PKG_CONFIG_PATH) \
87 go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint run -c ./.golangci.yaml
88
89.PHONY: dev-test
90dev-test:
91 PKG_CONFIG_PATH=$(SHARED_PKG_CONFIG_PATH) \
92 LD_LIBRARY_PATH=$(SHARED_LD_LIBRARY_PATH) \
93 DYLD_LIBRARY_PATH=$(SHARED_DYLD_LIBRARY_PATH) \
94 go test -p 1 -timeout 300s ./...
95
96.PHONY: schema
97schema:
98 mkdir -p js/app/generated \
99 && go run pkg/crypto/signers/eip712/export-schema/export-schema.go > js/app/generated/eip712-schema.json
100
101.PHONY: lexicons
102lexicons:
103 $(MAKE) go-lexicons \
104 && $(MAKE) js-lexicons \
105 && $(MAKE) md-lexicons \
106 && make fix
107
108.PHONY: go-lexicons
109go-lexicons:
110 rm -rf ./pkg/streamplace \
111 && mkdir -p ./pkg/streamplace \
112 && rm -rf ./pkg/streamplace/cbor_gen.go \
113 && $(MAKE) lexgen \
114 && sed -i.bak 's/\tutil/\/\/\tutil/' $$(find ./pkg/streamplace -type f) \
115 && go run golang.org/x/tools/cmd/goimports@latest -w $$(find ./pkg/streamplace -type f) \
116 && go run ./pkg/gen/gen.go \
117 && $(MAKE) lexgen \
118 && find . | grep bak$$ | xargs rm \
119 && rm -rf api
120
121.PHONY: js-lexicons
122js-lexicons:
123 node_modules/.bin/lex gen-api ./js/streamplace/src/lexicons $$(find ./lexicons -type f -name '*.json') --yes \
124 && echo 'import { ComAtprotoRepoCreateRecord, ComAtprotoRepoDeleteRecord, ComAtprotoRepoGetRecord, ComAtprotoRepoListRecords } from "@atproto/api"' >> ./js/streamplace/src/lexicons/index.ts \
125 && sed -i.bak "s/'\.\.\/\.\.\/app/'@atproto\/api\/src\/client\/types\/app/" $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \
126 && sed -i.bak "s/'\.\.\/\.\.\/\.\.\/app/'@atproto\/api\/src\/client\/types\/app/" $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \
127 && sed -i.bak "s/'\.\.\/\.\.\/com/'@atproto\/api\/src\/client\/types\/com/" $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \
128 && sed -i.bak "s/'\.\.\/\.\.\/\.\.\/com/'@atproto\/api\/src\/client\/types\/com/" $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \
129 && sed -i.bak 's/AppBskyGraphBlock\.Main/AppBskyGraphBlock\.Record/' $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \
130 && sed -i.bak 's/PlaceStreamChatProfile\.Main/PlaceStreamChatProfile\.Record/' $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \
131 && sed -i.bak "s/import\ \*\ as\ AppBskyFeedDefs\ from\ '.\/defs'/import \{ AppBskyFeedDefs } from '@atproto\/api'/" $$(find ./js/streamplace/src/lexicons/types -type f) \
132 && sed -i.bak "s/import\ \*\ as\ AppBskyActorDefs\ from\ '.\/defs'/import \{ AppBskyActorDefs } from '@atproto\/api'/" $$(find ./js/streamplace/src/lexicons -type f) \
133 && sed -i.bak "s/import\ \*\ as\ ComAtprotoAdminDefs\ from\ .*$$/import \{ ComAtprotoAdminDefs } from '@atproto\/api'/" $$(find ./js/streamplace/src/lexicons -type f) \
134 && sed -i.bak "s/import\ \*\ as\ ComAtprotoRepoStrongRef\ from\ .*$$/import \{ ComAtprotoRepoStrongRef } from '@atproto\/api'/" $$(find ./js/streamplace/src/lexicons -type f) \
135 && sed -i.bak "s/import\ \*\ as\ ComAtprotoModerationDefs\ from\ .*$$/import \{ ComAtprotoModerationDefs } from '@atproto\/api'/" $$(find ./js/streamplace/src/lexicons -type f) \
136 && npx prettier --write $$(find ./js/streamplace/src/lexicons -type f -name '*.ts') \
137 && find . | grep bak$$ | xargs rm
138
139.PHONY: md-lexicons
140md-lexicons:
141 pnpm exec lexmd \
142 ./lexicons \
143 .build/temp \
144 subprojects/atproto/lexicons \
145 js/docs/src/content/docs/lex-reference/openapi.json \
146 && ls -R .build/temp \
147 && cp -rf .build/temp/place/stream/* js/docs/src/content/docs/lex-reference/ \
148 && rm -rf .build/temp \
149 && $(MAKE) fix
150
151.PHONY: lexgen
152lexgen:
153 $(MAKE) lexgen-types
154 $(MAKE) lexgen-server
155
156.PHONY: lexgen-types
157lexgen-types:
158 go run github.com/bluesky-social/indigo/cmd/lexgen \
159 -outdir ./pkg/spxrpc \
160 --build-file util/lexgen-types.json \
161 --external-lexicons subprojects/atproto/lexicons \
162 lexicons/place/stream \
163 ./subprojects/atproto/lexicons
164
165.PHONY: lexgen-server
166lexgen-server:
167 mkdir -p ./pkg/spxrpc \
168 && go run github.com/bluesky-social/indigo/cmd/lexgen \
169 --gen-server \
170 --types-import place.stream:stream.place/streamplace/pkg/streamplace \
171 --types-import app.bsky:github.com/bluesky-social/indigo/api/bsky \
172 --types-import com.atproto:github.com/bluesky-social/indigo/api/atproto \
173 --types-import chat.bsky:github.com/bluesky-social/indigo/api/chat \
174 --types-import tools.ozone:github.com/bluesky-social/indigo/api/ozone \
175 -outdir ./pkg/spxrpc \
176 --build-file util/lexgen-types.json \
177 --external-lexicons subprojects/atproto/lexicons \
178 --package spxrpc \
179 lexicons/place/stream \
180 lexicons/app/bsky \
181 lexicons/com/atproto
182
183.PHONY: ci-lexicons
184ci-lexicons:
185 $(MAKE) lexicons \
186 && if ! git diff --exit-code >/dev/null; then echo "lexicons are out of date, run 'make lexicons' to fix"; exit 1; fi
187
188.PHONY: test
189test:
190 meson test -C $(BUILDDIR) go-tests
191
192# test to make sure we haven't added any more dynamic dependencies
193LINUX_LINK_COUNT=5
194.PHONY: link-test-linux
195link-test-linux:
196 count=$(shell ldd ./build-linux-amd64/streamplace | wc -l) \
197 && echo $$count \
198 && if [ "$$count" != "$(LINUX_LINK_COUNT)" ]; then echo "ldd reports new libaries linked! want $(LINUX_LINK_COUNT) got $$count" \
199 && ldd ./build-linux-amd64/streamplace \
200 && exit 1; \
201 fi
202
203MACOS_LINK_COUNT=10
204.PHONY: link-test-macos
205link-test-macos:
206 count=$(shell otool -L ./build-darwin-arm64/streamplace | wc -l | xargs) \
207 && echo $$count \
208 && if [ "$$count" != "$(MACOS_LINK_COUNT)" ]; then echo "otool -L reports new libaries linked! want $(MACOS_LINK_COUNT) got $$count" \
209 && otool -L ./build-darwin-arm64/streamplace \
210 && exit 1; \
211 fi
212
213WINDOWS_LINK_COUNT=16
214.PHONY: link-test-windows
215link-test-windows:
216 count=$(shell x86_64-w64-mingw32-objdump -p ./build-windows-amd64/streamplace.exe | grep "DLL Name" | tr '[:upper:]' '[:lower:]' | sort | uniq | wc -l | xargs) \
217 && echo $$count \
218 && if [ "$$count" != "$(WINDOWS_LINK_COUNT)" ]; then echo "x86_64-w64-mingw32-objdump -p reports new libaries linked! want $(WINDOWS_LINK_COUNT) got $$count" \
219 && x86_64-w64-mingw32-objdump -p ./build-windows-amd64/streamplace.exe | grep "DLL Name" \
220 && exit 1; \
221 fi
222
223.PHONY: all
224all: version install app test node-all-platforms android
225
226.PHONY: ci
227ci: version install app node-all-platforms ci-upload-node
228
229.PHONY: ci-ios
230ci-ios: version install app
231 $(MAKE) ios
232 $(MAKE) ci-upload-ios
233
234.PHONY: ci-desktop-darwin
235ci-desktop-darwin: version install
236 ./util/mac-codesign.sh \
237 && for arch in amd64 arm64; do \
238 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 \
239 && tar -xzvf streamplace-$(VERSION)-darwin-$$arch.tar.gz \
240 && ./streamplace --version \
241 && ./streamplace self-test \
242 && mkdir -p build-darwin-$$arch \
243 && mv ./streamplace ./build-darwin-$$arch/streamplace; \
244 done \
245 && $(MAKE) desktop-darwin \
246 && for arch in amd64 arm64; do \
247 export file=streamplace-desktop-$(VERSION)-darwin-$$arch.zip \
248 && $(MAKE) ci-upload-file upload_file=$$file \
249 && export file=streamplace-desktop-$(VERSION)-darwin-$$arch.dmg \
250 && $(MAKE) ci-upload-file upload_file=$$file; \
251 done
252
253.PHONY: ci-android
254ci-android: version install android ci-upload-android
255
256.PHONY: ci-android-debug
257ci-android-debug: version install
258 pnpm run app prebuild
259 $(MAKE) android-debug
260 $(MAKE) ci-upload-android-debug
261
262.PHONY: ci-android-release
263ci-android-release: version install
264 pnpm run app prebuild
265 $(MAKE) android-release
266 $(MAKE) ci-upload-android-release
267
268.PHONY: ci-test
269ci-test: app
270 meson setup $(BUILDDIR) $(OPTS)
271 meson test -C $(BUILDDIR) go-tests
272
273.PHONY: ci-npm-release
274ci-npm-release: install
275 echo //registry.npmjs.org/:_authToken=$$NPM_TOKEN > ~/.npmrc \
276 && npx lerna publish from-package --yes
277
278.PHONY: android
279android: app .build/bundletool.jar
280 $(MAKE) android-release
281 $(MAKE) android-debug
282
283.PHONY: android-release
284android-release: .build/bundletool.jar
285 export NODE_ENV=production \
286 && cd ./js/app/android \
287 && ./gradlew :app:bundleRelease \
288 && cd - \
289 && mv ./js/app/android/app/build/outputs/bundle/release/app-release.aab ./bin/streamplace-$(VERSION)-android-release.aab \
290 && cd bin \
291 && java -jar ../.build/bundletool.jar build-apks --ks ../my-release-key.keystore --ks-key-alias alias_name --ks-pass pass:aquareum --bundle=streamplace-$(VERSION)-android-release.aab --output=streamplace-$(VERSION)-android-release.apks --mode=universal \
292 && unzip streamplace-$(VERSION)-android-release.apks && mv universal.apk streamplace-$(VERSION)-android-release.apk && rm toc.pb
293
294.PHONY: android-debug
295android-debug: .build/bundletool.jar
296 export NODE_ENV=production \
297 && cd ./js/app/android \
298 && ./gradlew :app:bundleDebug \
299 && cd - \
300 && mv ./js/app/android/app/build/outputs/bundle/debug/app-debug.aab ./bin/streamplace-$(VERSION)-android-debug.aab \
301 && cd bin \
302 && java -jar ../.build/bundletool.jar build-apks --ks ../my-release-key.keystore --ks-key-alias alias_name --ks-pass pass:aquareum --bundle=streamplace-$(VERSION)-android-debug.aab --output=streamplace-$(VERSION)-android-debug.apks --mode=universal \
303 && unzip streamplace-$(VERSION)-android-debug.apks && mv universal.apk streamplace-$(VERSION)-android-debug.apk && rm toc.pb
304
305.PHONY: ios
306ios: app
307 xcodebuild \
308 -workspace ./js/app/ios/Streamplace.xcworkspace \
309 -sdk iphoneos \
310 -configuration Release \
311 -scheme Streamplace \
312 -archivePath ./bin/streamplace-$(VERSION)-ios-release.xcarchive \
313 CODE_SIGN_IDENTITY=- \
314 AD_HOC_CODE_SIGNING_ALLOWED=YES \
315 CODE_SIGN_STYLE=Automatic \
316 DEVELOPMENT_TEAM=ZZZZZZZZZZ \
317 clean archive | xcpretty \
318 && cd bin \
319 && tar -czvf streamplace-$(VERSION)-ios-release.xcarchive.tar.gz streamplace-$(VERSION)-ios-release.xcarchive
320
321# xcodebuild -exportArchive -archivePath ./bin/streamplace-$(VERSION)-ios-release.xcarchive -exportOptionsPlist ./js/app/exportOptions.plist -exportPath ./bin/streamplace-$(VERSION)-ios-release.ipa
322
323.build/bundletool.jar:
324 mkdir -p .build \
325 && curl -L -o ./.build/bundletool.jar https://github.com/google/bundletool/releases/download/1.17.0/bundletool-all-1.17.0.jar
326
327BASE_OPTS = \
328 --buildtype=debugoptimized \
329 -D "gst-plugins-base:audioresample=enabled" \
330 -D "gst-plugins-base:playback=enabled" \
331 -D "gst-plugins-base:opus=enabled" \
332 -D "gst-plugins-base:gio-typefinder=enabled" \
333 -D "gst-plugins-base:videotestsrc=enabled" \
334 -D "gst-plugins-base:videoconvertscale=enabled" \
335 -D "gst-plugins-base:typefind=enabled" \
336 -D "gst-plugins-base:compositor=enabled" \
337 -D "gst-plugins-base:videorate=enabled" \
338 -D "gst-plugins-base:app=enabled" \
339 -D "gst-plugins-base:audiorate=enabled" \
340 -D "gst-plugins-base:audiotestsrc=enabled" \
341 -D "gst-plugins-base:audioconvert=enabled" \
342 -D "gst-plugins-good:matroska=enabled" \
343 -D "gst-plugins-good:multifile=enabled" \
344 -D "gst-plugins-good:rtp=enabled" \
345 -D "gst-plugins-bad:fdkaac=enabled" \
346 -D "gst-plugins-good:audioparsers=enabled" \
347 -D "gst-plugins-good:isomp4=enabled" \
348 -D "gst-plugins-good:png=enabled" \
349 -D "gst-plugins-good:videobox=enabled" \
350 -D "gst-plugins-good:jpeg=enabled" \
351 -D "gst-plugins-good:audioparsers=enabled" \
352 -D "gst-plugins-bad:videoparsers=enabled" \
353 -D "gst-plugins-bad:mpegtsmux=enabled" \
354 -D "gst-plugins-bad:mpegtsdemux=enabled" \
355 -D "gst-plugins-bad:codectimestamper=enabled" \
356 -D "gst-plugins-bad:opus=enabled" \
357 -D "gst-plugins-ugly:x264=enabled" \
358 -D "gst-plugins-ugly:gpl=enabled" \
359 -D "x264:asm=enabled" \
360 -D "gstreamer-full:gst-full=enabled" \
361 -D "gstreamer-full:gst-full-plugins=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" \
362 -D "gstreamer-full:gst-full-libraries=gstreamer-controller-1.0,gstreamer-plugins-base-1.0,gstreamer-pbutils-1.0" \
363 -D "gstreamer-full:gst-full-elements=coreelements:concat,filesrc,filesink,queue,queue2,multiqueue,typefind,tee,capsfilter,fakesink,identity" \
364 -D "gstreamer-full:bad=enabled" \
365 -D "gstreamer-full:tls=disabled" \
366 -D "gstreamer-full:libav=enabled" \
367 -D "gstreamer-full:ugly=enabled" \
368 -D "gstreamer-full:gpl=enabled" \
369 -D "gstreamer-full:gst-full-typefind-functions=" \
370 -D "gstreamer:coretracers=enabled" \
371 -D "gstreamer-full:glib_assert=false" \
372 -D "gstreamer:glib_assert=false" \
373 -D "gst-plugins-good:glib_assert=false" \
374 -D "gst-plugins-bad:glib_assert=false" \
375 -D "gst-plugins-base:glib_assert=false" \
376 -D "gst-plugins-ugly:glib_assert=false" \
377 -D "glib:glib_assert=false" \
378 -D "glib:glib_assert=false" \
379 -D "gst-libav:glib_assert=false" \
380 -D "gst-plugins-good:adaptivedemux2=disabled"
381
382OPTS = \
383 $(BASE_OPTS) \
384 -D "gstreamer-full:gst-full-target-type=static_library" \
385 -D "gstreamer:registry=false"
386
387SHARED_OPTS = \
388 $(BASE_OPTS) \
389 -D "FFmpeg:default_library=shared" \
390 -D "gstreamer:registry=true"
391
392.PHONY: meson-setup
393meson-setup:
394 @meson setup $(BUILDDIR) $(OPTS)
395 @meson configure $(BUILDDIR) $(OPTS)
396
397.PHONY: node-all-platforms
398node-all-platforms: app
399 meson setup build-linux-amd64 $(OPTS) --buildtype debugoptimized
400 meson compile -C build-linux-amd64 archive
401 $(MAKE) link-test-linux
402 $(MAKE) linux-arm64
403 $(MAKE) windows-amd64
404 $(MAKE) windows-amd64-startup-test
405 $(MAKE) desktop-linux
406 $(MAKE) desktop-windows-amd64
407
408.PHONY: desktop-linux
409desktop-linux:
410 $(MAKE) desktop-linux-amd64
411 $(MAKE) desktop-linux-arm64
412
413.PHONY: desktop-linux-amd64
414desktop-linux-amd64:
415 cd js/desktop \
416 && pnpm run make --platform linux --arch x64 \
417 && cd - \
418 && mv "js/desktop/out/make/AppImage/x64/Streamplace-$(VERSION_ELECTRON)-x64.AppImage" ./bin/streamplace-desktop-$(VERSION)-linux-amd64.AppImage
419
420.PHONY: desktop-linux-arm64
421desktop-linux-arm64:
422 cd js/desktop \
423 && pnpm run make --platform linux --arch arm64 \
424 && cd - \
425 && mv "js/desktop/out/make/AppImage/arm64/Streamplace-$(VERSION_ELECTRON)-arm64.AppImage" ./bin/streamplace-desktop-$(VERSION)-linux-arm64.AppImage
426
427.PHONY: desktop-windows-amd64
428desktop-windows-amd64:
429 cd js/desktop \
430 && pnpm run make --platform win32 --arch x64 \
431 && cd - \
432 && export SUM=$$(cat ./js/desktop/out/make/squirrel.windows/x64/streamplace_desktop-$(VERSION_ELECTRON)-full.nupkg | openssl sha1 | awk '{ print $$2 }') \
433 && echo $$SUM > ./bin/streamplace-desktop-$(VERSION)-windows-amd64.nupkg.sha1 \
434 && mv "js/desktop/out/make/squirrel.windows/x64/streamplace_desktop-$(VERSION_ELECTRON)-full.nupkg" ./bin/streamplace-desktop-$(VERSION)-windows-amd64.$$SUM.nupkg \
435 && mv "js/desktop/out/make/squirrel.windows/x64/Streamplace-$(VERSION_ELECTRON) Setup.exe" ./bin/streamplace-desktop-$(VERSION)-windows-amd64.exe
436
437.PHONY: linux-amd64
438linux-amd64:
439 meson setup --buildtype debugoptimized build-linux-amd64 $(OPTS)
440 meson compile -C build-linux-amd64 archive
441
442.PHONY: linux-arm64
443linux-arm64:
444 rustup target add aarch64-unknown-linux-gnu
445 meson setup --cross-file util/linux-arm64-gnu.ini --buildtype debugoptimized build-linux-arm64 $(OPTS)
446 meson compile -C build-linux-arm64 archive
447
448.PHONY: windows-amd64
449windows-amd64:
450 rustup target add x86_64-pc-windows-gnu
451 $(MAKE) windows-amd64-meson-setup
452 meson compile -C build-windows-amd64 archive 2>&1 | grep -v drectve
453 $(MAKE) link-test-windows
454
455.PHONY: windows-amd64-meson-setup
456windows-amd64-meson-setup:
457 meson setup --cross-file util/windows-amd64-gnu.ini --buildtype debugoptimized build-windows-amd64 $(OPTS)
458
459# unbuffer here is a workaround for wine trying to pop up a terminal window and failing
460.PHONY: windows-amd64-startup-test
461windows-amd64-startup-test:
462 bash -c 'set -euo pipefail && unbuffer wine64 ./build-windows-amd64/streamplace.exe self-test | cat'
463
464.PHONY: darwin-amd64
465darwin-amd64:
466 export CC=x86_64-apple-darwin24.4-clang \
467 && export CC_X86_64_APPLE_DARWIN=x86_64-apple-darwin24.4-clang \
468 && export CXX_X86_64_APPLE_DARWIN=x86_64-apple-darwin24.4-clang++ \
469 && export AR_X86_64_APPLE_DARWIN=x86_64-apple-darwin24.4-ar \
470 && export CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER=x86_64-apple-darwin24.4-clang \
471 && export LD=x86_64-apple-darwin24.4-ld \
472 && export CROSS_COMPILE=1 \
473 && meson setup --buildtype debugoptimized --cross-file util/osxcross-darwin-amd64.ini build-darwin-amd64 $(OPTS) \
474 && meson compile -C build-darwin-amd64 subprojects/glib-2.82.4/gio/gioenumtypes_h \
475 && meson compile -C build-darwin-amd64 streamplace \
476 && ./util/osxcross-codesign.sh ./build-darwin-amd64/streamplace \
477 && mkdir -p bin \
478 && cd build-darwin-amd64 \
479 && tar -czvf ../bin/streamplace-$(VERSION)-darwin-amd64.tar.gz ./streamplace \
480 && cd -
481
482.PHONY: desktop-darwin-amd64
483desktop-darwin-amd64:
484 echo "TODO"
485
486.PHONY: darwin-amd64
487darwin-arm64:
488 export CC=aarch64-apple-darwin24.4-clang \
489 && export CC_AARCH64_APPLE_DARWIN=aarch64-apple-darwin24.4-clang \
490 && export CXX_AARCH64_APPLE_DARWIN=aarch64-apple-darwin24.4-clang++ \
491 && export AR_AARCH64_APPLE_DARWIN=aarch64-apple-darwin24.4-ar \
492 && export CARGO_TARGET_AARCH64_APPLE_DARWIN_LINKER=aarch64-apple-darwin24.4-clang \
493 && export LD=aarch64-apple-darwin24.4-ld \
494 && export CROSS_COMPILE=1 \
495 && meson setup --buildtype debugoptimized --cross-file util/osxcross-darwin-arm64.ini build-darwin-arm64 $(OPTS) \
496 && meson compile -C build-darwin-arm64 streamplace \
497 && ./util/osxcross-codesign.sh ./build-darwin-arm64/streamplace \
498 && mkdir -p bin \
499 && cd build-darwin-arm64 \
500 && tar -czvf ../bin/streamplace-$(VERSION)-darwin-arm64.tar.gz ./streamplace \
501 && cd -
502
503.PHONY: desktop-darwin-arm64
504desktop-darwin-arm64:
505 echo "TODO"
506
507.PHONY: desktop-darwin
508desktop-darwin:
509 export DEBUG="electron-osx-sign*" \
510 && cd js/desktop \
511 && pnpm run make --platform darwin --arch arm64 \
512 && pnpm run make --platform darwin --arch x64 \
513 && cd - \
514 && mv js/desktop/out/make/Streamplace-$(VERSION_ELECTRON)-x64.dmg ./bin/streamplace-desktop-$(VERSION)-darwin-amd64.dmg \
515 && mv js/desktop/out/make/Streamplace-$(VERSION_ELECTRON)-arm64.dmg ./bin/streamplace-desktop-$(VERSION)-darwin-arm64.dmg \
516 && mv js/desktop/out/make/zip/darwin/x64/Streamplace-darwin-x64-$(VERSION_ELECTRON).zip ./bin/streamplace-desktop-$(VERSION)-darwin-amd64.zip \
517 && mv js/desktop/out/make/zip/darwin/arm64/Streamplace-darwin-arm64-$(VERSION_ELECTRON).zip ./bin/streamplace-desktop-$(VERSION)-darwin-arm64.zip
518
519.PHONY: selftest-macos
520selftest-macos:
521 js/desktop/out/Streamplace-darwin-arm64/Streamplace.app/Contents/MacOS/Streamplace -- --self-test
522
523# link your local version of mist for dev
524.PHONY: link-mist
525link-mist:
526 rm -rf subprojects/mistserver
527 ln -s $$(realpath ../mistserver) ./subprojects/mistserver
528
529# link your local version of c2pa-go for dev
530.PHONY: link-c2pa-go
531link-c2pa-go:
532 rm -rf subprojects/c2pa_go
533 ln -s $$(realpath ../c2pa-go) ./subprojects/c2pa_go
534
535# link your local version of gstreamer
536.PHONY: link-gstreamer
537link-gstreamer:
538 rm -rf subprojects/gstreamer-full
539 ln -s $$(realpath ../gstreamer) ./subprojects/gstreamer-full
540
541# link your local version of ffmpeg for dev
542.PHONY: link-ffmpeg
543link-ffmpeg:
544 rm -rf subprojects/FFmpeg
545 ln -s $$(realpath ../ffmpeg) ./subprojects/FFmpeg
546
547.PHONY: docker
548docker:
549 docker build -f docker/local.Dockerfile -t dist.stream.place/streamplace/streamplace:local .
550
551.PHONY: docker-build
552docker-build: docker-build-builder docker-build-in-container
553
554.PHONY: docker-test
555docker-test: docker-build-builder docker-test-in-container
556
557DOCKER_BUILD_OPTS?=
558BUILDER_TARGET?=builder
559.PHONY: docker-build-builder
560docker-build-builder:
561 podman build --target=$(BUILDER_TARGET) --os=linux --arch=amd64 -f docker/build.Dockerfile -t dist.stream.place/streamplace/streamplace:$(BUILDER_TARGET) $(DOCKER_BUILD_OPTS) .
562
563.PHONY: golangci-lint-container
564golangci-lint-container: docker-build-builder
565 podman run \
566 -v $$(pwd):$$(pwd) \
567 -w $$(pwd) \
568 -e PKG_CONFIG_PATH=$$(pwd)/build-linux-amd64/meson-uninstalled \
569 -d \
570 --name golangci-lint \
571 dist.stream.place/streamplace/streamplace:$(BUILDER_TARGET) \
572 tail -f /dev/null
573 podman exec golangci-lint mkdir -p js/app/dist
574 podman exec golangci-lint touch js/app/dist/skip-build.txt
575 podman exec golangci-lint make node
576
577.PHONY: docker-build-in-container
578docker-build-in-container:
579 podman run -v $$(pwd):$$(pwd) -w $$(pwd) --rm -it dist.stream.place/streamplace/streamplace:$(BUILDER_TARGET) make app-and-node
580
581.PHONY: docker-test-in-container
582docker-test-in-container:
583 podman run -v $$(pwd):$$(pwd) -w $$(pwd) --rm -it dist.stream.place/streamplace/streamplace:$(BUILDER_TARGET) make app-and-node-and-test
584
585IN_CONTAINER_CMD?=echo 'usage: make in-container IN_CONTAINER_CMD=\"<command>\"'
586DOCKER_BIN?=podman
587DOCKER_REF?=dist.stream.place/streamplace/streamplace:$(BUILDER_TARGET)
588DOCKER_OPTS?=
589.PHONY: in-container
590in-container: docker-build-builder
591 $(DOCKER_BIN) run $(DOCKER_OPTS) -v $$(pwd):$$(pwd) -w $$(pwd) --rm $(DOCKER_REF) bash -c "$(IN_CONTAINER_CMD)"
592
593STREAMPLACE_URL?=https://git.stream.place/streamplace/streamplace/-/package_files/10122/download
594.PHONY: docker-release
595docker-release:
596 cd docker \
597 && docker build -f release.Dockerfile \
598 --build-arg TARGETARCH=$(BUILDARCH) \
599 --build-arg STREAMPLACE_URL=$(STREAMPLACE_URL) \
600 -t dist.stream.place/streamplace/streamplace \
601 .
602
603.PHONY: docker-mistserver
604docker-mistserver:
605 cd docker \
606 && docker build -f mistserver.Dockerfile \
607 --build-arg TARGETARCH=$(BUILDARCH) \
608 --build-arg STREAMPLACE_URL=$(STREAMPLACE_URL) \
609 -t dist.stream.place/streamplace/streamplace:mistserver \
610 .
611
612.PHONY: ci-upload
613ci-upload: ci-upload-node ci-upload-android
614
615.PHONY: ci-upload-node-linux-amd64
616ci-upload-node-linux-amd64:
617 export file=streamplace-$(VERSION)-linux-amd64.tar.gz \
618 && $(MAKE) ci-upload-file upload_file=$$file; \
619 export file=streamplace-desktop-$(VERSION)-linux-amd64.AppImage \
620 && $(MAKE) ci-upload-file upload_file=$$file;
621
622.PHONY: ci-upload-node-linux-arm64
623ci-upload-node-linux-arm64:
624 export file=streamplace-$(VERSION)-linux-arm64.tar.gz \
625 && $(MAKE) ci-upload-file upload_file=$$file; \
626 export file=streamplace-desktop-$(VERSION)-linux-arm64.AppImage \
627 && $(MAKE) ci-upload-file upload_file=$$file;
628
629.PHONY: ci-upload-node-darwin-arm64
630ci-upload-node-darwin-arm64:
631 export file=streamplace-$(VERSION)-darwin-arm64.tar.gz \
632 && $(MAKE) ci-upload-file upload_file=$$file;
633
634.PHONY: ci-upload-node-darwin-amd64
635ci-upload-node-darwin-amd64:
636 export file=streamplace-$(VERSION)-darwin-amd64.tar.gz \
637 && $(MAKE) ci-upload-file upload_file=$$file;
638
639.PHONY: ci-upload-node-windows-amd64
640ci-upload-node-windows-amd64:
641 export file=streamplace-$(VERSION)-windows-amd64.zip \
642 && $(MAKE) ci-upload-file upload_file=$$file; \
643 export file=streamplace-desktop-$(VERSION)-windows-amd64.exe \
644 && $(MAKE) ci-upload-file upload_file=$$file; \
645 export SUM=$$(cat bin/streamplace-desktop-$(VERSION)-windows-amd64.nupkg.sha1) \
646 && export file=streamplace-desktop-$(VERSION)-windows-amd64.$$SUM.nupkg \
647 && $(MAKE) ci-upload-file upload_file=$$file;
648
649.PHONY: ci-upload-node-macos
650ci-upload-node-macos: node-all-platforms-macos
651 for GOOS in darwin; do \
652 for GOARCH in amd64 arm64; do \
653 export file=streamplace-$(VERSION)-$$GOOS-$$GOARCH.tar.gz \
654 && $(MAKE) ci-upload-file upload_file=$$file; \
655 export file=streamplace-desktop-$(VERSION)-$$GOOS-$$GOARCH.dmg \
656 && $(MAKE) ci-upload-file upload_file=$$file; \
657 export file=streamplace-desktop-$(VERSION)-$$GOOS-$$GOARCH.zip \
658 && $(MAKE) ci-upload-file upload_file=$$file; \
659 done \
660 done;
661
662.PHONY: ci-upload-android
663ci-upload-android: android
664 $(MAKE) ci-upload-android-debug \
665 && $(MAKE) ci-upload-android-release
666
667.PHONY: ci-upload-android-debug
668ci-upload-android-debug:
669 $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-android-debug.apk \
670 && $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-android-debug.aab
671
672.PHONY: ci-upload-android-release
673ci-upload-android-release:
674 $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-android-release.apk \
675 && $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-android-release.aab
676
677.PHONY: ci-upload-ios
678ci-upload-ios: ios
679 $(MAKE) ci-upload-file upload_file=streamplace-$(VERSION)-ios-release.xcarchive.tar.gz
680
681upload_file?=""
682.PHONY: ci-upload-file
683ci-upload-file:
684 curl \
685 --fail-with-body \
686 --header "JOB-TOKEN: $$CI_JOB_TOKEN" \
687 --upload-file bin/$(upload_file) \
688 "$$CI_API_V4_URL/projects/$$CI_PROJECT_ID/packages/generic/$(BRANCH)/$(VERSION)/$(upload_file)";
689
690.PHONY: release
691release: install
692 $(MAKE) lexicons
693 pnpm run release
694
695.PHONY: ci-release
696ci-release:
697 go install gitlab.com/gitlab-org/release-cli/cmd/release-cli
698 go run ./pkg/config/git/git.go -release -o release.yml
699 release-cli create-from-file --file release.yml
700
701.PHONY: check
702check: install
703 $(MAKE) golangci-lint
704 pnpm run check
705 if [ "`gofmt -l . | wc -l`" -gt 0 ]; then echo 'gofmt failed, run make fix'; exit 1; fi
706
707.PHONY: fix
708fix:
709 pnpm run fix
710 gofmt -w .
711
712.PHONY: precommit
713precommit: dockerfile-hash-precommit
714
715.PHONY: dockefile-hash-precommit
716dockerfile-hash-precommit:
717 @bash -c 'printf "variables:\n DOCKERFILE_HASH: `git hash-object docker/build.Dockerfile`" > .ci/dockerfile-hash.yaml' \
718 && git add .ci/dockerfile-hash.yaml
719
720.PHONY: rtcrec
721rtcrec:
722 go build -o $(BUILDDIR)/rtcrec ./pkg/rtcrec/cmd/...