summary refs log tree commit diff
path: root/pkgs/applications/science/programming/kframework/default.nix
blob: e8a4f2b315648b13f5b316253cd0361bf15b277b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
{ stdenv, fetchFromGitHub, maven, openjdk8, releaseTools }:

# TODO:
# - Investigate builds on platforms other than 64-bit linux
# - Separate package for Maven cache? This would speed up builds and
#   theoretically could still be pure
# - Find a way to prevent Maven from downloading artifacts irrelevant
#   to the platform for which we are building

releaseTools.mvnBuild rec {
  name = "kframework-20150415";

  mvn8 = maven.override {
    jdk = openjdk8; # K uses Java 8. The official docs reference the
                    # Oracle VM, but it's been working with OpenJDK
  };

  src = fetchFromGitHub {
    owner = "kframework";
    repo = "k";
    rev = "85a41bc024"; # nightly build for April 15th, 2015
    sha256 = "01ndfdnqxp2w86pg3ax39sxayb2pfm39lj1h3818zzn86gqwa1vc";
  };

  buildInputs = [ mvn8 openjdk8 ];

  preSetupPhase = ''
    # z3 needs this to pass tests
    export LD_LIBRARY_PATH=$(cat $NIX_CC/nix-support/orig-cc)/lib
    # not sure if this does anything, since it might only speed up incremental builds
    export MAVEN_OPTS="-XX:+TieredCompilation"
  '';

  mvnAssembly = ''
    mvn package -Dcheckstyle.skip -Dmaven.test.skip=true -Dmaven.repo.local=$M2_REPO
  '';

  mvnRelease = ''
    true # do nothing, since mvn package is sufficient
  '';

  # this is a custom version of k-distribution/src/main/scripts/lib/k
  kscript = ''
    #!/usr/bin/env bash
    export JAVA=${openjdk8}/bin/java

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"$out/lib"

    export K_OPTS="-Xms64m -Xmx1024m -Xss32m -XX:+TieredCompilation"
    export MISC_ARGS="-Djava.awt.headless=true"
    export ARGS="$MISC_ARGS $K_OPTS"
    $JAVA $ARGS -cp "$out/share/kframework/lib/java/*" org.kframework.main.Main "$@"
  '';

  finalPhase = ''
    # set some environment variables
    export K_ROOT=$PWD/k-distribution/target/release/k/
    export K_SHARE=$out/share/kframework/
    # make requisite directories
    mkdir -p $out/lib $K_SHARE/lib/native
    # copy over bin
    cp -R $K_ROOT/bin                             $K_SHARE/
    # symlink $out/bin to $out/share/kframework/bin
    ln -s $K_SHARE/bin                            $out/bin
    # copy everything relevant to $out/share/kframework
    # we may want to consider adding the documentation etc.
    cp -R $K_ROOT/include                         $K_SHARE/
    cp -R $K_ROOT/lib/java                        $K_SHARE/lib/
    cp -R $K_ROOT/lib/native/linux                $K_SHARE/lib/native/
    cp -R $K_ROOT/lib/native/linux64              $K_SHARE/lib/native/
    # remove Windows batch scripts
    rm $K_SHARE/bin/*.bat # */
    # TODO: fix these scripts so they work
    rm $K_SHARE/bin/kserver $K_SHARE/bin/stop-kserver
    # make our k wrapper script and substitute $out for its value
    echo -n "$kscript" | sed "s:\$out:$out:g" > $K_SHARE/lib/k
    chmod +x $K_SHARE/lib/k
    # symlink requisite binaries
    ln -s $K_SHARE/lib/k                           $out/lib/k
    ln -s $K_SHARE/lib/native/linux/sdf2table      $out/bin/sdf2table
    ln -s $K_SHARE/lib/native/linux64/z3           $out/bin/z3
    ln -s $K_SHARE/lib/native/linux64/libz3.so     $out/lib/libz3.so
    ln -s $K_SHARE/lib/native/linux64/libz3java.so $out/lib/libz3java.so
    # patch Z3 so it uses the right interpreter/libs
    patchelf \
      --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
      --set-rpath $(cat $NIX_CC/nix-support/orig-cc)/lib \
      --force-rpath \
      $K_SHARE/lib/native/linux64/z3
  '';

  meta = {
    description = "A rewrite-based executable semantic framework in which programming languages, type systems and formal analysis tools can be defined";
    homepage = http://www.kframework.org;
    license = stdenv.lib.licenses.bsd3;     # technically it is the UIUC/NCSA license
                                            # but LLVM uses that license as well and
                                            # it is marked as BSD3
    maintainers = [ stdenv.lib.maintainers.taktoa ];
    platforms = stdenv.lib.platforms.linux; # I haven't done testing on other OSes, but
                                            # since it's Java it should run anywhere
  };
}