about summary refs log tree commit diff
path: root/pkgs/development/julia-modules/depot.nix
blob: 5614f1427aa5eee929a771b621702d3d4f3f6274 (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
{ lib
, runCommand

, cacert
, curl
, git
, julia
, python3

, closureYaml
, extraLibs
, overridesToml
, packageNames
, packageImplications
, precompile
, registry
}:

runCommand "julia-depot" {
    nativeBuildInputs = [curl git julia (python3.withPackages (ps: with ps; [pyyaml]))] ++ extraLibs;
    inherit precompile registry;
  } ''
  export HOME=$(pwd)

  echo "Building Julia depot and project with the following inputs"
  echo "Julia: ${julia}"
  echo "Registry: $registry"
  echo "Overrides ${overridesToml}"

  mkdir -p $out/project
  export JULIA_PROJECT="$out/project"

  mkdir -p $out/depot/artifacts
  export JULIA_DEPOT_PATH="$out/depot"
  cp ${overridesToml} $out/depot/artifacts/Overrides.toml

  # These can be useful to debug problems
  # export JULIA_DEBUG=Pkg
  # export JULIA_DEBUG=loading

  export JULIA_SSL_CA_ROOTS_PATH="${cacert}/etc/ssl/certs/ca-bundle.crt"

  # Only precompile if configured to below
  export JULIA_PKG_PRECOMPILE_AUTO=0

  # Prevent a warning where Julia tries to download package server info
  export JULIA_PKG_SERVER=""

  # See if we need to add any extra package names based on the closure
  # and the packageImplications. We're using the full closure YAML here since
  # it's available, which is slightly weird, but it should work just as well
  # for finding the extra packages we need to add
  python ${./python}/find_package_implications.py "${closureYaml}" '${lib.generators.toJSON {} packageImplications}' extra_package_names.txt

  # git config --global --add safe.directory '/nix'
  export JULIA_PKG_USE_CLI_GIT="true"

  # At time of writing, this appears to be the only way to turn precompiling's
  # terminal output into standard logging, so opportunistically do that.
  # (Note this is different from JULIA_CI).
  export CI=true

  julia -e ' \
    import Pkg
    import Pkg.Types: PRESERVE_NONE

    Pkg.Registry.add(Pkg.RegistrySpec(path="${registry}"))

    input = ${lib.generators.toJSON {} packageNames} ::Vector{String}

    if isfile("extra_package_names.txt")
      append!(input, readlines("extra_package_names.txt"))
    end

    input = unique(input)

    if !isempty(input)
      println("Adding packages: " * join(input, " "))
      Pkg.add(input; preserve=PRESERVE_NONE)
      Pkg.instantiate()

      if "precompile" in keys(ENV) && ENV["precompile"] != "0" && ENV["precompile"] != ""
        Pkg.precompile()
      end
    end

    # Remove the registry to save space
    Pkg.Registry.rm("General")
  '
''