about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/tools/pyre/default.nix
blob: b5dfe3c8bfd9df63d073f9d80ca02c5181898d53 (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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
{ stdenv, fetchFromGitHub, ocamlPackages, writeScript
, dune, python3, rsync, buck, watchman, sqlite }:
let
  # Manually set version - the setup script requires
  # hg and git + keeping the .git directory around.
  pyre-version = "0.0.22";  # also change typeshed revision below with $pyre-src/.typeshed-version
  pyre-src = fetchFromGitHub {
    owner = "facebook";
    repo = "pyre-check";
    rev = "v${pyre-version}";
    sha256 = "057vy6zmgwsi0ag9n4m6sszhahmfk2s1ywm36nyfs7w4d0wnk92s";
  };
  versionFile = writeScript "version.ml" ''
    cat > "./version.ml" <<EOF
    open Core
    let build_info () =
    "pyre-nixpkgs ${pyre-version}"
    let version () =
    "${pyre-version}"

    let log_version_banner () =
      Log.info "Running as pid: %d" (Pid.to_int (Unix.getpid ()));
      Log.info "Version: %s" (version ());
      Log.info "Build info: %s" (build_info ())
    EOF
  '';
 pyre-bin = stdenv.mkDerivation {
  name = "pyre-${pyre-version}";

  src = pyre-src;

  buildInputs = with ocamlPackages; [
    ocaml
    findlib
    menhir
    yojson
    core
    sedlex
    ppx_deriving_yojson
    ocamlbuild
    ppxlib
    dune
    ounit
    base64
    sqlite.dev
    # python36Packages.python36Full # TODO
  ];

  preBuild = ''
    # build requires HOME to be set
    export HOME=$TMPDIR

    # "external" because https://github.com/facebook/pyre-check/pull/8/files
    sed "s/%VERSION%/external/" dune.in > dune

    ln -sf ${versionFile} ./scripts/generate-version-number.sh

    mkdir $(pwd)/build
    export OCAMLFIND_DESTDIR=$(pwd)/build
    export OCAMLPATH=$OCAMLPATH:$(pwd)/build
  '';

  buildFlags = [ "release" ];

  doCheck = true;
  # ./scripts/run-python-tests.sh # TODO: once typeshed and python bits are added

  # Note that we're not installing the typeshed yet.
  # Improvement for a future version.
  installPhase = ''
    install -D ./_build/default/main.exe $out/bin/pyre.bin
  '';

  meta = with stdenv.lib; {
    description = "A performant type-checker for Python 3";
    homepage = https://pyre-check.org;
    license = licenses.mit;
    platforms = ocamlPackages.ocaml.meta.platforms;
    maintainers = with maintainers; [ teh ];
  };
};
typeshed = stdenv.mkDerivation {
  pname = "typeshed";
  version = pyre-version;
  src = fetchFromGitHub {
    owner = "python";
    repo = "typeshed";
    rev = "0b49ce75b478fdf283dda5dd1368759ac342dfe2";
    sha256 = "1w5aqbbcfk5ki8n9fgdikkyadjb318ipqyi517s9xnwlzi1jv0fh";
  };
  phases = [ "unpackPhase" "installPhase" ];
  installPhase = "cp -r $src $out";
};
in python3.pkgs.buildPythonApplication rec {
  pname = "pyre-check";
  version = pyre-version;
  src = pyre-src;
  patches = [ ./pyre-bdist-wheel.patch ];

  # The build-pypi-package script does some funky stuff with build
  # directories - easier to patch it a bit than to replace it
  # completely though:
  postPatch = ''
    mkdir ./build
    substituteInPlace scripts/build-pypi-package.sh \
        --replace 'NIX_BINARY_FILE' '${pyre-bin}/bin/pyre.bin' \
        --replace 'BUILD_ROOT="$(mktemp -d)"' "BUILD_ROOT=$PWD/build"
    for file in client/pyre.py client/commands/initialize.py client/commands/tests/initialize_test.py; do
      substituteInPlace "$file" \
          --replace '"watchman"' '"${watchman}/bin/watchman"'
    done
    substituteInPlace client/buck.py \
        --replace '"buck"' '"${buck}/bin/buck"'
    substituteInPlace client/tests/buck_test.py \
        --replace '"buck"' '"${buck}/bin/buck"'
  '';

  buildInputs = [ pyre-bin ];
  nativeBuildInputs = [ rsync ]; # only required for build-pypi-package.sh
  propagatedBuildInputs = with python3.pkgs; [
    docutils
    typeshed
    click-log
    ipython
    sqlalchemy
    munch
    xxhash
    ujson
  ];
  buildPhase = ''
    bash scripts/build-pypi-package.sh --version ${pyre-version} --bundle-typeshed ${typeshed}
    cp -r build/dist dist
  '';
  checkPhase = ''
    bash scripts/run-python-tests.sh
  '';
}