Skip to content

Instantly share code, notes, and snippets.

@cidkidnix
Last active February 23, 2024 19:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save cidkidnix/a9892434f926c334524eb4c977f4feb3 to your computer and use it in GitHub Desktop.
Save cidkidnix/a9892434f926c334524eb4c977f4feb3 to your computer and use it in GitHub Desktop.
self: super: super.lib.optionalAttrs (super.stdenv.targetPlatform.isAarch64) rec {
#-------#
# Box64 #
#-------#
mapNamesToPackage = {
"libX11" = super.xorg.libX11;
"libXcursor" = super.xorg.libXcursor;
"libXi" = super.xorg.libXi;
"libXrandr" = super.xorg.libXrandr;
"libXxf86vm" = super.xorg.libXxf86vm;
"libxcb" = super.xorg.libxcb;
#"libxkbcommon" = super.xorg.libxkbcommon;
"libXext" = super.xorg.libXext;
"glu" = super.libglvnd;
"gtk+3" = super.gtk3;
"libXScrnSaver" = super.xorg.libXScrnSaver;
"libXcomposite" = super.xorg.libXcomposite;
"libXdamage" = super.xorg.libXdamage;
"libXfixes" = super.xorg.libXfixes;
"libXrender" = super.xorg.libXrender;
"libXtst" = super.xorg.libXtst;
"util-linux-minimal" = super.libuuid;
"libxshmfence" = super.xorg.libxshmfence;
"git-minimal" = super.gitMinimal;
"libXinerama" = super.xorg.libXinerama;
"libXau" = super.xorg.libXau;
"libXdmcp" = super.xorg.libXdmcp;
"adwaita-icon-theme" = super.gnome.adwaita-icon-theme;
"libdbusmenu-glib" = super.libdbusmenu;
"systemd-minimal-libs" = super.systemdLibs;
};
box64 = super.box64.overrideAttrs (old: {
version = "git";
cmakeFlags = (old.cmakeFlags or []) ++ [
"-DADLINK=1"
];
doCheck = false;
patches = [];
src = super.fetchFromGitHub {
owner = "ptitSeb";
repo = "box64";
rev = "239ef8951d3a3620becbf1e2382cc5559aa66ffb";
sha256 = "sha256-bsVDo5KF9B7a1zfh/lBq2Eh5+zg1qRA2OkvndzawkC4=";
};
});
programNames = a: builtins.map (b: b.pname) (a.buildInputs ++ (a.runtimeDependencies or []) ++ (a.propogatedBuildInputs or []) ++ (super.wrapGAppsHook.propogatedBuildInputs or []));
toNativePackages = pkg: map (a: let
package = if mapNamesToPackage ? "${a}" then
mapNamesToPackage."${a}".out
else super."${a}".out;
in package) (programNames pkg);
makeBoxPath = { program, extraDeps ? [] }: let
nativePackages = toNativePackages program;
allDeps = nativePackages ++ extraDeps;
in super.runCommandNoCC "makeLibraryPath" {} (''
set -eux
mkdir -p $out/lib
'' + (builtins.concatStringsSep "\n" (map (v: ''
chmod -R +w $out/lib
if [[ -d ${v}/lib ]]; then
cp -r ${v}/lib/* $out/lib
else
echo "No Library Dir!"
fi
'' + ''
if [[ -f $out/lib/libgcc_s.so.1 ]]; then
chmod 0555 $out/lib/libgcc_s.so.1
else
echo "No libgcc_s.so.1!"
fi
'') allDeps)));
wrapX86Programs = { program, extraDeps ? [], loglevel ? 0 }: let
dir = builtins.readDir "${program.outPath}/bin";
boxPath = makeBoxPath {
inherit program extraDeps;
};
wrappedProgramList = map (a: let
box64Program = super.writeShellScriptBin "${a}-box64" ''
export LD_LIBRARY_PATH="${boxPath}/lib"
export BOX64_LD_LIBRARY_PATH="${self.nixpkgs_x86.openssl.out}/lib"
export BOX64_BASH=${super.pkgsCross.gnu64.bash}/bin/sh
export BOX64_LOG=${toString loglevel}
export ARGS=$@
echo $ARGS
if [[ -f "${program.outPath}/bin/.${program.pname}-wrapped" ]]; then
export COMMAND=${program.outPath}/bin/.${a}-wrapped
else
export COMMAND=${program.outPath}/bin/${a}
fi
${box64}/bin/box64 $COMMAND $ARGS
'';
in box64Program) (builtins.attrNames dir);
programOutPaths = map (a: a.outPath) wrappedProgramList;
in super.runCommandNoCC "${program.pname or program.name}-x86-wrapped" {} (''
set -eux
mkdir -p $out/bin
'' +
(builtins.concatStringsSep "\n"
(map
(v: "cp -r ${v}/bin $out"
) programOutPaths)));
installAllBinaries = p: let
dir = builtins.readDir "${p.outPath}/bin";
in map (v: {
name = "${v}";
path = "bin/${v}";
}) (builtins.attrNames dir);
wrapX64Programs = {
program,
global ? {},
binaries ? [{}],
loglevel ? 0,
nobanner ? 1,
makeDesktopFiles ? false
}: let
allNativeDeps = toNativePackages program;
globalDeps = global.extraDeps or [];
globalX64Deps = global.extraX64Deps or [];
makeBinaries = map (a: let
name = a.name;
path = a.path or "bin/${name}";
extraDeps = a.extraDeps or [];
extraX64Deps = a.extraX64Deps or [];
extraArgs = builtins.concatStringsSep "" (a.extraArgs or []);
extraScript = a.extraScript or "";
libraryPath = super.lib.makeLibraryPath (extraDeps ++ allNativeDeps ++ globalDeps);
box64LibraryPath = super.lib.makeLibraryPath (extraX64Deps ++ globalX64Deps);
in super.writeShellScriptBin "${name}" ''
export LD_LIBRARY_PATH=${libraryPath}
export BOX64_LD_LIBRARY_PATH=${box64LibraryPath}
export BOX64_LOG=${toString loglevel}
export BOX64_NOBANNER=${toString nobanner}
${extraScript}
${box64}/bin/box64 ${program.outPath}/${path} ${extraArgs} "$@"
'') binaries;
in super.runCommandNoCC "${program.pname}-wrapped-box64" {} (''
set -eux
mkdir -p $out/bin
mkdir -p $out/share/applications
${builtins.concatStringsSep "\n" (map (v: "cp -r ${v}/bin $out") makeBinaries)}
'' + super.lib.optionalString (makeDesktopFiles) ''
for i in $out/bin/*; do
local name=$(basename $i)
echo -e "[Desktop Entry]\nName=''${name^}\nType=Application\nExec=$out/bin/$name" > $out/share/applications/$name.desktop
done
'');
nixpkgs_x86 = import super.path { system = "x86_64-linux"; config.allowUnfree = true; };
mesa-demos_x64 = self.wrapX64Programs rec {
program = self.nixpkgs_x86.mesa-demos;
binaries = self.installAllBinaries program;
};
wine64_x64 = self.wrapX64Programs rec {
program = self.nixpkgs_x86.wine64Packages.stable;
global = {
extraDeps = with super; [
xz.out
fontconfig.lib
expat
cups.lib
dbus.lib
libcap.lib
];
};
binaries = self.installAllBinaries program;
};
clonehero_x64 = wrapX64Programs {
makeDesktopFiles = true;
program = self.nixpkgs_x86.clonehero.overrideAttrs (old: {
src = builtins.fetchTarball {
url = "https://github.com/clonehero-game/releases/releases/download/V1.0.0.4080/CloneHero-linux.tar.xz";
sha256 = "sha256:01jkga3wjdhh0hi5dkmx57v2w296bzd5q5b8vdyadca4k5kymhbz";
};
});
loglevel = 1;
global = {
extraDeps = with super; [
xorg.libX11
gcc.cc.libgcc
dbus.lib
libGL
libbsd
];
};
binaries = [
{
name = "clonehero";
}
];
};
spotify_x64 = self.wrapX64Programs {
program = self.nixpkgs_x86.spotify-unwrapped;
makeDesktopFiles = true;
binaries = [
{
name = "spotify";
path = "share/spotify/.spotify-wrapped";
extraDeps = with super; [
avahi
libdrm
glib.out
cups.lib
xorg.libICE
atkmm
xorg.libSM
gtk3
cairo
alsa-lib
pango
xorg.libX11
xorg.libXext
curlWithGnuTls.out
libgccjit
mesa
nss.out
libudev0-shim
pulseaudio
libnotify
pciutils
vulkan-tools
];
extraX64Deps = with self.nixpkgs_x86; [
gcc.cc.libgcc
];
}
];
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment