File: prog.ml

package info (click to toggle)
ocaml-obuild 0.2.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,456 kB
  • sloc: ml: 14,491; sh: 211; ansic: 34; makefile: 11
file content (110 lines) | stat: -rw-r--r-- 4,003 bytes parent folder | download
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
open Fugue
open Filepath

exception OCamlProgramError of string
exception TarError of string
exception PkgConfigError of string
exception PkgConfigVersionNotFound
exception PkgConfigUnexpectedOutput of string
exception ProgramNotFound of string

let get_cache prog names =
  let res = Gconf.get_env prog in
  match res with
  | Some p -> p
  | None -> (
      try
        let syspath = Utils.get_system_paths () in
        let found =
          list_find_map
            (fun n ->
              let n = if Utils.isWindows then n ^ ".exe" else n in
              if Filename.is_implicit n then
                try
                  let found_path = Utils.find_in_paths syspath (fn n) in
                  Some (fp_to_string (found_path </> fn n))
                with Utils.FileNotFoundInPaths _ -> None
              else if Filesystem.exists (fp n) then
                Some n
              else
                None)
            names
        in
        Gconf.set_env prog found;
        found
      with Not_found -> raise (ProgramNotFound prog))

let get_ocamlopt () = get_cache "ocamlopt" [ "ocamlopt.opt"; "ocamlopt" ]
let get_ocamlc () = get_cache "ocamlc" [ "ocamlc.opt"; "ocamlc" ]
let get_ocamldep () = get_cache "ocamldep" [ "ocamldep.opt"; "ocamldep" ]
let get_ocamldoc () = get_cache "ocamldoc" [ "ocamldoc.opt"; "ocamldoc" ]
let get_ocamlmklib () = get_cache "ocamlmklib" [ "ocamlmklib" ]
let get_camlp4 () = get_cache "camlp4" [ "camlp4" ]
let get_cc () = get_cache "cc" [ "cc"; "gcc"; "clang" ]
let get_ranlib () = get_cache "ranlib" [ "ranlib" ]
let get_ar () = get_cache "ar" [ "ar" ]
let get_ld () = get_cache "ld" [ "ld" ]
let get_pkg_config () = get_cache "pkg-config" [ "pkg-config" ]
let get_ocaml () = get_cache "ocaml" [ "ocaml" ]
let get_ocamlmktop () = get_cache "ocamlmktop" [ "ocamlmktop" ]

let get_ocaml_version cfg =
  let ver = Hashtbl.find cfg "version" in
  match String_utils.split ~limit:3 '.' ver with
  | [ major; minor; other ] -> (major, minor, other)
  | _ -> raise (OCamlProgramError ("ocaml return an unknown version " ^ ver))

let ocaml_config = ref None

let get_ocaml_config () =
  match !ocaml_config with
  | None -> (
      match Process.run [ get_ocamlc (); "-config" ] with
      | Process.Success (s, _, _) ->
          let lines = String_utils.lines_noempty s in
          let h = Hashtbl.create 32 in
          List.iter
            (fun l ->
              let k, v = Utils.toKV l in
              Hashtbl.add h k (default "" v))
            lines;
          ocaml_config := Some h;
          h
      | Process.Failure err -> raise (OCamlProgramError ("ocamlc cannot get config " ^ err)))
  | Some h -> h

let get_camlp4_config () =
  match Process.run [ get_camlp4 (); "-where" ] with
  | Process.Success (s, _, _) ->
      let (l : _) = String_utils.lines_noempty s in
      l
  | Process.Failure err -> raise (OCamlProgramError ("ocamlopt cannot get config " ^ err))

let get_tar () = get_cache "tar" [ "tar"; "gtar" ]

let run_tar output dir =
  match Process.run [ get_tar (); "czf"; output; dir ] with
  | Process.Success _ -> ()
  | Process.Failure err -> raise (TarError err)

let run_pkg_config typ name =
  match Process.run [ get_pkg_config (); typ; name ] with
  | Process.Success (s, _, _) -> s
  | Process.Failure err -> raise (PkgConfigError err)

let run_pkg_config_version name =
  let output = run_pkg_config "--version" name in
  match String_utils.words_noempty output with
  | [ ver ] -> ver
  | [] -> raise PkgConfigVersionNotFound
  | _ -> raise (PkgConfigUnexpectedOutput ("version: " ^ output))

let run_pkg_config_includes name =
  let output = run_pkg_config "--cflags" name in
  (* FIXME check if every items actually got -L as expected *)
  List.map (String_utils.drop 2) (String_utils.words_noempty output)

let run_pkg_config_libs name =
  let output = run_pkg_config "--libs" name in
  (* FIXME check if every items actually got -l as expected *)
  List.map (String_utils.drop 2) (String_utils.words_noempty output)