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()},