diff --git a/README.md b/README.md index da62a1f..ae985ac 100644 --- a/README.md +++ b/README.md @@ -471,6 +471,70 @@ The installer can be run multiple times. To update your installation of WinApps: 2. Pull the latest changes from the WinApps GitHub repository. 3. Re-install WinApps using the WinApps installer. +## Installation using Nix + +First, follow Step 1 of the normal installation guide to create your VM. +Then, install WinApps according to the following instructions. + +After installation, it will be available under `winapps`, with the installer being available under `winapps-setup` +and the optional launcher being available under `winapps-launcher.` + +### Using standalone Nix + +First, make sure Flakes and the `nix` command are enabled. +In your `~/.config/nix/nix.conf`: +``` +experimental-features = nix-command flakes +``` + +```bash +nix profile install github:winapps-org/winapps#winapps +nix profile install github:winapps-org/winapps#winapps-launcher # optional +``` + +### On NixOS using Flakes + +```nix +{ + description = "My configuration"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + winapps = { + url = ""github:winapps-org/winapps; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = { + nixpkgs, + winapps, + ... + }: { + nixosConfigurations.hostname = nixpkgs.lib.nixosSystem rec { + system = "x86_64-linux"; + + modules = [ + ./configuration.nix + ({pkgs, ...}: { + environment.systemPackages = [ + winapps.packages.${system}.winapps + winapps.packages.${system}.winapps-launcher # optional + ]; + }) + ]; + }; + }; +} +``` + +### On NixOS without Flakes + +[Flakes aren't real and they can't hurt you.](https://jade.fyi/blog/flakes-arent-real/). +See https://wiki.nixos.org/wiki/Flakes#Using_nix_flakes_with_NixOS on how to enable Flakes on your system. + + ## Star History diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b07995a --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1724819573, + "narHash": "sha256-GnR7/ibgIH1vhoy8cYdmXE6iyZqKqFxQSVkFgosBh6w=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "71e91c409d1e654808b2621f28a327acfdad8dc2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..596e431 --- /dev/null +++ b/flake.nix @@ -0,0 +1,24 @@ +{ + description = "WinApps Nix packages & NixOS module"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + nixpkgs, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem ( + system: let + pkgs = import nixpkgs {inherit system;}; + in { + formatter = pkgs.alejandra; + + packages.winapps = pkgs.callPackage ./packages/winapps {}; + packages.winapps-launcher = pkgs.callPackage ./packages/winapps-launcher {}; + } + ); +} diff --git a/packages/winapps-launcher/default.nix b/packages/winapps-launcher/default.nix new file mode 100644 index 0000000..0b1cece --- /dev/null +++ b/packages/winapps-launcher/default.nix @@ -0,0 +1,66 @@ +{ + stdenv, + lib, + fetchFromGitHub, + makeWrapper, + makeDesktopItem, + callPackage, + yad, + ... +}: let + rev = "eaa660d39bf3f49b136c98c87c35e3e12f118f8f"; + hash = "sha256-7lkx/O4dOdVqAPX6s2IkkM6Ggbzmz9sm++20BBeoUQ4="; +in + stdenv.mkDerivation rec { + pname = "winapps-launcher"; + version = "git+${rev}"; + + src = fetchFromGitHub { + owner = "winapps-org"; + repo = "WinApps-Launcher"; + + inherit rev hash; + }; + + nativeBuildInputs = [makeWrapper]; + buildInputs = [yad (callPackage ../winapps {})]; + + installPhase = '' + runHook preInstall + + mkdir -p $out + cp -r ./Icons $out/Icons + + sed -E -i \ + -e "$(printf "%s$out%s" 's|^declare -rx ICONS_PATH="./Icons"|declare -rx ICONS_PATH="' '/Icons"|')" \ + WinAppsLauncher.sh + + install -m755 -D WinAppsLauncher.sh $out/bin/winapps-launcher + install -Dm444 -T Icons/AppIcon.svg $out/share/pixmaps/winapps.svg + + wrapProgram $out/bin/winapps-launcher \ + --set LIBVIRT_DEFAULT_URI "qemu:///system" \ + --prefix PATH : "${lib.makeBinPath buildInputs}" + + runHook postInstall + ''; + + desktopItems = [ + (makeDesktopItem { + name = "winapps"; + exec = "winapps-launcher"; + icon = "winapps"; + comment = meta.description; + desktopName = "WinApps"; + categories = ["Utility"]; + }) + ]; + + meta = with lib; { + homepage = "https://github.com/winapps-org/WinApps-Launcher"; + description = "Graphical launcher for WinApps. Run Windows applications (including Microsoft 365 and Adobe Creative Cloud) on GNU/Linux with KDE, GNOME or XFCE, integrated seamlessly as if they were native to the OS. Wayland is currently unsupported."; + mainProgram = "winapps-launcher"; + platforms = platforms.linux; + license = licenses.gpl3; + }; + } diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix new file mode 100644 index 0000000..3f47542 --- /dev/null +++ b/packages/winapps/default.nix @@ -0,0 +1,72 @@ +{ + stdenv, + lib, + fetchFromGitHub, + makeWrapper, + freerdp3, + dialog, + libnotify, + netcat-gnu, + iproute2, + ... +}: let + rev = "feat-install-script"; # "9417382ae73d2ae5ad69d1c5c407e8b1e5f001dc"; + hash = "sha256-iasuufBu+DhulH/hj2uUaM/KzGO7241+PZXuujsT/qI="; +in + stdenv.mkDerivation rec { + pname = "winapps"; + version = "git+${rev}"; + + src = fetchFromGitHub { + owner = "winapps-org"; + repo = "winapps"; + + inherit rev hash; + }; + + nativeBuildInputs = [makeWrapper]; + buildInputs = [freerdp3 libnotify dialog netcat-gnu iproute2]; + + installPhase = '' + runHook preInstall + + patchShebangs install/inquirer.sh + + mkdir -p $out + mkdir -p $out/src + + cp -r ./ $out/src/ + + install -m755 -D bin/winapps $out/bin/winapps + install -m755 -D setup.sh $out/bin/winapps-setup + + sed -E -i \ + -e 's/grep -q -E "\\blibvirt\\b"/grep -q -E "\\blibvirtd\\b"/' \ + $out/bin/winapps + + sed -E -i \ + -e 's/grep -q -E "\\blibvirt\\b"/grep -q -E "\\blibvirtd\\b"/' \ + -e "$(printf "%s$out%s" 's|^readonly INQUIRER_PATH="./install/inquirer.sh"|readonly INQUIRER_PATH="' '/src/install/inquirer.sh"|')" \ + -e "$(printf "%s$out%s" 's|^readonly SYS_SOURCE_PATH="(.*?)"|readonly SYS_SOURCE_PATH="' '/src"|')" \ + -e "$(printf "%s$out%s" 's|^readonly USER_SOURCE_PATH="(.*?)"|readonly USER_SOURCE_PATH="' '/src"|')" \ + -e 's/\$SUDO git -C "\$SOURCE_PATH" pull --no-rebase//g' \ + -e 's|./setup.sh|winapps-setup|g' \ + $out/bin/winapps-setup + + for f in winapps-setup winapps; do + wrapProgram $out/bin/$f \ + --set LIBVIRT_DEFAULT_URI "qemu:///system" \ + --prefix PATH : "${lib.makeBinPath buildInputs}" + done + + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://github.com/winapps-org/winapps"; + description = "Run Windows applications (including Microsoft 365 and Adobe Creative Cloud) on GNU/Linux with KDE, GNOME or XFCE, integrated seamlessly as if they were native to the OS. Wayland is currently unsupported."; + mainProgram = "winapps"; + platforms = platforms.linux; + license = licenses.gpl3; + }; + }