diff --git a/machines/AMD-Workstation/default.nix b/machines/AMD-Workstation/default.nix index 5d9ecb8..633f0f6 100644 --- a/machines/AMD-Workstation/default.nix +++ b/machines/AMD-Workstation/default.nix @@ -1,7 +1,7 @@ { inputs, lib, ... }: { imports = [ ./hardware-configuration.nix - inputs.self.nixosRoles.desktop + inputs.self.nixosRoles.workstation ]; deviceSpecific.devInfo = { diff --git a/profiles/overlay.nix b/profiles/overlay.nix index 2f4a321..e6a2e3b 100644 --- a/profiles/overlay.nix +++ b/profiles/overlay.nix @@ -14,22 +14,25 @@ with lib; { nixpkgs.overlays = [ # (import "${inputs.nixpkgs-mozilla}/lib-overlay.nix") # (import "${inputs.nixpkgs-mozilla}/rust-overlay.nix") + inputs.android-nixpkgs.overlay (self: super: rec { inherit inputs; - youtube-to-mpv = pkgs.callPackage ./packages/youtube-to-mpv.nix { term = config.defaultApplications.term.cmd; }; - i3lock-fancy-rapid = pkgs.callPackage ./packages/i3lock-fancy-rapid.nix { }; - xonar-fp = pkgs.callPackage ./packages/xonar-fp.nix { }; - ibm-plex-powerline = pkgs.callPackage ./packages/ibm-plex-powerline.nix { }; + android-emulator = self.callPackage ./packages/android-emulator.nix { }; bibata-cursors = pkgs.callPackage ./packages/bibata-cursors.nix { }; - multimc = pkgs.qt5.callPackage ./packages/multimc.nix { multimc-repo = inputs.multimc-cracked; }; ceserver = pkgs.callPackage ./packages/ceserver.nix { }; + i3lock-fancy-rapid = pkgs.callPackage ./packages/i3lock-fancy-rapid.nix { }; + ibm-plex-powerline = pkgs.callPackage ./packages/ibm-plex-powerline.nix { }; mpris-ctl = pkgs.callPackage ./packages/mpris-ctl.nix { }; - tidal-dl = pkgs.callPackage ./packages/tidal-dl.nix { }; + multimc = pkgs.qt5.callPackage ./packages/multimc.nix { multimc-repo = inputs.multimc-cracked; }; reshade-shaders = pkgs.callPackage ./packages/reshade-shaders.nix { }; + tidal-dl = pkgs.callPackage ./packages/tidal-dl.nix { }; vscode = master.vscode; vscode-fhs = master.vscode-fhs; + xonar-fp = pkgs.callPackage ./packages/xonar-fp.nix { }; + youtube-to-mpv = pkgs.callPackage ./packages/youtube-to-mpv.nix { term = config.defaultApplications.term.cmd; }; + vivaldi = master.vivaldi.overrideAttrs (old: rec { postInstall = '' substituteInPlace "$out"/bin/vivaldi \ @@ -37,7 +40,7 @@ with lib; { --enable-zero-copy --use-gl=desktop --enable-features=VaapiVideoDecoder --disable-features=UseOzonePlatform "$@"' ''; }); - nix-direnv = inputs.nix-direnv.defaultPackage.${system}; + # nix-direnv = inputs.nix-direnv.defaultPackage.${system}; wine = super.wineWowPackages.staging; qbittorrent = super.qbittorrent.overrideAttrs (old: rec { version = "enchanced-edition"; diff --git a/profiles/packages/android-emulator.nix b/profiles/packages/android-emulator.nix new file mode 100644 index 0000000..38e6b1a --- /dev/null +++ b/profiles/packages/android-emulator.nix @@ -0,0 +1,128 @@ +{ stdenv, lib, runtimeShell +, name ? "android-emulator", sdk ? null, deviceType ? "" +, platformVersion ? "30", systemImageType ? "default", abiVersion ? "x86_64" +, enableGPU ? false, extraAVDFiles ? [] +, app ? null, package ? null, activity ? null +, avdHomeDir ? null +}: + +stdenv.mkDerivation { + inherit name; + + buildCommand = '' + mkdir -p $out/bin + + cat > $out/bin/${name}-run << "EOF" + #!${runtimeShell} -e + + # We need a TMPDIR + if [ "$TMPDIR" = "" ] + then + export TMPDIR=/tmp + fi + + ${if avdHomeDir == null then '' + # Store the virtual devices somewhere else, instead of polluting a user's HOME directory + export ANDROID_SDK_HOME=$(mktemp -d $TMPDIR/nix-android-vm-XXXX) + '' else '' + mkdir -p "${avdHomeDir}" + export ANDROID_SDK_HOME="${avdHomeDir}" + ''} + + # We need to specify the location of the Android SDK root folder + export ANDROID_SDK_ROOT=${sdk} + + # We have to look for a free TCP port + + echo "Looking for a free TCP port in range 5554-5584" >&2 + + for i in $(seq 5554 2 5584) + do + if [ -z "$(${sdk}/platform-tools/adb devices | grep emulator-$i)" ] + then + port=$i + break + fi + done + + if [ -z "$port" ] + then + echo "Unfortunately, the emulator port space is exhausted!" >&2 + exit 1 + else + echo "We have a free TCP port: $port" >&2 + fi + + export ANDROID_SERIAL="emulator-$port" + + # Create a virtual android device for testing if it does not exist + # ${sdk}/cmdline-tools/latest/bin/avdmanager list target + + if [ "$(${sdk}/cmdline-tools/latest/bin/avdmanager list avd | grep 'Name: ${name}')" = "" ] + then + # Create a virtual android device + yes "" | ${sdk}/cmdline-tools/latest/bin/avdmanager create avd -n "${name}" -k "system-images;android-${platformVersion};${systemImageType};${abiVersion}" -d "${deviceType}" $NIX_ANDROID_AVD_FLAGS + + # fix wrong sdk path + sed -i "s|image.sysdir.1.\+|image.sysdir.1=${sdk}/system-images/android-${platformVersion}/${systemImageType}/${abiVersion}|" "$ANDROID_SDK_HOME/.android/avd/${name}.avd/config.ini" + + ${lib.optionalString enableGPU '' + # Enable GPU acceleration + echo "hw.gpu.enabled=yes" >> "$ANDROID_SDK_HOME/.android/avd/${name}.avd/config.ini" + ''} + + ${lib.concatMapStrings (extraAVDFile: '' + ln -sf ${extraAVDFile} "$ANDROID_SDK_HOME/.android/avd/${name}.avd" + '') extraAVDFiles} + fi + + # Launch the emulator + ${sdk}/emulator/emulator -avd "${name}" -no-boot-anim -port $port $NIX_ANDROID_EMULATOR_FLAGS & + + # Wait until the device has completely booted + echo "Waiting until the emulator has booted the device and the package manager is ready..." >&2 + + ${sdk}/platform-tools/adb -s emulator-$port wait-for-device + + echo "Device state has been reached" >&2 + + while [ -z "$(${sdk}/platform-tools/adb -s emulator-$port shell getprop dev.bootcomplete | grep 1)" ] + do + sleep 5 + done + + echo "dev.bootcomplete property is 1" >&2 + + #while [ -z "$(${sdk}/platform-tools/adb -s emulator-$port shell getprop sys.boot_completed | grep 1)" ] + #do + #sleep 5 + #done + + #echo "sys.boot_completed property is 1" >&2 + + echo "ready" >&2 + + ${lib.optionalString (app != null) '' + # Install the App through the debugger, if it has not been installed yet + + if [ -z "${package}" ] || [ "$(${sdk}/platform-tools/adb -s emulator-$port shell pm list packages | grep package:${package})" = "" ] + then + if [ -d "${app}" ] + then + appPath="$(echo ${app}/*.apk)" + else + appPath="${app}" + fi + + ${sdk}/platform-tools/adb -s emulator-$port install "$appPath" + fi + + # Start the application + ${lib.optionalString (package != null && activity != null) '' + ${sdk}/platform-tools/adb -s emulator-$port shell am start -a android.intent.action.MAIN -n ${package}/${activity} + ''} + ''} + EOF + chmod +x $out/bin/${name}-run + ''; +} diff --git a/profiles/workspace/development/flutter.nix b/profiles/workspace/development/flutter.nix new file mode 100644 index 0000000..8bba4d8 --- /dev/null +++ b/profiles/workspace/development/flutter.nix @@ -0,0 +1,51 @@ +{ config, lib, pkgs, inputs, ... }: { + home-manager.users.alukard = rec { + imports = [ inputs.android-nixpkgs.hmModule ]; + + android-sdk = { + enable = true; + path = "${config.home-manager.users.alukard.home.homeDirectory}/.android/sdk"; + packages = sdk: with sdk; [ + build-tools-31-0-0 + build-tools-29-0-2 + cmdline-tools-latest + patcher-v4 + platform-tools + platforms-android-30 + + + emulator + system-images-android-30-google-apis-x86-64 + ]; + }; + + home.sessionVariables = { + ANDROID_HOME = android-sdk.path; + ANDROID_SDK_ROOT = android-sdk.path; + JAVA_HOME = pkgs.jdk11.home; + }; + + home.packages = let + android-emulator = pkgs.android-emulator.override { + name = "flutter-emulator"; + avdHomeDir = config.home-manager.users.alukard.home.homeDirectory; + sdk = android-sdk.path; + platformVersion = "30"; + systemImageType = "google_apis"; + abiVersion = "x86_64"; + deviceType = "pixel"; + # enableGPU = true; + }; + in [ + pkgs.flutter + android-emulator + # jdk11 + ]; + }; + + environment.sessionVariables = { + ANDROID_HOME = config.home-manager.users.alukard.android-sdk.path; + ANDROID_SDK_ROOT = config.home-manager.users.alukard.android-sdk.path; + JAVA_HOME = pkgs.jdk11.home; + }; +} \ No newline at end of file diff --git a/roles/default.nix b/roles/default.nix index 1eb2b24..8672710 100644 --- a/roles/default.nix +++ b/roles/default.nix @@ -2,4 +2,5 @@ server = ./server.nix; desktop = ./desktop.nix; base = ./base.nix; + workstation = ./workstation.nix; } diff --git a/roles/workstation.nix b/roles/workstation.nix new file mode 100644 index 0000000..8c71589 --- /dev/null +++ b/roles/workstation.nix @@ -0,0 +1,7 @@ +{ inputs, ... }: { + imports = with inputs.self.nixosModules; with inputs.self.nixosProfiles; [ + ./desktop.nix + + flutter + ]; +}