Skip to content

Commit

Permalink
Merge pull request ocaml#5352 from dra27/build-env
Browse files Browse the repository at this point in the history
Expand variable interpolations in `build-env`
  • Loading branch information
dra27 authored and rjbou committed May 12, 2023
1 parent 3dd624a commit 2729dc4
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 13 deletions.
5 changes: 4 additions & 1 deletion src/client/opamAction.ml
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,9 @@ let prepare_package_source st nv dir =

let compilation_env t opam =
let open OpamParserTypes in
let build_env =
List.map (OpamEnv.env_expansion ~opam t) (OpamFile.OPAM.build_env opam)
in
let scrub = OpamClientConfig.(!r.scrubbed_environment_variables) in
OpamEnv.get_full ~scrub ~set_opamroot:true ~set_opamswitch:true
~force_path:true t ~updates:([
Expand All @@ -493,7 +496,7 @@ let compilation_env t opam =
Some "build environment definition";
"OPAMCLI", Eq, "2.0", Some "opam CLI version";
] @
OpamFile.OPAM.build_env opam)
build_env)

let installed_opam_opt st nv =
OpamStd.Option.Op.(
Expand Down
24 changes: 12 additions & 12 deletions src/state/opamEnv.ml
Original file line number Diff line number Diff line change
Expand Up @@ -185,18 +185,22 @@ let add (env: env) (updates: env_update list) =
in
env @ expand updates

let env_expansion ?opam st (name, op, str, cmt) =
let fenv v =
try OpamPackageVar.resolve st ?opam v
with Not_found ->
log "Undefined variable: %s" (OpamVariable.Full.to_string v);
None
in
let s = OpamFilter.expand_string ~default:(fun _ -> "") fenv str in
name, op, s, cmt

let compute_updates ?(force_path=false) st =
(* Todo: put these back into their packages!
let perl5 = OpamPackage.Name.of_string "perl5" in
let add_to_perl5lib = OpamPath.Switch.lib t.root t.switch t.switch_config perl5 in
let new_perl5lib = "PERL5LIB", "+=", OpamFilename.Dir.to_string add_to_perl5lib in
*)
let fenv ?opam v =
try OpamPackageVar.resolve st ?opam v
with Not_found ->
log "Undefined variable: %s" (OpamVariable.Full.to_string v);
None
in
let bindir =
OpamPath.Switch.bin st.switch_global.root st.switch st.switch_config
in
Expand All @@ -218,21 +222,17 @@ let compute_updates ?(force_path=false) st =
st.switch_global.root st.switch st.switch_config),
Some "Current opam switch man dir"]
in
let env_expansion ?opam (name,op,str,cmt) =
let s = OpamFilter.expand_string ~default:(fun _ -> "") (fenv ?opam) str in
name, op, s, cmt
in
let switch_env =
("OPAM_SWITCH_PREFIX", Eq,
OpamFilename.Dir.to_string
(OpamPath.Switch.root st.switch_global.root st.switch),
Some "Prefix of the current opam switch") ::
List.map env_expansion st.switch_config.OpamFile.Switch_config.env
List.map (env_expansion st) st.switch_config.OpamFile.Switch_config.env
in
let pkg_env = (* XXX: Does this need a (costly) topological sort? *)
OpamPackage.Set.fold (fun nv acc ->
match OpamPackage.Map.find_opt nv st.opams with
| Some opam -> List.map (env_expansion ~opam) (OpamFile.OPAM.env opam) @ acc
| Some opam -> List.map (env_expansion ~opam st) (OpamFile.OPAM.env opam) @ acc
| None -> acc)
st.installed []
in
Expand Down
3 changes: 3 additions & 0 deletions src/state/opamEnv.mli
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ val path: force_path:bool -> dirname -> switch -> string
val full_with_path:
force_path:bool -> ?updates:env_update list -> dirname -> switch -> env

(** Performs variable expansion on the strings in an environment update *)
val env_expansion: ?opam:OpamFile.OPAM.t -> 'a switch_state -> env_update -> env_update

(** {2 Shell and initialisation support} *)

(** Sets the opam configuration in the user shell, after detailing the process
Expand Down
38 changes: 38 additions & 0 deletions tests/reftests/env.test
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,41 @@ NV_VARS=''; export NV_VARS;
NV_VARS=hej!!
OPAM=${OPAM}
OPAM_SWITCH_PREFIX=${BASEDIR}/OPAM/conffile
### opam exec --no-switch -- env | grep "^NV_VARS|^OPAM_SWITCH_PREFIX|${OPAM}"
NV_VARS=/another/path
OPAM=${OPAM}
### : Buil environment variable expansion :
### <pkg:bde.1.2.3>
opam-version: "2.0"
build: [ "sh" "-c" "echo V$BDE_VERSION > pkg.version" ]
install: [ "cp" "pkg.version" "%{doc}%/pkg.version" ]
build-env: [ BDE_VERSION = "%{version}%" ]
### opam switch create build-env --empty
### opam install bde
The following actions will be performed:
=== install 1 package
- install bde 1.2.3

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> installed bde.1.2.3
Done.
### cat $OPAMROOT/build-env/doc/pkg.version
V1.2.3
### : root and switch with spaces :
### RT="$BASEDIR/root 2"
### SW="switch w spaces"
### OPAMNOENVNOTICE=0
### opam init -na --bare --bypass-check --disable-sandbox --root "$RT" defaut ./REPO
No configuration file found, using built-in defaults.

<><> Fetching repository information ><><><><><><><><><><><><><><><><><><><><><>
[defaut] Initialised
### opam switch create "./$SW" nv --root "$RT"

<><> Installing new switch packages <><><><><><><><><><><><><><><><><><><><><><>
Switch invariant: ["nv"]

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> installed nv.1
Done.
# Run eval $(opam env '--root=${BASEDIR}/root 2' '--switch=${BASEDIR}/switch w spaces') to update the current shell environment

0 comments on commit 2729dc4

Please sign in to comment.