let index
    ~reference_build
    ~index_prefix
    ~configuration
    ~(run_with : Machine.t) =
  let open KEDSL in
  let reference_fasta =
    Machine.get_reference_genome run_with reference_build
    |> Reference_genome.fasta in
  let result_dir = Filename.dirname index_prefix in
  let version = configuration.Configuration.version in
  let hisat_tool =
    Machine.get_tool run_with (Configuration.get_tool configuration) in
  let build_binary =
    match version with
    | `V_0_1_6_beta -> "hisat-build"
    | `V_2_0_2_beta -> "hisat2-build"
  in
  let name =
    sprintf "%s-%s" build_binary (Filename.basename reference_fasta#product#path) in
  let first_index_file =
    match version with
    | `V_0_1_6_beta -> sprintf "%s.1.bt2" index_prefix
    | `V_2_0_2_beta -> sprintf "%s.1.ht2" index_prefix
  in
  workflow_node ~name
    (single_file ~host:(Machine.(as_host run_with)) first_index_file)
    ~edges:[
      on_failure_activate (Remove.directory ~run_with result_dir);
      depends_on reference_fasta;
      depends_on Machine.Tool.(ensure hisat_tool);
    ]
    ~tags:[Target_tags.aligner]
    ~make:(Machine.run_big_program run_with ~name
             ~self_ids:["hisat""index"]
             Program.(
               Machine.Tool.(init hisat_tool)
               && shf "mkdir %s" result_dir
               && shf "%s %s %s"
                 build_binary
                 reference_fasta#product#path
                 index_prefix
             ))