aboutsummaryrefslogtreecommitdiff
path: root/nixpkgs/pkgs/development/compilers/open-watcom-bin/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/open-watcom-bin/default.nix')
-rw-r--r--nixpkgs/pkgs/development/compilers/open-watcom-bin/default.nix122
1 files changed, 122 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/compilers/open-watcom-bin/default.nix b/nixpkgs/pkgs/development/compilers/open-watcom-bin/default.nix
new file mode 100644
index 00000000000..a9c6b221065
--- /dev/null
+++ b/nixpkgs/pkgs/development/compilers/open-watcom-bin/default.nix
@@ -0,0 +1,122 @@
+{ stdenvNoCC, fetchurl, qemu, expect, writeScript, writeScriptBin, ncurses, bash, coreutils }:
+
+let
+
+ # We execute all OpenWatcom binaries in qemu-user, because otherwise
+ # some binaries (most notably the installer itself and wlib) fail to
+ # use the stat() systemcall. The failure mode is that it returns
+ # EOVERFLOW for completely legitimate requests. This seems like an
+ # incompatibility of new Linux kernels to run this ancient binary.
+ wrapLegacyBinary = writeScript "wrapLegacyBinary" ''
+ #!${bash}/bin/bash
+
+ set -eu
+
+ if [ $# -ne 2 ]; then
+ echo "Usage: $0 unwrapped-binary wrapped-binary"
+ exit 1
+ fi
+
+ IN="$(${coreutils}/bin/realpath $1)"
+ OUT="$2"
+ ARGV0="$(basename $2)"
+
+ cat > "$OUT" <<EOF
+ #!${bash}/bin/bash
+
+ TERMINFO=${ncurses}/share/terminfo TERM=vt100 exec ${qemu}/bin/qemu-i386 -0 $ARGV0 $IN "\$@"
+ EOF
+
+ chmod +x "$OUT"
+ '';
+
+ wrapInPlace = writeScriptBin "wrapInPlace" ''
+ #!${bash}/bin/bash
+
+ set -eu
+
+ if [ $# -ne 1 ]; then
+ echo "Usage: $0 unwrapped-binary"
+ exit 1
+ fi
+
+ TARGET="$1"
+
+ mv "$TARGET" "$TARGET-unwrapped"
+ chmod +x "$TARGET-unwrapped"
+
+ exec ${wrapLegacyBinary} "$TARGET-unwrapped" "$TARGET"
+ '';
+
+ # Do a scripted installation of OpenWatcom with its original installer.
+ #
+ # If maintaining this expect script turns out to be too much of a
+ # hassle, we can switch to just using `unzip' on the installer and
+ # the correct file permissions manually.
+ performInstall = writeScriptBin "performInstall" ''
+ #!${expect}/bin/expect -f
+
+ spawn [lindex $argv 0]
+
+ # Wait for button saying "I agree" with escape sequences.
+ expect "gree"
+
+ # Navigate to "I Agree!" and hit enter.
+ send "\t\t\n"
+
+ expect "Install Open Watcom"
+
+ # Where do we want to install to.
+ send "$env(out)\n"
+
+ expect "will be installed"
+
+ # Select Full Installation, Next
+ send "fn"
+
+ expect "Setup will now copy"
+
+ # Next
+ send "n"
+
+ expect "completed successfully"
+ send "\n"
+ '';
+
+in
+stdenvNoCC.mkDerivation rec {
+ pname = "open-watcom-bin";
+ version = "1.9";
+
+ src = fetchurl {
+ url = "http://ftp.openwatcom.org/install/open-watcom-c-linux-${version}";
+ sha256 = "1wzkvc6ija0cjj5mcyjng5b7hnnc5axidz030c0jh05pgvi4nj7p";
+ };
+
+ nativeBuildInputs = [ wrapInPlace performInstall ];
+
+ dontUnpack = true;
+ dontConfigure = true;
+
+ buildPhase = ''
+ cp ${src} install-bin-unwrapped
+ wrapInPlace install-bin-unwrapped
+ '';
+
+ installPhase = ''
+ performInstall ./install-bin-unwrapped
+
+ for e in $(find $out/binl -type f -executable); do
+ echo "Wrapping $e"
+ wrapInPlace "$e"
+ done
+ '';
+
+ meta = with stdenvNoCC.lib; {
+ description = "A C/C++ Compiler (binary distribution)";
+ homepage = "http://www.openwatcom.org/";
+ license = licenses.watcom;
+ platforms = [ "x86_64-linux" "i686-linux" ];
+ maintainers = [ maintainers.blitz ];
+ };
+}