diff options
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/open-watcom-bin/default.nix')
-rw-r--r-- | nixpkgs/pkgs/development/compilers/open-watcom-bin/default.nix | 122 |
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 ]; + }; +} |