comp.lang.ada
 help / color / mirror / Atom feed
* Getting GNAT GPL 2017 to run on NixOS
@ 2017-10-10 10:13 Felix Krause
  0 siblings, 0 replies; only message in thread
From: Felix Krause @ 2017-10-10 10:13 UTC (permalink / raw)


NixOS provides a pretty old GNAT version, so I decided to try and 
install AdaCore's GNAT GPL 2017 release.

I came up with the following nix expression which fetches the 64bit 
release from AdaCore, patches the ELF binaries to use the correct 
interpreter for NixOS, and sets some environment variables so that the 
tools find resources:

    { stdenv, fetchurl, patchelf, gnugrep, file, makeWrapper, ncurses5 }:
    stdenv.mkDerivation {
      name = "gnat-gpl-2017";
      src = fetchurl {
        url = "http://mirrors.cdn.adacore.com/art/591c6d80c7a447af2deed1d7";
        sha1 = "9682e2e1f2f232ce03fe21d77b14c37a0de5649b";
      };
      dontBuild = true;
      dontStrip = true;
      unpackCmd = "tar -xzf $curSrc";
      buildInputs = [ gnugrep file patchelf makeWrapper ];
      installPhase = ''
        set -e
        make ins-all prefix="$out"
        for path in 
$out/{bin,libexec/gcc/x86_64-pc-linux-gnu/6.3.1,libexec/gprbuild}/*; do
          if file "$path" | grep -q -i "elf"; then
            echo "Patching $path"
            if file "$path" | grep -q -i "executable"; then
              patchelf --set-interpreter 
"${stdenv.glibc}/lib/ld-linux-x86-64.so.2" "$path"
            fi
            patchelf --set-rpath "${stdenv.glibc}/lib" "$path"
          fi
        done
        mkdir -p $out/share/gnat/bin
        mv $out/bin/* $out/share/gnat/bin
        for path in $out/share/gnat/bin/{gnat,gpr}*; do
          if file "$path" | grep -q -i "elf"; then
            makeWrapper $path $out/bin/$(basename $path) --prefix PATH 
: $out/share/gnat/bin --set GNAT_ROOT $out --set GCC_ROOT $out --set 
LIBRARY_PATH "${stdenv.glibc}/lib"
          fi
        done
        makeWrapper $out/share/gnat/bin/gps $out/bin/gps --prefix PATH 
: $out/share/gnat/bin --set GNAT_ROOT $out --set GCC_ROOT $out --set 
GPS_ROOT $out --prefix LD_LIBRARY_PATH : $out/lib/gps/
      '';
    }

I move all binaries into $out/share/gnat/bin because everything in 
$out/bin would be added to my environment which is undesirable (some 
tools collide with existing ones). Then I create wrappers for all gnat* 
and gpr* tools in $out/bin. The wrapper prepends $out/share/gnat/bin to 
PATH so that the tools can find the accompanying binaries.

So far, so good; this got me a working gnatmake. However, the binary 
gnatmake creates references /lib64/ld-linux-x86-64.so.2 as interpreter 
instead of the correct NixOS interpreter. Is there a way to teach 
gnatmake which interpreter to write into the resulting binary?

I also tried to use gprbuild, which fails with these lines when called 
on an existing project:

    No valid configuration found
    Generation of configuration files failed
    GNAT-TEMP-000001.TMP:1:01: "project" expected
    gprbuild: processing of configuration project 
"/tmp/GNAT-TEMP-000001.TMP" failed

The file in /tmp does not exist (and is not the project I called 
gprbuild with). I am unsure what goes wrong here, any suggestions?

I also did not get GPS to start yet due to a missing libncurses.so.5 
which does not seem to be part of the distribution – strange as 
everything else is bundled. I will try to load NixOS' native ncurses.


-- 
Regards,
Felix Krause


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2017-10-10 10:13 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-10 10:13 Getting GNAT GPL 2017 to run on NixOS Felix Krause

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox