Install by specifying libdir for opam-installer
- change default findlib directory (ocamlc -where)
This commit is contained in:
parent
c7e67d49b8
commit
747cf220c6
22
bin/main.ml
22
bin/main.ml
|
@ -685,12 +685,20 @@ let get_prefix context ~from_command_line =
|
||||||
| Some p -> Future.return (Path.of_string p)
|
| Some p -> Future.return (Path.of_string p)
|
||||||
| None -> Context.install_prefix context
|
| None -> Context.install_prefix context
|
||||||
|
|
||||||
|
let get_libdir context ~libdir_from_command_line ~prefix_from_command_line =
|
||||||
|
match libdir_from_command_line with
|
||||||
|
| Some p -> Future.return (Path.of_string p)
|
||||||
|
| None ->
|
||||||
|
match prefix_from_command_line with
|
||||||
|
| Some p -> Future.return (Path.relative (Path.of_string p) "lib")
|
||||||
|
| None -> Context.install_ocaml_libdir context
|
||||||
|
|
||||||
let install_uninstall ~what =
|
let install_uninstall ~what =
|
||||||
let doc =
|
let doc =
|
||||||
sprintf "%s packages using opam-installer." (String.capitalize_ascii what)
|
sprintf "%s packages using opam-installer." (String.capitalize_ascii what)
|
||||||
in
|
in
|
||||||
let name_ = Arg.info [] ~docv:"PACKAGE" in
|
let name_ = Arg.info [] ~docv:"PACKAGE" in
|
||||||
let go common prefix pkgs =
|
let go common prefix_from_command_line libdir_from_command_line pkgs =
|
||||||
set_common common ~targets:[];
|
set_common common ~targets:[];
|
||||||
let opam_installer = opam_installer () in
|
let opam_installer = opam_installer () in
|
||||||
let log = Log.create () in
|
let log = Log.create () in
|
||||||
|
@ -720,15 +728,16 @@ let install_uninstall ~what =
|
||||||
(List.map missing_install_files
|
(List.map missing_install_files
|
||||||
~f:(fun p -> sprintf "- %s" (Path.to_string p))))
|
~f:(fun p -> sprintf "- %s" (Path.to_string p))))
|
||||||
end;
|
end;
|
||||||
(match setup.contexts, prefix with
|
(match setup.contexts, prefix_from_command_line, libdir_from_command_line with
|
||||||
| _ :: _ :: _, Some _ ->
|
| _ :: _ :: _, Some _, _ | _ :: _ :: _, _, Some _ ->
|
||||||
die "Cannot specify --prefix when installing into multiple contexts!"
|
die "Cannot specify --prefix or --libdir when installing into multiple contexts!"
|
||||||
| _ -> ());
|
| _ -> ());
|
||||||
let module CMap = Map.Make(Context) in
|
let module CMap = Map.Make(Context) in
|
||||||
let install_files_by_context = CMap.of_alist_multi install_files |> CMap.bindings in
|
let install_files_by_context = CMap.of_alist_multi install_files |> CMap.bindings in
|
||||||
Future.all_unit
|
Future.all_unit
|
||||||
(List.map install_files_by_context ~f:(fun (context, install_files) ->
|
(List.map install_files_by_context ~f:(fun (context, install_files) ->
|
||||||
get_prefix context ~from_command_line:prefix >>= fun prefix ->
|
get_prefix context ~from_command_line:prefix_from_command_line >>= fun prefix ->
|
||||||
|
get_libdir context ~libdir_from_command_line ~prefix_from_command_line >>= fun libdir ->
|
||||||
Future.all_unit
|
Future.all_unit
|
||||||
(List.map install_files ~f:(fun path ->
|
(List.map install_files ~f:(fun path ->
|
||||||
let purpose = Future.Build_job install_files in
|
let purpose = Future.Build_job install_files in
|
||||||
|
@ -736,12 +745,15 @@ let install_uninstall ~what =
|
||||||
[ sprintf "-%c" what.[0]
|
[ sprintf "-%c" what.[0]
|
||||||
; "--prefix"
|
; "--prefix"
|
||||||
; Path.to_string prefix
|
; Path.to_string prefix
|
||||||
|
; "--libdir"
|
||||||
|
; Path.to_string libdir
|
||||||
; Path.to_string path
|
; Path.to_string path
|
||||||
])))))
|
])))))
|
||||||
in
|
in
|
||||||
( Term.(const go
|
( Term.(const go
|
||||||
$ common
|
$ common
|
||||||
$ Arg.(value & opt (some dir) None & info ["prefix"])
|
$ Arg.(value & opt (some dir) None & info ["prefix"])
|
||||||
|
$ Arg.(value & opt (some dir) None & info ["libdir"])
|
||||||
$ Arg.(value & pos_all string [] name_))
|
$ Arg.(value & pos_all string [] name_))
|
||||||
, Term.info what ~doc ~man:help_secs)
|
, Term.info what ~doc ~man:help_secs)
|
||||||
|
|
||||||
|
|
|
@ -248,17 +248,27 @@ to be able to use ``jbuilder install``.
|
||||||
Destination
|
Destination
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
The place where the build artifacts are copied, usually referred as
|
The place where the build artifacts (except ocaml libraries) are copied, usually referred as
|
||||||
**prefix**, is determined as follow for a given build context:
|
**prefix**, is determined as follow for a given build context:
|
||||||
|
|
||||||
#. if an explicit ``--prefix <path>`` argument is passed, use this path
|
#. if an explicit ``--prefix <path>`` argument is passed, use this path
|
||||||
#. if ``opam`` is present in the ``PATH``, use the output of ``opam config var
|
#. if ``opam`` is present in the ``PATH``, use the output of ``opam config var
|
||||||
prefix``
|
prefix``
|
||||||
#. otherwise, take the directory where ``ocamlc`` was found, and append
|
#. otherwise, take the parent of the directory where ``ocamlc`` was found.
|
||||||
``../lib`` to it. For instance if ``ocamlc`` is found in ``/usr/bin``, use
|
|
||||||
``/usr``
|
|
||||||
|
|
||||||
Note that ``--prefix`` is only supported if a single build context is in
|
The ocaml libraries build artifacts are copied, referred as
|
||||||
|
**libdir**, is determined as follow for a given build context:
|
||||||
|
|
||||||
|
#. if an explicit ``--libdir <path>`` argument is passed, use this path
|
||||||
|
#. if ``ocamlfind`` is present in the ``PATH``, use the output of
|
||||||
|
``ocamlfind printconf destdir``
|
||||||
|
#. if ``opam`` is present in the ``PATH``, use the output of ``opam config var
|
||||||
|
lib``
|
||||||
|
#. otherwise, take the directory of the ocaml standard library
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Note that ``--prefix`` and ``--libdir`` are only supported if a single build context is in
|
||||||
use.
|
use.
|
||||||
|
|
||||||
Workspace configuration
|
Workspace configuration
|
||||||
|
|
|
@ -198,31 +198,8 @@ let create ~(kind : Kind.t) ~path ~base_env ~env_extra ~name ~merlin ~use_findli
|
||||||
Path.of_string (sprintf "_build/%s" name)
|
Path.of_string (sprintf "_build/%s" name)
|
||||||
in
|
in
|
||||||
let ocamlc_config_cmd = sprintf "%s -config" (Path.to_string ocamlc) in
|
let ocamlc_config_cmd = sprintf "%s -config" (Path.to_string ocamlc) in
|
||||||
let findlib_path =
|
Future.run_capture_lines ~env Strict (Path.to_string ocamlc) ["-config"]
|
||||||
if use_findlib then
|
>>= fun ocamlc_config ->
|
||||||
(* If ocamlfind is present, it has precedence over everything else. *)
|
|
||||||
match which "ocamlfind" with
|
|
||||||
| Some fn ->
|
|
||||||
(Future.run_capture_lines ~env Strict
|
|
||||||
(Path.to_string fn) ["printconf"; "path"]
|
|
||||||
>>| List.map ~f:Path.absolute)
|
|
||||||
| None ->
|
|
||||||
(* If there no ocamlfind in the PATH, check if we have opam and assume a standard
|
|
||||||
opam setup *)
|
|
||||||
opam_config_var ~env ~cache:opam_var_cache "lib"
|
|
||||||
>>| function
|
|
||||||
| Some s -> [Path.absolute s]
|
|
||||||
| None ->
|
|
||||||
(* If neither opam neither ocamlfind are present, assume that libraries are in
|
|
||||||
[dir ^ "/../lib"] *)
|
|
||||||
[Path.relative (Path.parent dir) "lib"]
|
|
||||||
else
|
|
||||||
return []
|
|
||||||
in
|
|
||||||
both
|
|
||||||
findlib_path
|
|
||||||
(Future.run_capture_lines ~env Strict (Path.to_string ocamlc) ["-config"])
|
|
||||||
>>= fun (findlib_path, ocamlc_config) ->
|
|
||||||
let ocamlc_config =
|
let ocamlc_config =
|
||||||
List.map ocamlc_config ~f:(fun line ->
|
List.map ocamlc_config ~f:(fun line ->
|
||||||
match String.index line ':' with
|
match String.index line ':' with
|
||||||
|
@ -301,6 +278,28 @@ let create ~(kind : Kind.t) ~path ~base_env ~env_extra ~name ~merlin ~use_findli
|
||||||
let _, ocamlopt_cflags = split_prog (get "native_c_compiler") in
|
let _, ocamlopt_cflags = split_prog (get "native_c_compiler") in
|
||||||
(c_compiler, ocamlc_cflags, ocamlopt_cflags)
|
(c_compiler, ocamlc_cflags, ocamlopt_cflags)
|
||||||
in
|
in
|
||||||
|
let findlib_path =
|
||||||
|
if use_findlib then
|
||||||
|
(* If ocamlfind is present, it has precedence over everything else. *)
|
||||||
|
match which "ocamlfind" with
|
||||||
|
| Some fn ->
|
||||||
|
(Future.run_capture_lines ~env Strict
|
||||||
|
(Path.to_string fn) ["printconf"; "path"]
|
||||||
|
>>| List.map ~f:Path.absolute)
|
||||||
|
| None ->
|
||||||
|
(* If there no ocamlfind in the PATH, check if we have opam and assume a standard
|
||||||
|
opam setup *)
|
||||||
|
opam_config_var ~env ~cache:opam_var_cache "lib"
|
||||||
|
>>| function
|
||||||
|
| Some s -> [Path.absolute s]
|
||||||
|
| None ->
|
||||||
|
(* If neither opam neither ocamlfind are present, assume that libraries are in
|
||||||
|
the stdlib directory *)
|
||||||
|
[stdlib_dir]
|
||||||
|
else
|
||||||
|
return []
|
||||||
|
in
|
||||||
|
findlib_path >>= fun findlib_path ->
|
||||||
return
|
return
|
||||||
{ name
|
{ name
|
||||||
; kind
|
; kind
|
||||||
|
@ -426,6 +425,23 @@ let install_prefix t =
|
||||||
| Some x -> Path.absolute x
|
| Some x -> Path.absolute x
|
||||||
| None -> Path.parent t.ocaml_bin
|
| None -> Path.parent t.ocaml_bin
|
||||||
|
|
||||||
|
let install_ocaml_libdir t =
|
||||||
|
(* If ocamlfind is present, it has precedence over everything else. *)
|
||||||
|
match which t "ocamlfind" with
|
||||||
|
| Some fn ->
|
||||||
|
(Future.run_capture_line ~env:t.env Strict
|
||||||
|
(Path.to_string fn) ["printconf"; "destdir"]
|
||||||
|
>>| Path.absolute)
|
||||||
|
| None ->
|
||||||
|
(* If there no ocamlfind in the PATH, check if we have opam and assume a standard
|
||||||
|
opam setup *)
|
||||||
|
opam_config_var t "lib"
|
||||||
|
>>| function
|
||||||
|
| Some s -> Path.absolute s
|
||||||
|
| None ->
|
||||||
|
(* If neither opam neither ocamlfind are present use stdlib dir *)
|
||||||
|
t.stdlib_dir
|
||||||
|
|
||||||
|
|
||||||
(* CR-someday jdimino: maybe we should just do this for [t.env] directly? *)
|
(* CR-someday jdimino: maybe we should just do this for [t.env] directly? *)
|
||||||
let env_for_exec t =
|
let env_for_exec t =
|
||||||
|
|
|
@ -144,6 +144,7 @@ val extend_env : vars:string Env_var_map.t -> env:string array -> string array
|
||||||
val opam_config_var : t -> string -> string option Future.t
|
val opam_config_var : t -> string -> string option Future.t
|
||||||
|
|
||||||
val install_prefix : t -> Path.t Future.t
|
val install_prefix : t -> Path.t Future.t
|
||||||
|
val install_ocaml_libdir : t -> Path.t Future.t
|
||||||
|
|
||||||
val env_for_exec : t -> string array
|
val env_for_exec : t -> string array
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue