новый файл: flake.lock
новый файл: flake.nix новый файл: pkgs/codesys2/default.nix новый файл: pkgs/codesys2/setup.iss новый файл: pkgs/codesys3/default.nix новый файл: pkgs/mfc42/default.nix новый файл: pkgs/mspaintxp/default.nix новый файл: pkgs/vcredist2019/default.nix
This commit is contained in:
commit
04398840c0
8 changed files with 411 additions and 0 deletions
27
flake.lock
generated
Normal file
27
flake.lock
generated
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1787814960,
|
||||||
|
"narHash": "sha256-PYZq1qzCJXC2zGI0mH07vrZBsw6DRBAOX0jN1pPtqOQ=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "c27cdad491a991b11ed731760aa2ef8db0cb0410",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
43
flake.nix
Normal file
43
flake.nix
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
{
|
||||||
|
description = "MS Paint Windows XP via Wine";
|
||||||
|
|
||||||
|
inputs.nixpkgs.url = "github:nixos/nixpkgs?ref=nixpkgs-unstable";
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{ self, nixpkgs }:
|
||||||
|
let
|
||||||
|
system = "x86_64-linux";
|
||||||
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
packages.${system} = rec {
|
||||||
|
default = mspaintxp;
|
||||||
|
|
||||||
|
mfc42 = pkgs.callPackage ./pkgs/mfc42 { };
|
||||||
|
|
||||||
|
mspaintxp = pkgs.callPackage ./pkgs/mspaintxp {
|
||||||
|
inherit mfc42;
|
||||||
|
exe = ./XP_mspaintxp.exe;
|
||||||
|
};
|
||||||
|
|
||||||
|
codesys2 = pkgs.callPackage ./pkgs/codesys2 {
|
||||||
|
src = ./pkgs/codesys2/installed.tar.xz;
|
||||||
|
};
|
||||||
|
|
||||||
|
vcredist2019 = pkgs.callPackage ./pkgs/vcredist2019 { };
|
||||||
|
|
||||||
|
codesys3 = pkgs.callPackage ./pkgs/codesys3 {
|
||||||
|
inherit vcredist2019;
|
||||||
|
src = ./pkgs/codesys3/prefix.tar.xz;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
devShells.${system}.default = pkgs.mkShell {
|
||||||
|
packages = [
|
||||||
|
pkgs.wine
|
||||||
|
pkgs.winetricks
|
||||||
|
self.packages.${system}.mspaintxp
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
47
pkgs/codesys2/default.nix
Normal file
47
pkgs/codesys2/default.nix
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
{
|
||||||
|
stdenv,
|
||||||
|
makeWrapper,
|
||||||
|
makeDesktopItem,
|
||||||
|
copyDesktopItems,
|
||||||
|
wine,
|
||||||
|
src,
|
||||||
|
}:
|
||||||
|
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
pname = "codesys2";
|
||||||
|
version = "2.3.8.1";
|
||||||
|
|
||||||
|
inherit src;
|
||||||
|
sourceRoot = ".";
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
makeWrapper
|
||||||
|
copyDesktopItems
|
||||||
|
];
|
||||||
|
|
||||||
|
desktopItems = [
|
||||||
|
(makeDesktopItem {
|
||||||
|
name = "codesys2";
|
||||||
|
desktopName = "CoDeSys 2";
|
||||||
|
genericName = "PLC Programming";
|
||||||
|
exec = "codesys2";
|
||||||
|
categories = [ "Development" ];
|
||||||
|
startupWMClass = "codesys.exe";
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
app=$out/share/codesys2
|
||||||
|
install -d $app
|
||||||
|
cp -r . $app/
|
||||||
|
|
||||||
|
makeWrapper ${wine}/bin/wine $out/bin/codesys2 \
|
||||||
|
--add-flags "$app/Codesys.exe"
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta.mainProgram = "codesys2";
|
||||||
|
}
|
||||||
70
pkgs/codesys2/setup.iss
Normal file
70
pkgs/codesys2/setup.iss
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
[InstallShield Silent]
|
||||||
|
Version=v6.00.000
|
||||||
|
File=Response File
|
||||||
|
[File Transfer]
|
||||||
|
OverwrittenReadOnly=NoToAll
|
||||||
|
[{07976ABB-1EBD-4A65-A7C7-155A0DC17173}-DlgOrder]
|
||||||
|
Dlg0={07976ABB-1EBD-4A65-A7C7-155A0DC17173}-MessageBox-0
|
||||||
|
Count=8
|
||||||
|
Dlg1={07976ABB-1EBD-4A65-A7C7-155A0DC17173}-SdWelcome-0
|
||||||
|
Dlg2={07976ABB-1EBD-4A65-A7C7-155A0DC17173}-SdAskDestPath-0
|
||||||
|
Dlg3={07976ABB-1EBD-4A65-A7C7-155A0DC17173}-SdComponentTree-0
|
||||||
|
Dlg4={07976ABB-1EBD-4A65-A7C7-155A0DC17173}-SdSelectFolder-0
|
||||||
|
Dlg5={07976ABB-1EBD-4A65-A7C7-155A0DC17173}-SdShowInfoList-0
|
||||||
|
Dlg6={07976ABB-1EBD-4A65-A7C7-155A0DC17173}-MessageBox-1
|
||||||
|
Dlg7={07976ABB-1EBD-4A65-A7C7-155A0DC17173}-SdFinish-0
|
||||||
|
[{07976ABB-1EBD-4A65-A7C7-155A0DC17173}-MessageBox-0]
|
||||||
|
Result=1
|
||||||
|
[{07976ABB-1EBD-4A65-A7C7-155A0DC17173}-SdWelcome-0]
|
||||||
|
Result=1
|
||||||
|
[{07976ABB-1EBD-4A65-A7C7-155A0DC17173}-SdAskDestPath-0]
|
||||||
|
szDir=C:\Program Files\3S Software
|
||||||
|
Result=1
|
||||||
|
[{07976ABB-1EBD-4A65-A7C7-155A0DC17173}-SdComponentTree-0]
|
||||||
|
szDir=C:\Program Files\3S Software
|
||||||
|
Ko_CoDeSys-type=string
|
||||||
|
Ko_CoDeSys-count=2
|
||||||
|
Ko_CoDeSys-0=Ko_CoDeSys\Neu InstallDialogue Object 1
|
||||||
|
Ko_CoDeSys-1=Ko_CoDeSys\Neu MediaRead 1
|
||||||
|
Ko_Communication\Ko_Gateway-type=string
|
||||||
|
Ko_Communication\Ko_Gateway-count=1
|
||||||
|
Ko_Communication\Ko_Gateway-0=Ko_Communication\Ko_Gateway\Ko_Gateway_ProgSys
|
||||||
|
Ko_Communication-type=string
|
||||||
|
Ko_Communication-count=2
|
||||||
|
Ko_Communication-0=Ko_Communication\Ko_Gateway
|
||||||
|
Ko_Communication-1=Ko_Communication\Ko_OPC
|
||||||
|
Component-type=string
|
||||||
|
Component-count=12
|
||||||
|
Component-0=Ko_CoDeSys
|
||||||
|
Component-1=Ko_CoDeSys Base
|
||||||
|
Component-2=Ko_LicenseManager
|
||||||
|
Component-3=Ko_SoftMotion
|
||||||
|
Component-4=Ko_CoDeSysHMI
|
||||||
|
Component-5=Ko_Communication
|
||||||
|
Component-6=Ko_InstallTarget
|
||||||
|
Component-7=Ko_Link
|
||||||
|
Component-8=Ko_PLCWinNT
|
||||||
|
Component-9=Ko_WebServer
|
||||||
|
Component-10=Ko_CoDeSysINI
|
||||||
|
Component-11=Ko_VersionInfo
|
||||||
|
Result=1
|
||||||
|
[{07976ABB-1EBD-4A65-A7C7-155A0DC17173}-SdSelectFolder-0]
|
||||||
|
szFolder=3S Software
|
||||||
|
Result=1
|
||||||
|
[{07976ABB-1EBD-4A65-A7C7-155A0DC17173}-SdShowInfoList-0]
|
||||||
|
Result=1
|
||||||
|
[Application]
|
||||||
|
Name=CoDeSys for Automation Alliance
|
||||||
|
Version=2.3.000
|
||||||
|
Company=3S-Smart Software Solutions GmbH
|
||||||
|
Lang=0009
|
||||||
|
[{07976ABB-1EBD-4A65-A7C7-155A0DC17173}-MessageBox-1]
|
||||||
|
Result=1
|
||||||
|
[{07976ABB-1EBD-4A65-A7C7-155A0DC17173}-SdFinish-0]
|
||||||
|
Result=1
|
||||||
|
bOpt1=0
|
||||||
|
bOpt2=0
|
||||||
|
[{533A955C-332B-484A-8F78-82FD1E718D04}-DlgOrder]
|
||||||
|
Count=0
|
||||||
|
[{D254075A-A1C7-4E4C-8DCE-8F4B08A8F463}-DlgOrder]
|
||||||
|
Count=0
|
||||||
72
pkgs/codesys3/default.nix
Normal file
72
pkgs/codesys3/default.nix
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
{
|
||||||
|
stdenv,
|
||||||
|
makeWrapper,
|
||||||
|
makeDesktopItem,
|
||||||
|
copyDesktopItems,
|
||||||
|
wineWowPackages,
|
||||||
|
vcredist2019,
|
||||||
|
# Full win64 Wine prefix produced by installing CODESYS 3.5.15.20 interactively
|
||||||
|
# (with dotnet462, msxml4/6 via winetricks). See pkgs/codesys3/README for steps.
|
||||||
|
src,
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
wine = wineWowPackages.stable;
|
||||||
|
in
|
||||||
|
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
pname = "codesys3";
|
||||||
|
version = "3.5.15.20";
|
||||||
|
|
||||||
|
inherit src;
|
||||||
|
sourceRoot = ".";
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
makeWrapper
|
||||||
|
copyDesktopItems
|
||||||
|
];
|
||||||
|
|
||||||
|
desktopItems = [
|
||||||
|
(makeDesktopItem {
|
||||||
|
name = "codesys3";
|
||||||
|
desktopName = "CODESYS 3.5";
|
||||||
|
genericName = "PLC Programming";
|
||||||
|
exec = "codesys3";
|
||||||
|
categories = [ "Development" ];
|
||||||
|
startupWMClass = "CODESYS.exe";
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
# The src is a full wine prefix (win64). Copy it to the store as a read-only
|
||||||
|
# template; the wrapper inflates it to ~/.local/share/codesys3 on first run.
|
||||||
|
install -d $out/share/codesys3-prefix
|
||||||
|
cp -r . $out/share/codesys3-prefix/
|
||||||
|
|
||||||
|
# Also expose the vcredist2019 DLLs so the wrapper can drop them in on demand.
|
||||||
|
install -d $out/share/codesys3-windll
|
||||||
|
cp ${vcredist2019}/windll/*.dll $out/share/codesys3-windll/
|
||||||
|
|
||||||
|
makeWrapper ${wine}/bin/wine $out/bin/codesys3 \
|
||||||
|
--run '
|
||||||
|
PREFIX="$HOME/.local/share/codesys3-prefix"
|
||||||
|
if [ ! -f "$PREFIX/.codesys3-ready" ]; then
|
||||||
|
echo "Setting up CODESYS 3 prefix (first run, may take a moment)..."
|
||||||
|
rm -rf "$PREFIX"
|
||||||
|
cp -r '"$out/share/codesys3-prefix"' "$PREFIX"
|
||||||
|
chmod -R u+w "$PREFIX"
|
||||||
|
touch "$PREFIX/.codesys3-ready"
|
||||||
|
fi
|
||||||
|
export WINEPREFIX="$PREFIX"
|
||||||
|
export WINEARCH=win64
|
||||||
|
export WINEDEBUG=-all
|
||||||
|
' \
|
||||||
|
--add-flags '"C:\\Program Files\\CODESYS 3.5.15.20\\CODESYS\\Common\\CODESYS.exe"'
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta.mainProgram = "codesys3";
|
||||||
|
}
|
||||||
31
pkgs/mfc42/default.nix
Normal file
31
pkgs/mfc42/default.nix
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
# mfc42.dll / mfc42u.dll, taken from the Visual C++ 6.0 redistributable.
|
||||||
|
{
|
||||||
|
runCommand,
|
||||||
|
fetchurl,
|
||||||
|
p7zip,
|
||||||
|
cabextract,
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
# To get the hash: nix-prefetch-url --type sha256 <url>
|
||||||
|
redist = fetchurl {
|
||||||
|
url = "https://download.microsoft.com/download/vc60pro/Update/2/W9XNT4/EN-US/VC6RedistSetup_deu.exe";
|
||||||
|
hash = "sha256-wuuR2cREjVDkajL+y8w7QYcG0AK+q5tfSYHeVSCYzuc=";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
|
||||||
|
runCommand "mfc42"
|
||||||
|
{
|
||||||
|
nativeBuildInputs = [
|
||||||
|
p7zip
|
||||||
|
cabextract
|
||||||
|
];
|
||||||
|
}
|
||||||
|
''
|
||||||
|
# VC6RedistSetup_deu.exe is a self-extracting archive that 7z can unpack;
|
||||||
|
# the vcredist.exe inside it is a CAB holding the actual DLLs.
|
||||||
|
7z e ${redist} vcredist.exe -otmp -y
|
||||||
|
|
||||||
|
mkdir -p $out/windll
|
||||||
|
cabextract tmp/vcredist.exe -d $out/windll -F "mfc42*.dll"
|
||||||
|
''
|
||||||
86
pkgs/mspaintxp/default.nix
Normal file
86
pkgs/mspaintxp/default.nix
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
{
|
||||||
|
stdenv,
|
||||||
|
makeWrapper,
|
||||||
|
makeDesktopItem,
|
||||||
|
copyDesktopItems,
|
||||||
|
icoutils,
|
||||||
|
wine,
|
||||||
|
mfc42,
|
||||||
|
# The Paint binary lifted out of a Windows XP install.
|
||||||
|
exe,
|
||||||
|
}:
|
||||||
|
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
pname = "mspaintxp";
|
||||||
|
version = "xp";
|
||||||
|
|
||||||
|
src = exe;
|
||||||
|
dontUnpack = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
makeWrapper
|
||||||
|
copyDesktopItems
|
||||||
|
icoutils
|
||||||
|
];
|
||||||
|
|
||||||
|
desktopItems = [
|
||||||
|
(makeDesktopItem {
|
||||||
|
name = "mspaintxp";
|
||||||
|
desktopName = "Paint (Windows XP)";
|
||||||
|
genericName = "Image Editor";
|
||||||
|
exec = "mspaintxp %f";
|
||||||
|
icon = "mspaintxp";
|
||||||
|
categories = [
|
||||||
|
"Graphics"
|
||||||
|
"2DGraphics"
|
||||||
|
"RasterGraphics"
|
||||||
|
];
|
||||||
|
mimeTypes = [
|
||||||
|
"image/bmp"
|
||||||
|
"image/gif"
|
||||||
|
"image/jpeg"
|
||||||
|
"image/png"
|
||||||
|
"image/tiff"
|
||||||
|
];
|
||||||
|
# Wine names the window class after the .exe; this lets the taskbar
|
||||||
|
# match the running window back to this entry.
|
||||||
|
startupWMClass = "mspaint.exe";
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
# Windows DLLs this .exe needs at runtime. Works like buildInputs: Nix hands
|
||||||
|
# the list to the builder as a space-separated string of store paths, and
|
||||||
|
# installPhase pulls $dep/windll out of each one. Add a dependency by adding
|
||||||
|
# a package here.
|
||||||
|
winDlls = [ mfc42 ];
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
app=$out/share/mspaintxp
|
||||||
|
install -Dm644 $src $app/mspaint.exe
|
||||||
|
|
||||||
|
# Wine resolves imports from the .exe's own directory first, so the
|
||||||
|
# dependencies only have to land next to it.
|
||||||
|
for dep in $winDlls; do
|
||||||
|
install -Dm644 $dep/windll/*.dll -t $app
|
||||||
|
done
|
||||||
|
|
||||||
|
makeWrapper ${wine}/bin/wine $out/bin/mspaintxp \
|
||||||
|
--add-flags $app/mspaint.exe
|
||||||
|
|
||||||
|
# Resource group 2 is Paint's own application icon (the pencil cup);
|
||||||
|
# it ships 16/32/48px variants, of which the 32-bit ones look best.
|
||||||
|
wrestool -x -t 14 -n 2 $src -o app.ico
|
||||||
|
for size in 16 32 48; do
|
||||||
|
icons=$out/share/icons/hicolor/''${size}x''${size}/apps
|
||||||
|
mkdir -p $icons
|
||||||
|
icotool -x --bit-depth=32 --width=$size --height=$size \
|
||||||
|
-o $icons/mspaintxp.png app.ico
|
||||||
|
done
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta.mainProgram = "mspaintxp";
|
||||||
|
}
|
||||||
35
pkgs/vcredist2019/default.nix
Normal file
35
pkgs/vcredist2019/default.nix
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
# Visual C++ 2019 (MSVC 14.29) x64 runtime DLLs.
|
||||||
|
# msvcp140.dll, vcruntime140.dll, concrt140.dll, mfc140.dll, and friends.
|
||||||
|
{
|
||||||
|
runCommand,
|
||||||
|
fetchurl,
|
||||||
|
cabextract,
|
||||||
|
p7zip,
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
redist = fetchurl {
|
||||||
|
url = "https://aka.ms/vs/16/release/vc_redist.x64.exe";
|
||||||
|
hash = "sha256-avrming/ESkhSRdYRK7Q4s4/JHvAJQ9ssYyTEpWz85k=";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
|
||||||
|
runCommand "vcredist2019"
|
||||||
|
{ nativeBuildInputs = [ cabextract p7zip ]; }
|
||||||
|
''
|
||||||
|
# The vcredist bundle is a WiX burn exe. Its structure:
|
||||||
|
# - PE stub (bootstrapper)
|
||||||
|
# - First CAB at offset 479744: bootstrapper UI resources
|
||||||
|
# - Second CAB at offset 684808: payload packages (MSIs + their CABs)
|
||||||
|
#
|
||||||
|
# We skip straight to the second CAB which contains the DLL payloads
|
||||||
|
# in its a11/a12/a13 inner CABs.
|
||||||
|
dd if=${redist} bs=1 skip=684808 of=container.cab 2>/dev/null
|
||||||
|
cabextract container.cab -d pkgs 2>/dev/null
|
||||||
|
|
||||||
|
mkdir -p $out/windll
|
||||||
|
# a11 = vcRuntimeMinimum_x64 payload, a12 = additional, a13 = MFC
|
||||||
|
for cab in pkgs/a11 pkgs/a12 pkgs/a13; do
|
||||||
|
[ -f "$cab" ] && cabextract "$cab" -F '*.dll' -d $out/windll 2>/dev/null || true
|
||||||
|
done
|
||||||
|
''
|
||||||
Loading…
Reference in a new issue