From 5009e3d94a2182c976c4f240caeacf21978300ed Mon Sep 17 00:00:00 2001 From: Harmen Stoppels Date: Wed, 12 Oct 2022 23:30:00 +0200 Subject: env depfile: allow deps only install (#33245) * env depfile: allow deps only install - Refactor `spack env depfile` to use a Jinja template, making it a bit easier to follow as a human being. - Add a layer of indirection in the generated Makefile through an `/.install-deps/` target, which allows one to specify different options when installing dependencies. For example, only verbose/debug mode on when installing some particular spec: ``` $ spack -e my_env env depfile -o Makefile --make-target-prefix example $ make example/.install-deps/ -j16 $ make example/.install/ SPACK="spack -d" SPACK_INSTALL_FLAGS=--verbose -j16 ``` This could be used to speed up `spack ci rebuild`: - Parallel install of dependencies from buildcache - Better readability of logs, e.g. reducing verbosity when installing dependencies, and splitting logs into deps.log and current_spec.log * Silence please! --- share/spack/templates/depfile/Makefile | 37 ++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 share/spack/templates/depfile/Makefile (limited to 'share') diff --git a/share/spack/templates/depfile/Makefile b/share/spack/templates/depfile/Makefile new file mode 100644 index 0000000000..a149951d9f --- /dev/null +++ b/share/spack/templates/depfile/Makefile @@ -0,0 +1,37 @@ +SPACK ?= spack + +.PHONY: {{ all_target }} {{ clean_target }} + +{{ all_target }}: {{ env_target }} + +{{ env_target }}: {{ root_install_targets }} + @touch $@ + +{{ dirs_target }}: + @mkdir -p {{ install_target }} {{ install_deps_target }} + +# The spack install commands are of the form: +# spack -e my_env --no-add --only=package --only=concrete /hash +# This is an involved way of expressing that Spack should only install +# an individual concrete spec from the environment without deps. +{{ install_target }}/%: {{ install_deps_target }}/% | {{ dirs_target }} + $(info Installing $(SPEC)) + {{ jobserver_support }}$(SPACK) -e '{{ environment }}' install $(SPACK_INSTALL_FLAGS) --only-concrete --only=package --no-add /$(notdir $@) + @touch $@ + +# Targets of the form {{ install_deps_target }}/ install dependencies only +{{ install_deps_target }}/%: | {{ dirs_target }} + @touch $@ + +# Set a human-readable SPEC variable for each target that has a hash +{% for (hash, name) in hash_with_name -%} +{{ any_hash_target }}/{{ hash }}: SPEC = {{ name }} +{% endfor %} + +# The Spack DAG expressed in targets: +{% for (target, prereqs) in targets_to_prereqs -%} +{{ target }}: {{prereqs}} +{% endfor %} + +{{ clean_target }}: + rm -rf {{ env_target }} {{ all_install_targets }} {{ all_install_deps_targets }} -- cgit v1.2.3-60-g2f50