diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8db3671..e1c09a7 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,7 @@
stages:
- frontend
- build
+- build desktop
- docker
default:
@@ -164,3 +165,89 @@ docker/manifest:
docker manifest create $MANIFEST_NAME $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-amd64 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-arm64
docker manifest push $MANIFEST_NAME
- docker rmi $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-amd64 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-arm64
+
+.build-desktop: &build-desktop
+ stage: build desktop
+ cache:
+ paths:
+ - .cache
+ before_script:
+ - mkdir -p .cache
+ - export GOPATH="$CI_PROJECT_DIR/.cache"
+ - export GOCACHE="$CI_PROJECT_DIR/.cache/build"
+ script:
+ - cd desktop
+ - wails3 task $PLATFORM:package
+ - ls bin
+ artifacts:
+ paths:
+ - desktop/bin/*
+ dependencies:
+ - frontend
+ needs:
+ - frontend
+
+desktop/linux/amd64:
+ <<: *build-desktop
+ image: dock.mau.dev/tulir/gomuks-build-docker/wails:linux-amd64
+ variables:
+ PLATFORM: linux
+ after_script:
+ - mv desktop/bin/gomuks-desktop .
+ - mv desktop/build/nfpm/bin/gomuks-desktop.deb .
+ artifacts:
+ paths:
+ - gomuks-desktop
+ - gomuks-desktop.deb
+ tags:
+ - linux
+ - amd64
+
+desktop/linux/arm64:
+ <<: *build-desktop
+ image: dock.mau.dev/tulir/gomuks-build-docker/wails:linux-arm64-native
+ variables:
+ PLATFORM: linux
+ after_script:
+ - mv desktop/bin/gomuks-desktop .
+ - mv desktop/build/nfpm/bin/gomuks-desktop.deb .
+ artifacts:
+ paths:
+ - gomuks-desktop
+ - gomuks-desktop.deb
+ tags:
+ - linux
+ - arm64
+
+desktop/windows/amd64:
+ <<: *build-desktop
+ image: dock.mau.dev/tulir/gomuks-build-docker/wails:windows-amd64
+ after_script:
+ - mv desktop/bin/gomuks-desktop.exe .
+ artifacts:
+ paths:
+ - gomuks-desktop.exe
+ variables:
+ PLATFORM: windows
+
+desktop/macos/arm64:
+ <<: *build-desktop
+ cache: {}
+ before_script:
+ - export PATH=/opt/homebrew/bin:/usr/local/bin:$PATH
+ - export LIBRARY_PATH=$(brew --prefix)/lib
+ - export CPATH=$(brew --prefix)/include
+ after_script:
+ - hdiutil create -srcFolder ./desktop/bin/gomuks-desktop.app/ -o ./gomuks-desktop.dmg
+ - codesign -s - --timestamp -i fi.mau.gomuks.desktop.mac gomuks-desktop.dmg
+ - mv desktop/bin/gomuks-desktop .
+ artifacts:
+ paths:
+ - gomuks-desktop
+ # TODO generate proper dmgs
+ #- gomuks-desktop.dmg
+ variables:
+ PLATFORM: darwin
+ tags:
+ - macos
+ - arm64
diff --git a/desktop/.gitignore b/desktop/.gitignore
index 678c4d5..fa24770 100644
--- a/desktop/.gitignore
+++ b/desktop/.gitignore
@@ -1,2 +1,3 @@
.task
bin
+build/appimage
diff --git a/desktop/Taskfile.yml b/desktop/Taskfile.yml
index b455132..bedee78 100644
--- a/desktop/Taskfile.yml
+++ b/desktop/Taskfile.yml
@@ -1,448 +1,54 @@
version: '3'
+includes:
+ common: ./build/Taskfile.common.yml
+ windows: ./build/Taskfile.windows.yml
+ darwin: ./build/Taskfile.darwin.yml
+ linux: ./build/Taskfile.linux.yml
+
vars:
APP_NAME: "gomuks-desktop"
BIN_DIR: "bin"
VITE_PORT: '{{.WAILS_VITE_PORT | default 9245}}'
tasks:
-
- ## -------------------------- Build -------------------------- ##
-
build:
summary: Builds the application
cmds:
- # Build for current OS
- - task: build:{{OS}}
-
- # Uncomment to build for specific OSes
- # - task: build:linux
- # - task: build:windows
- # - task: build:darwin
-
-
- ## ------> Windows <-------
-
- build:windows:
- summary: Builds the application for Windows
- deps:
- - task: go:mod:tidy
- - task: build:frontend
- vars:
- BUILD_FLAGS: '{{.BUILD_FLAGS}}'
- - task: generate:icons
- - task: generate:syso
- vars:
- ARCH: '{{.ARCH}}'
- cmds:
- - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/gomuks-desktop.exe
- vars:
- BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -ldflags="-w -s -H windowsgui"{{else}}-gcflags=all="-l"{{end}}'
- env:
- GOOS: windows
- CGO_ENABLED: 0
- GOARCH: '{{.ARCH | default ARCH}}'
- PRODUCTION: '{{.PRODUCTION | default "false"}}'
-
- build:windows:prod:arm64:
- summary: Creates a production build of the application
- cmds:
- - task: build:windows
- vars:
- ARCH: arm64
- PRODUCTION: "true"
-
- build:windows:prod:amd64:
- summary: Creates a production build of the application
- cmds:
- - task: build:windows
- vars:
- ARCH: amd64
- PRODUCTION: "true"
-
- build:windows:debug:arm64:
- summary: Creates a debug build of the application
- cmds:
- - task: build:windows
- vars:
- ARCH: arm64
-
- build:windows:debug:amd64:
- summary: Creates a debug build of the application
- cmds:
- - task: build:windows
- vars:
- ARCH: amd64
-
- ## ------> Darwin <-------
-
- build:darwin:
- summary: Creates a production build of the application
- deps:
- - task: go:mod:tidy
- - task: build:frontend
- vars:
- BUILD_FLAGS: '{{.BUILD_FLAGS}}'
- - task: generate:icons
- cmds:
- - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/{{.APP_NAME}}
- vars:
- BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -ldflags="-w -s"{{else}}-gcflags=all="-l"{{end}}'
- env:
- GOOS: darwin
- CGO_ENABLED: 1
- GOARCH: '{{.ARCH | default ARCH}}'
- CGO_CFLAGS: "-mmacosx-version-min=10.15"
- CGO_LDFLAGS: "-mmacosx-version-min=10.15"
- MACOSX_DEPLOYMENT_TARGET: "10.15"
- PRODUCTION: '{{.PRODUCTION | default "false"}}'
-
- build:darwin:prod:arm64:
- summary: Creates a production build of the application
- cmds:
- - task: build:darwin
- vars:
- ARCH: arm64
- PRODUCTION: "true"
-
- build:darwin:prod:amd64:
- summary: Creates a production build of the application
- cmds:
- - task: build:darwin
- vars:
- ARCH: amd64
- PRODUCTION: "true"
-
- build:darwin:debug:arm64:
- summary: Creates a debug build of the application
- cmds:
- - task: build:darwin
- vars:
- ARCH: arm64
-
- build:darwin:debug:amd64:
- summary: Creates a debug build of the application
- cmds:
- - task: build:darwin
- vars:
- ARCH: amd64
-
-
- ## ------> Linux <-------
-
- build:linux:
- summary: Builds the application for Linux
- deps:
- - task: go:mod:tidy
- - task: build:frontend
- vars:
- BUILD_FLAGS: '{{.BUILD_FLAGS}}'
- - task: generate:icons
- vars:
- ARCH: '{{.ARCH}}'
- cmds:
- - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/gomuks-desktop
- vars:
- BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -ldflags="-w -s"{{else}}-gcflags=all="-l"{{end}}'
- env:
- GOOS: linux
- CGO_ENABLED: 1
- GOARCH: '{{.ARCH | default ARCH}}'
- PRODUCTION: '{{.PRODUCTION | default "false"}}'
-
- build:linux:prod:arm64:
- summary: Creates a production build of the application
- cmds:
- - task: build:linux
- vars:
- ARCH: arm64
- PRODUCTION: "true"
-
- build:linux:prod:amd64:
- summary: Creates a production build of the application
- cmds:
- - task: build:linux
- vars:
- ARCH: amd64
- PRODUCTION: "true"
-
- build:linux:debug:arm64:
- summary: Creates a debug build of the application
- cmds:
- - task: build:linux
- vars:
- ARCH: arm64
-
- build:linux:debug:amd64:
- summary: Creates a debug build of the application
- cmds:
- - task: build:linux
- vars:
- ARCH: amd64
-
- ## -------------------------- Package -------------------------- ##
+ - task: "{{OS}}:build"
package:
- summary: Packages a production build of the application into a bundle
+ summary: Packages a production build of the application
cmds:
-
- # Package for current OS
- - task: package:{{OS}}
-
- # Package for specific os/arch
- # - task: package:darwin:arm64
- # - task: package:darwin:amd64
- # - task: package:windows:arm64
- # - task: package:windows:amd64
-
- ## ------> Windows <------
-
- package:windows:
- summary: Packages a production build of the application into a `.exe` bundle
- cmds:
- - task: create:nsis:installer
- vars:
- ARCH: '{{.ARCH}}'
- vars:
- ARCH: '{{.ARCH | default ARCH}}'
-
- package:windows:arm64:
- summary: Packages a production build of the application into a `.exe` bundle
- cmds:
- - task: package:windows
- vars:
- ARCH: arm64
-
- package:windows:amd64:
- summary: Packages a production build of the application into a `.exe` bundle
- cmds:
- - task: package:windows
- vars:
- ARCH: amd64
-
- generate:syso:
- summary: Generates Windows `.syso` file
- dir: build
- cmds:
- - wails3 generate syso -arch {{.ARCH}} -icon icon.ico -manifest wails.exe.manifest -info info.json -out ../wails.syso
- vars:
- ARCH: '{{.ARCH | default ARCH}}'
-
- create:nsis:installer:
- summary: Creates an NSIS installer
- label: "NSIS Installer ({{.ARCH}})"
- dir: build/nsis
- sources:
- - "{{.ROOT_DIR}}\\bin\\{{.APP_NAME}}.exe"
- generates:
- - "{{.ROOT_DIR}}\\bin\\{{.APP_NAME}}-{{.ARCH}}-installer.exe"
- deps:
- - task: build:windows
- vars:
- PRODUCTION: "true"
- ARCH: '{{.ARCH}}'
- cmds:
- - makensis -DARG_WAILS_'{{.ARG_FLAG}}'_BINARY="{{.ROOT_DIR}}\{{.BIN_DIR}}\{{.APP_NAME}}.exe" project.nsi
- vars:
- ARCH: '{{.ARCH | default ARCH}}'
- ARG_FLAG: '{{if eq .ARCH "amd64"}}AMD64{{else}}ARM64{{end}}'
-
- ## ------> Darwin <------
-
- package:darwin:
- summary: Packages a production build of the application into a `.app` bundle
- platforms: [ darwin ]
- deps:
- - task: build:darwin
- vars:
- PRODUCTION: "true"
- cmds:
- - task: create:app:bundle
-
- package:darwin:arm64:
- summary: Packages a production build of the application into a `.app` bundle
- platforms: [ darwin/arm64 ]
- deps:
- - task: package:darwin
- vars:
- ARCH: arm64
-
- package:darwin:amd64:
- summary: Packages a production build of the application into a `.app` bundle
- platforms: [ darwin/amd64 ]
- deps:
- - task: package:darwin
- vars:
- ARCH: amd64
-
- create:app:bundle:
- summary: Creates an `.app` bundle
- cmds:
- - mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/{MacOS,Resources}
- - cp build/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources
- - cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/MacOS
- - cp build/Info.plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents
-
- ## ------> Linux <------
-
- package:linux:
- summary: Packages a production build of the application for Linux
- platforms: [ linux ]
- deps:
- - task: build:linux
- vars:
- PRODUCTION: "true"
- cmds:
- - task: create:appimage
-
- create:appimage:
- summary: Creates an AppImage
- dir: build/appimage
- platforms: [ linux ]
- deps:
- - task: build:linux
- vars:
- PRODUCTION: "true"
- - task: generate:linux:dotdesktop
- cmds:
- # Copy binary + icon to appimage dir
- - cp {{.APP_BINARY}} {{.APP_NAME}}
- - cp ../appicon.png appicon.png
- # Generate AppImage
- - wails3 generate appimage -binary {{.APP_NAME}} -icon {{.ICON}} -desktopfile {{.DESKTOP_FILE}} -outputdir {{.OUTPUT_DIR}} -builddir {{.ROOT_DIR}}/build/appimage
- vars:
- APP_NAME: '{{.APP_NAME}}'
- APP_BINARY: '../../bin/{{.APP_NAME}}'
- ICON: '../appicon.png'
- DESKTOP_FILE: '{{.APP_NAME}}.desktop'
- OUTPUT_DIR: '../../bin'
-
- generate:linux:dotdesktop:
- summary: Generates a `.desktop` file
- dir: build
- sources:
- - "appicon.png"
- generates:
- - '{{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop'
- cmds:
- - mkdir -p {{.ROOT_DIR}}/build/appimage
- # Run `wails3 generate .desktop -help` for all the options
- - wails3 generate .desktop -name "{{.APP_NAME}}" -exec "{{.EXEC}}" -icon "{{.ICON}}" -outputfile {{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop -categories "{{.CATEGORIES}}"
- # -comment "A comment"
- # -terminal "true"
- # -version "1.0"
- # -genericname "Generic Name"
- # -keywords "keyword1;keyword2;"
- # -startupnotify "true"
- # -mimetype "application/x-extension1;application/x-extension2;"
-
- vars:
- APP_NAME: '{{.APP_NAME}}'
- EXEC: '{{.APP_NAME}}'
- ICON: 'appicon'
- CATEGORIES: 'Development;'
- OUTPUTFILE: '{{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop'
-
- ## -------------------------- Misc -------------------------- ##
-
-
- generate:icons:
- summary: Generates Windows `.ico` and Mac `.icns` files from an image
- dir: build
- sources:
- - "appicon.png"
- generates:
- - "icons.icns"
- - "icons.ico"
- cmds:
- # Generates both .ico and .icns files
- - wails3 generate icons -input appicon.png
-
- install:frontend:deps:
- summary: Install frontend dependencies
- dir: ../web
- sources:
- - package.json
- - package-lock.json
- generates:
- - node_modules/*
- preconditions:
- - sh: npm version
- msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
- cmds:
- - npm install --silent --no-progress
-
- build:frontend:
- summary: Build the frontend project
- dir: ../web
- sources:
- - "**/*"
- generates:
- - dist/*
- deps:
- - install:frontend:deps
- - task: generate:bindings
- vars:
- BUILD_FLAGS: '{{.BUILD_FLAGS}}'
- cmds:
- - npm run build -q
-
- generate:bindings:
- summary: Generates bindings for the frontend
- sources:
- - "**/*.go"
- - go.mod
- - go.sum
- generates: []
- #- "../web/src/wails/**/*"
- cmds: []
- # For a complete list of options, run `wails3 generate bindings -help`
- #- wails3 generate bindings -d ../web/src/wails -f '{{.BUILD_FLAGS}}'
-
- go:mod:tidy:
- summary: Runs `go mod tidy`
- internal: true
- generates:
- - go.sum
- sources:
- - go.mod
- cmds:
- - go mod tidy
-
-# ----------------------- dev ----------------------- #
-
+ - task: "{{OS}}:package"
run:
summary: Runs the application
cmds:
- - task: run:{{OS}}
-
- run:windows:
- cmds:
- - '{{.BIN_DIR}}\\{{.APP_NAME}}.exe'
-
- run:linux:
- cmds:
- - '{{.BIN_DIR}}/{{.APP_NAME}}'
-
- run:darwin:
- cmds:
- - '{{.BIN_DIR}}/{{.APP_NAME}}'
-
- dev:frontend:
- summary: Runs the frontend in development mode
- dir: ../web
- deps:
- - task: install:frontend:deps
- cmds:
- - npm run dev -- --port {{.VITE_PORT}} --strictPort
+ - task: "{{OS}}:run"
dev:
summary: Runs the application in development mode
cmds:
- - wails3 dev -config ./build/devmode.config.yaml -port {{.VITE_PORT}}
+ - wails3 dev -config ./build/config.yml -port {{.VITE_PORT}}
- dev:reload:
- summary: Reloads the application
+ darwin:build:universal:
+ summary: Builds darwin universal binary (arm64 + amd64)
cmds:
- - task: run
+ - task: darwin:build
+ vars:
+ ARCH: amd64
+ - mv {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}-amd64
+ - task: darwin:build
+ vars:
+ ARCH: arm64
+ - mv {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}-arm64
+ - lipo -create -output {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}-amd64 {{.BIN_DIR}}/{{.APP_NAME}}-arm64
+ - rm {{.BIN_DIR}}/{{.APP_NAME}}-amd64 {{.BIN_DIR}}/{{.APP_NAME}}-arm64
+
+ darwin:package:universal:
+ summary: Packages darwin universal binary (arm64 + amd64)
+ deps:
+ - darwin:build:universal
+ cmds:
+ - task: darwin:create:app:bundle
diff --git a/desktop/build/Info.dev.plist b/desktop/build/Info.dev.plist
index 98c6ce3..995fe72 100644
--- a/desktop/build/Info.dev.plist
+++ b/desktop/build/Info.dev.plist
@@ -22,7 +22,7 @@
NSHighResolutionCapable
true
NSHumanReadableCopyright
- © 2024, Tulir Asokan
+ © 2024, gomuks authors
NSAppTransportSecurity
NSAllowsLocalNetworking
diff --git a/desktop/build/Info.plist b/desktop/build/Info.plist
index 5ab9e57..cadeb2c 100644
--- a/desktop/build/Info.plist
+++ b/desktop/build/Info.plist
@@ -22,6 +22,6 @@
NSHighResolutionCapable
true
NSHumanReadableCopyright
- © 2024, Tulir Asokan
+ © 2024, gomuks authors
diff --git a/desktop/build/Taskfile.common.yml b/desktop/build/Taskfile.common.yml
new file mode 100644
index 0000000..484efc8
--- /dev/null
+++ b/desktop/build/Taskfile.common.yml
@@ -0,0 +1,75 @@
+version: '3'
+
+tasks:
+ go:mod:tidy:
+ summary: Runs `go mod tidy`
+ internal: true
+ generates:
+ - go.sum
+ sources:
+ - go.mod
+ cmds:
+ - go mod tidy
+
+ install:frontend:deps:
+ summary: Install frontend dependencies
+ dir: ../web
+ sources:
+ - package.json
+ - package-lock.json
+ generates:
+ - node_modules/*
+ preconditions:
+ - sh: npm version
+ msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
+ cmds:
+ - npm install
+
+ build:frontend:
+ summary: Build the frontend project
+ dir: ../web
+ sources:
+ - "**/*"
+ generates:
+ - dist/*
+ deps:
+ - task: install:frontend:deps
+ #- task: generate:bindings
+ cmds:
+ - npm run build -q
+
+ generate:bindings:
+ summary: Generates bindings for the frontend
+ sources:
+ - "**/*.go"
+ - go.mod
+ - go.sum
+ generates: []
+ #- "frontend/bindings/**/*"
+ cmds: []
+ #- wails3 generate bindings -f '{{.BUILD_FLAGS}}'{{if .UseTypescript}} -ts{{end}}
+
+ generate:icons:
+ summary: Generates Windows `.ico` and Mac `.icns` files from an image
+ dir: build
+ sources:
+ - "appicon.png"
+ generates:
+ - "icons.icns"
+ - "icons.ico"
+ cmds:
+ - wails3 generate icons -input appicon.png
+
+ dev:frontend:
+ summary: Runs the frontend in development mode
+ dir: ../web
+ deps:
+ - task: install:frontend:deps
+ cmds:
+ - npm run dev -- --port {{.VITE_PORT}} --strictPort
+
+ update:build-assets:
+ summary: Updates the build assets
+ dir: build
+ cmds:
+ - wails3 update build-assets -name "{{.APP_NAME}}" -binaryname "{{.APP_NAME}}" -config config.yml -dir .
diff --git a/desktop/build/Taskfile.darwin.yml b/desktop/build/Taskfile.darwin.yml
new file mode 100644
index 0000000..180748c
--- /dev/null
+++ b/desktop/build/Taskfile.darwin.yml
@@ -0,0 +1,47 @@
+version: '3'
+
+includes:
+ common: Taskfile.common.yml
+
+tasks:
+ build:
+ summary: Creates a production build of the application
+ deps: []
+ #- task: common:go:mod:tidy
+ #- task: common:build:frontend
+ #- task: common:generate:icons
+ cmds:
+ - MAUTRIX_VERSION=$(cat go.mod | grep 'maunium.net/go/mautrix ' | awk '{ print $2 }')
+ - GO_LDFLAGS="-s -w -X go.mau.fi/gomuks/version.Tag=$CI_COMMIT_TAG -X go.mau.fi/gomuks/version.Commit=$CI_COMMIT_SHA -X 'go.mau.fi/gomuks/version.BuildTime=`date -Iseconds`' -X 'maunium.net/go/mautrix.GoModVersion=$MAUTRIX_VERSION'"
+ - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/{{.APP_NAME}}
+ vars:
+ BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath{{else}}-gcflags=all="-l"{{end}}'
+ env:
+ GOOS: darwin
+ CGO_ENABLED: 1
+ GOARCH: '{{.ARCH | default ARCH}}'
+ CGO_CFLAGS: "-mmacosx-version-min=11.0"
+ CGO_LDFLAGS: "-mmacosx-version-min=11.0"
+ MACOSX_DEPLOYMENT_TARGET: "11.0"
+ PRODUCTION: '{{.PRODUCTION | default "false"}}'
+
+ package:
+ summary: Packages a production build of the application into a `.app` bundle
+ deps:
+ - task: build
+ vars:
+ PRODUCTION: "true"
+ cmds:
+ - task: create:app:bundle
+
+ create:app:bundle:
+ summary: Creates an `.app` bundle
+ cmds:
+ - mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/{MacOS,Resources}
+ - cp build/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources
+ - cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/MacOS
+ - cp build/Info.plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents
+
+ run:
+ cmds:
+ - '{{.BIN_DIR}}/{{.APP_NAME}}'
diff --git a/desktop/build/Taskfile.linux.yml b/desktop/build/Taskfile.linux.yml
new file mode 100644
index 0000000..1472c3a
--- /dev/null
+++ b/desktop/build/Taskfile.linux.yml
@@ -0,0 +1,117 @@
+version: '3'
+
+includes:
+ common: Taskfile.common.yml
+
+tasks:
+ build:
+ summary: Builds the application for Linux
+ deps: []
+ #- task: common:go:mod:tidy
+ #- task: common:build:frontend
+ #- task: common:generate:icons
+ cmds:
+ - MAUTRIX_VERSION=$(cat go.mod | grep 'maunium.net/go/mautrix ' | awk '{ print $2 }')
+ - GO_LDFLAGS="-s -w -X go.mau.fi/gomuks/version.Tag=$CI_COMMIT_TAG -X go.mau.fi/gomuks/version.Commit=$CI_COMMIT_SHA -X 'go.mau.fi/gomuks/version.BuildTime=`date -Iseconds`' -X 'maunium.net/go/mautrix.GoModVersion=$MAUTRIX_VERSION'"
+ - go build {{.BUILD_FLAGS}} -ldflags "$GO_LDFLAGS" -o {{.BIN_DIR}}/{{.APP_NAME}}
+ vars:
+ BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath{{else}}-gcflags=all="-l"{{end}}'
+ env:
+ GOOS: linux
+ CGO_ENABLED: 1
+ GOARCH: '{{.ARCH | default ARCH}}'
+ PRODUCTION: '{{.PRODUCTION | default "false"}}'
+
+ package:
+ summary: Packages a production build of the application for Linux
+ deps:
+ - task: build
+ vars:
+ PRODUCTION: "true"
+ cmds:
+ #- task: create:appimage
+ - task: create:deb
+ #- task: create:rpm
+ #- task: create:aur
+
+ create:appimage:
+ summary: Creates an AppImage
+ dir: build/appimage
+ deps:
+ - task: build
+ vars:
+ PRODUCTION: "true"
+ - task: generate:dotdesktop
+ cmds:
+ - cp {{.APP_BINARY}} {{.APP_NAME}}
+ - cp ../appicon.png appicon.png
+ - wails3 generate appimage -binary {{.APP_NAME}} -icon {{.ICON}} -desktopfile {{.DESKTOP_FILE}} -outputdir {{.OUTPUT_DIR}} -builddir {{.ROOT_DIR}}/build/appimage
+ vars:
+ APP_NAME: '{{.APP_NAME}}'
+ APP_BINARY: '../../bin/{{.APP_NAME}}'
+ ICON: '../appicon.png'
+ DESKTOP_FILE: '{{.APP_NAME}}.desktop'
+ OUTPUT_DIR: '../../bin'
+
+ create:deb:
+ summary: Creates a deb package
+ deps:
+ - task: build
+ vars:
+ PRODUCTION: "true"
+ cmds:
+ - task: generate:dotdesktop
+ - task: generate:deb
+
+ create:rpm:
+ summary: Creates a rpm package
+ deps:
+ - task: build
+ vars:
+ PRODUCTION: "true"
+ cmds:
+ - task: generate:dotdesktop
+ - task: generate:rpm
+
+ create:aur:
+ summary: Creates a arch linux packager package
+ deps:
+ - task: build
+ vars:
+ PRODUCTION: "true"
+ cmds:
+ - task: generate:dotdesktop
+ - task: generate:aur
+
+ generate:deb:
+ summary: Creates a deb package
+ cmds:
+ - wails3 tool package -name {{.APP_NAME}} -format deb -config ./build/nfpm/nfpm.yaml
+
+ generate:rpm:
+ summary: Creates a rpm package
+ cmds:
+ - wails3 tool package -name {{.APP_NAME}} -format rpm -config ./build/nfpm/nfpm.yaml
+
+ generate:aur:
+ summary: Creates a arch linux packager package
+ cmds:
+ - wails3 tool package -name {{.APP_NAME}} -format arch -config ./build/nfpm/nfpm.yaml
+
+ generate:dotdesktop:
+ summary: Generates a `.desktop` file
+ dir: build
+ cmds:
+ - mkdir -p {{.ROOT_DIR}}/build/nfpm/bin
+ - wails3 generate .desktop -name "{{.APP_NAME}}" -exec "{{.EXEC}}" -icon "{{.ICON}}" -outputfile {{.ROOT_DIR}}/build/{{.APP_NAME}}.desktop -categories "{{.CATEGORIES}}"
+ - cp {{.ROOT_DIR}}/build/{{.APP_NAME}}.desktop {{.ROOT_DIR}}/build/nfpm/bin/{{.APP_NAME}}.desktop
+ vars:
+ APP_NAME: '{{.APP_NAME}}'
+ EXEC: '{{.APP_NAME}}'
+ ICON: 'appicon'
+ CATEGORIES: 'Network;InstantMessaging;Chat;'
+ OUTPUTFILE: '{{.ROOT_DIR}}/build/{{.APP_NAME}}.desktop'
+
+ run:
+ cmds:
+ - '{{.BIN_DIR}}/{{.APP_NAME}}'
diff --git a/desktop/build/Taskfile.windows.yml b/desktop/build/Taskfile.windows.yml
new file mode 100644
index 0000000..505896a
--- /dev/null
+++ b/desktop/build/Taskfile.windows.yml
@@ -0,0 +1,62 @@
+version: '3'
+
+includes:
+ common: Taskfile.common.yml
+
+tasks:
+ build:
+ summary: Builds the application for Windows
+ deps:
+ #- task: common:go:mod:tidy
+ #- task: common:build:frontend
+ #- task: common:generate:icons
+ - task: generate:syso
+ cmds:
+ - MAUTRIX_VERSION=$(cat go.mod | grep 'maunium.net/go/mautrix ' | awk '{ print $2 }')
+ - GO_LDFLAGS="-s -w -H windowsgui -X go.mau.fi/gomuks/version.Tag=$CI_COMMIT_TAG -X go.mau.fi/gomuks/version.Commit=$CI_COMMIT_SHA -X 'go.mau.fi/gomuks/version.BuildTime=`date -Iseconds`' -X 'maunium.net/go/mautrix.GoModVersion=$MAUTRIX_VERSION'"
+ - go build {{.BUILD_FLAGS}} -ldflags "$GO_LDFLAGS" -o {{.BIN_DIR}}/{{.APP_NAME}}.exe
+ - cmd: powershell Remove-item *.syso
+ platforms: [windows]
+ - cmd: rm -f *.syso
+ platforms: [linux, darwin]
+ vars:
+ BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath{{else}}-gcflags=all="-l"{{end}}'
+ env:
+ GOOS: windows
+ CGO_ENABLED: 1
+ GOARCH: '{{.ARCH | default ARCH}}'
+ PRODUCTION: '{{.PRODUCTION | default "false"}}'
+
+ package:
+ summary: Packages a production build of the application into a `.exe` bundle
+ cmds:
+ - task: build
+ vars:
+ PRODUCTION: "true"
+ #cmds:
+ # - task: create:nsis:installer
+
+ generate:syso:
+ summary: Generates Windows `.syso` file
+ dir: build
+ cmds:
+ - wails3 generate syso -arch {{.ARCH}} -icon icon.ico -manifest wails.exe.manifest -info info.json -out ../wails_windows_{{.ARCH}}.syso
+ vars:
+ ARCH: '{{.ARCH | default ARCH}}'
+
+ create:nsis:installer:
+ summary: Creates an NSIS installer
+ dir: build/nsis
+ deps:
+ - task: build
+ vars:
+ PRODUCTION: "true"
+ cmds:
+ - makensis -DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}\{{.BIN_DIR}}\{{.APP_NAME}}.exe" project.nsi
+ vars:
+ ARCH: '{{.ARCH | default ARCH}}'
+ ARG_FLAG: '{{if eq .ARCH "amd64"}}AMD64{{else}}ARM64{{end}}'
+
+ run:
+ cmds:
+ - '{{.BIN_DIR}}\\{{.APP_NAME}}.exe'
diff --git a/desktop/build/config.yml b/desktop/build/config.yml
new file mode 100644
index 0000000..0936770
--- /dev/null
+++ b/desktop/build/config.yml
@@ -0,0 +1,60 @@
+# This file contains the configuration for this project.
+# When you update `info` or `fileAssociations`, run `wails3 task common:update:build-assets` to update the assets.
+# Note that this will overwrite any changes you have made to the assets.
+version: '3'
+
+info:
+ companyName: ""
+ productName: "gomuks desktop"
+ productIdentifier: "fi.mau.gomuks.desktop"
+ description: "A Matrix client written in Go and React"
+ copyright: "© 2024, gomuks authors"
+ comments: ""
+ version: "0.4.0"
+
+# Dev mode configuration
+dev_mode:
+ root_path: .
+ log_level: warn
+ debounce: 1000
+ ignore:
+ dir:
+ - .git
+ - node_modules
+ - frontend
+ - bin
+ file:
+ - .DS_Store
+ - .gitignore
+ - .gitkeep
+ watched_extension:
+ - "*.go"
+ git_ignore: true
+ executes:
+ - cmd: wails3 task common:install:frontend:deps
+ type: once
+ - cmd: wails3 task common:dev:frontend
+ type: background
+ - cmd: go mod tidy
+ type: blocking
+ - cmd: wails3 task build
+ type: blocking
+ - cmd: wails3 task run
+ type: primary
+
+# File Associations
+# More information at: https://v3alpha.wails.io/noit/done/yet
+fileAssociations:
+# - ext: wails
+# name: Wails
+# description: Wails Application File
+# iconName: wailsFileIcon
+# role: Editor
+# - ext: jpg
+# name: JPEG
+# description: Image File
+# iconName: jpegFileIcon
+# role: Editor
+
+# Other data
+other: []
diff --git a/desktop/build/devmode.config.yaml b/desktop/build/devmode.config.yaml
deleted file mode 100644
index 1a441f2..0000000
--- a/desktop/build/devmode.config.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-config:
- root_path: .
- log_level: warn
- debounce: 1000
- ignore:
- dir:
- - .git
- - node_modules
- - frontend
- - bin
- file:
- - .DS_Store
- - .gitignore
- - .gitkeep
- watched_extension:
- - "*.go"
- git_ignore: true
- executes:
- - cmd: wails3 task install:frontend:deps
- type: once
- - cmd: wails3 task dev:frontend
- type: background
- - cmd: go mod tidy
- type: blocking
- - cmd: wails3 task build
- type: blocking
- - cmd: wails3 task run
- type: primary
diff --git a/desktop/build/icon.ico b/desktop/build/icon.ico
index 1980bab..7b3291f 100644
Binary files a/desktop/build/icon.ico and b/desktop/build/icon.ico differ
diff --git a/desktop/build/icons.icns b/desktop/build/icons.icns
index cfb6cf8..e76dfa0 100644
Binary files a/desktop/build/icons.icns and b/desktop/build/icons.icns differ
diff --git a/desktop/build/info.json b/desktop/build/info.json
index b60c867..862bfe7 100644
--- a/desktop/build/info.json
+++ b/desktop/build/info.json
@@ -6,8 +6,8 @@
"0000": {
"ProductVersion": "0.4.0",
"CompanyName": "",
- "FileDescription": "",
- "LegalCopyright": "© 2024, Tulir Asokan",
+ "FileDescription": "A Matrix client written in Go and React",
+ "LegalCopyright": "© 2024, gomuks authors",
"ProductName": "gomuks desktop",
"Comments": ""
}
diff --git a/desktop/build/nfpm/nfpm.yaml b/desktop/build/nfpm/nfpm.yaml
new file mode 100644
index 0000000..2b57384
--- /dev/null
+++ b/desktop/build/nfpm/nfpm.yaml
@@ -0,0 +1,50 @@
+# Feel free to remove those if you don't want/need to use them.
+# Make sure to check the documentation at https://nfpm.goreleaser.com
+#
+# The lines below are called `modelines`. See `:help modeline`
+
+name: "gomuks-desktop"
+arch: ${GOARCH}
+platform: "linux"
+version: "0.4.0"
+section: "default"
+priority: "extra"
+maintainer: Tulir Asokan
+description: "A Matrix client written in Go and React"
+vendor: ""
+homepage: "https://wails.io"
+license: "MIT"
+release: "1"
+
+contents:
+ - src: "./bin/gomuks-desktop"
+ dst: "/usr/local/bin/gomuks-desktop"
+ - src: "./build/appicon.png"
+ dst: "/usr/share/icons/hicolor/128x128/apps/gomuks-desktop.png"
+ - src: "./build/gomuks-desktop.desktop"
+ dst: "/usr/share/applications/gomuks-desktop.desktop"
+
+depends:
+ - gtk3
+ - libwebkit2gtk
+
+# replaces:
+# - foobar
+# provides:
+# - bar
+# depends:
+# - gtk3
+# - libwebkit2gtk
+recommends:
+ - ffmpeg
+# suggests:
+# - something-else
+# conflicts:
+# - not-foo
+# - not-bar
+# changelog: "changelog.yaml"
+# scripts:
+# preinstall: ./build/nfpm/scripts/preinstall.sh
+# postinstall: ./build/nfpm/scripts/postinstall.sh
+# preremove: ./build/nfpm/scripts/preremove.sh
+# postremove: ./build/nfpm/scripts/postremove.sh
diff --git a/desktop/build/nfpm/scripts/postinstall.sh b/desktop/build/nfpm/scripts/postinstall.sh
new file mode 100644
index 0000000..a9bf588
--- /dev/null
+++ b/desktop/build/nfpm/scripts/postinstall.sh
@@ -0,0 +1 @@
+#!/bin/bash
diff --git a/desktop/build/nfpm/scripts/postremove.sh b/desktop/build/nfpm/scripts/postremove.sh
new file mode 100644
index 0000000..a9bf588
--- /dev/null
+++ b/desktop/build/nfpm/scripts/postremove.sh
@@ -0,0 +1 @@
+#!/bin/bash
diff --git a/desktop/build/nfpm/scripts/preinstall.sh b/desktop/build/nfpm/scripts/preinstall.sh
new file mode 100644
index 0000000..a9bf588
--- /dev/null
+++ b/desktop/build/nfpm/scripts/preinstall.sh
@@ -0,0 +1 @@
+#!/bin/bash
diff --git a/desktop/build/nfpm/scripts/preremove.sh b/desktop/build/nfpm/scripts/preremove.sh
new file mode 100644
index 0000000..a9bf588
--- /dev/null
+++ b/desktop/build/nfpm/scripts/preremove.sh
@@ -0,0 +1 @@
+#!/bin/bash
diff --git a/desktop/build/nsis/project.nsi b/desktop/build/nsis/project.nsi
index 6258611..f648290 100644
--- a/desktop/build/nsis/project.nsi
+++ b/desktop/build/nsis/project.nsi
@@ -20,10 +20,10 @@ Unicode true
## The following information is taken from the wails_tools.nsh file, but they can be overwritten here.
####
## !define INFO_PROJECTNAME "my-project" # Default "gomuks-desktop"
-## !define INFO_COMPANYNAME "My Company" # Default "My Company"
-## !define INFO_PRODUCTNAME "My Product Name" # Default "My Product"
+## !define INFO_COMPANYNAME "My Company" # Default ""
+## !define INFO_PRODUCTNAME "My Product Name" # Default "gomuks desktop"
## !define INFO_PRODUCTVERSION "1.0.0" # Default "0.1.0"
-## !define INFO_COPYRIGHT "(c) Now, My Company" # Default "© now, My Company"
+## !define INFO_COPYRIGHT "(c) Now, My Company" # Default "© gomuks authors"
###
## !define PRODUCT_EXECUTABLE "Application.exe" # Default "${INFO_PROJECTNAME}.exe"
## !define UNINST_KEY_NAME "UninstKeyInRegistry" # Default "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
@@ -91,6 +91,8 @@ Section
CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
CreateShortCut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
+ !insertmacro wails.associateFiles
+
!insertmacro wails.writeUninstaller
SectionEnd
@@ -104,5 +106,7 @@ Section "uninstall"
Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk"
Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk"
+ !insertmacro wails.unassociateFiles
+
!insertmacro wails.deleteUninstaller
SectionEnd
diff --git a/desktop/build/nsis/wails_tools.nsh b/desktop/build/nsis/wails_tools.nsh
index 9a3fce8..f67f2bd 100644
--- a/desktop/build/nsis/wails_tools.nsh
+++ b/desktop/build/nsis/wails_tools.nsh
@@ -8,16 +8,16 @@
!define INFO_PROJECTNAME "gomuks-desktop"
!endif
!ifndef INFO_COMPANYNAME
- !define INFO_COMPANYNAME "My Company"
+ !define INFO_COMPANYNAME ""
!endif
!ifndef INFO_PRODUCTNAME
- !define INFO_PRODUCTNAME "My Product"
+ !define INFO_PRODUCTNAME "gomuks desktop"
!endif
!ifndef INFO_PRODUCTVERSION
- !define INFO_PRODUCTVERSION "0.1.0"
+ !define INFO_PRODUCTVERSION "0.4.0"
!endif
!ifndef INFO_COPYRIGHT
- !define INFO_COPYRIGHT "© now, My Company"
+ !define INFO_COPYRIGHT "© 2024, gomuks authors"
!endif
!ifndef PRODUCT_EXECUTABLE
!define PRODUCT_EXECUTABLE "${INFO_PROJECTNAME}.exe"
@@ -177,3 +177,36 @@ RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}"
SetDetailsPrint both
ok:
!macroend
+
+# Copy of APP_ASSOCIATE and APP_UNASSOCIATE macros from here https://gist.github.com/nikku/281d0ef126dbc215dd58bfd5b3a5cd5b
+!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
+ ; Backup the previously associated file class
+ ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" ""
+ WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"
+
+ WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}"
+
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" "open"
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}`
+!macroend
+
+!macro APP_UNASSOCIATE EXT FILECLASS
+ ; Backup the previously associated file class
+ ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" `${FILECLASS}_backup`
+ WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "$R0"
+
+ DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}`
+!macroend
+
+!macro wails.associateFiles
+ ; Create file associations
+
+!macroend
+
+!macro wails.unassociateFiles
+ ; Delete app associations
+
+!macroend
diff --git a/desktop/build/wails.exe.manifest b/desktop/build/wails.exe.manifest
index 144b94e..6749711 100644
--- a/desktop/build/wails.exe.manifest
+++ b/desktop/build/wails.exe.manifest
@@ -1,6 +1,6 @@
-
+
diff --git a/desktop/main.go b/desktop/main.go
index 2046017..cab771b 100644
--- a/desktop/main.go
+++ b/desktop/main.go
@@ -123,7 +123,7 @@ func main() {
ch := &CommandHandler{Gomuks: gmx, Ctx: cmdCtx}
app := application.New(application.Options{
Name: "gomuks-desktop",
- Description: "A Matrix client written in Go",
+ Description: "A Matrix client written in Go and React",
Services: []application.Service{
application.NewService(
&PointableHandler{gmx.CreateAPIRouter()},