(* $Id$
* ----------------------------------------------------------------------
*
*)
open Fl_compat
let ( / ) = Filename.concat
let exists path =
match Sys.file_exists path with
| true -> Some path
| false -> None
let findlib_conf_of_path path =
match exists (path / "etc" / "findlib.conf") with
| Some etc_path -> etc_path
| None -> path / "lib" / "findlib.conf"
let install_dir_from_binary path =
let exe_dir = Filename.dirname path in
let install_dir = Filename.dirname exe_dir in
let config_path = findlib_conf_of_path install_dir in
match Sys.file_exists config_path with
| true -> Some install_dir
| false -> None
;;
let find_in_path name =
match Sys.getenv_opt "PATH" with
| None -> None
| Some search_in -> (
let paths = String.split_on_char Fl_split.path_separator search_in in
match List.find_map (fun path -> path / name |> exists) paths with
| None -> None
| Some location -> install_dir_from_binary location)
;;
let install_dir_from_ld_library_path paths =
String.split_on_char Fl_split.path_separator paths
|> List.find_map (fun path ->
let parent = Filename.dirname path in
let parent' = Filename.dirname parent in
match Sys.file_exists (findlib_conf_of_path parent') with
| true -> Some parent'
| false -> None)
;;
let install_dir_from_ocaml_toplevel_path = install_dir_from_binary
let install_dir_from_opam_switch_prefix path =
match Sys.file_exists (findlib_conf_of_path path) with
| false -> None
| true -> Some path
let default = "@CONFIGFILE@"
let fallback = Option.value ~default
let rec try_vars = function
| [] -> None
| (var, mapper)::xs -> (
match Sys.getenv_opt var with
| None -> try_vars xs
| Some content -> (
match mapper content with
| None -> try_vars xs
| Some _ as found -> found))
(* exposed condfigure-time setting *)
let uses_relative_paths = @RELATIVE_PATHS@
(* the location where we assume to be installed in *)
let location = lazy (
try_vars [
("OPAM_SWITCH_PREFIX", install_dir_from_opam_switch_prefix);
("CAML_LD_LIBRARY_PATH", install_dir_from_ld_library_path);
("OCAML_TOPLEVEL_PATH", install_dir_from_ocaml_toplevel_path);
])
let findlib_conf = lazy (
match Lazy.force location with
| None -> default
| Some location -> location
|> findlib_conf_of_path
|> exists
|> fallback)
let config_file = lazy (
match uses_relative_paths with
| false -> default
| true -> Lazy.force findlib_conf)
let ocaml_has_meta_files =
let ocaml_major =
String.sub Sys.ocaml_version 0 (String.index Sys.ocaml_version '.') in
int_of_string ocaml_major >= 5;;
let ocaml_stdlib = "@STDLIB@";;
let ocaml_ldconf = ocaml_stdlib / "ld.conf";;
let ocaml_has_autolinking = @AUTOLINK@;;
let libexec_name = "stublibs";;
let system = "@SYSTEM@";;
(* - "mingw", "mingw64", "win32", "cygwin", "linux_elf", ... *)
let dll_suffix =
match Sys.os_type with
| "Unix" | "BeOS" -> ".so"
| "Win32" | "Cygwin" -> ".dll"
| "MacOS" -> "" (* don't know *)
| _ -> failwith "Unknown Sys.os_type"
;;