I was thinking about what the package definitions would look like if we put pre-compiled files in package outputs instead of in their own packages. For example with a cl-xyz package having cl-abc as native input and cl-def as input: - cl-xyz package needs to propagate cl-abc and cl-def (sources). - cl-xyz:sbcl has cl-abc:sbcl as native input and cl-def:sbcl as input. - cl-xyz:ecl has cl-abc:ecl as native input and cl-def:ecl as input. So the package definition would look like: --8<---------------cut here---------------start------------->8--- (package ... (native-inputs `(("cl-abc-sbcl" ,cl-abc "sbcl") ("cl-abc-ecl" ,cl-abc "ecl"))) (inputs `(("cl-def-sbcl" ,cl-def "sbcl") ("cl-def-ecl" ,cl-def "ecl"))) (propagated-inputs `(("cl-abc" ,cl-abc) ("cl-def" ,cl-def))) ... ) --8<---------------cut here---------------end--------------->8--- It's a bit burdensome to write, but we could have a define-lisp-package macro taking a lighter package definition and transforming it a full package definition as above: --8<---------------cut here---------------start------------->8--- (define-lisp-package cl-xyz (package ... (native-inputs `(("cl-abc" ,cl-abc))) (inputs `(("cl-def" ,cl-def))) ... )) --8<---------------cut here---------------end--------------->8--- However, it would mean that installing only cl-xyz:sbcl would download the sbcl pre-compiled files and the ecl pre-compiled files for all the dependencies of cl-xyz (direct and transitive). The only way to prevent downloading all these unnecessary ecl pre-compiled files would be for the package definition to have a way to say "the sbcl outputs only depend on the sources and the sbcl outputs of the dependencies", but I don't think that's possible...