Hi, Given a package definition, eg icedtea-8's JDK, how can can I determine the location of the installed package in my /gnu/store? There doesn't seem to be anything on the package module itself, presumably because this is static data, and what I need is something to calculate the hash of the resulting install specific to my Guix? eg scheme@(guix-user) [3]> (package-outputs icedtea-8) $8 = ("out" "jdk" "doc") scheme@(guix-user) [3]> I'd like to return this location using the package name or definition as an input: /gnu/store/i3vf1a49m0abcjqza19mb4mkjmc6k60n-icedtea-3.7.0-jdk/ The aim is to use this to derivive the JDK include directories in a generic way for some scripts I'm writing, such that I don't need to update them each time the JDK hash changes after a guix pull. Cheers, Phil.
Hi ! This is where G-expressions will help you :) Basically the path you need does not exist in the same "strata" as the code of the package. The following code will define a build-gexp function that evaluates a G-expression and prints the resulting directory in the store. You can try it in "guix repl" or with "guix build -f FILE" https://guix.gnu.org/manual/en/guix.html#G_002dExpressions A G-exp begins with #~ and withing the following expr, any piece of code prefixed by #$ is recursively replaced by its value, but only if this value is a primitive value (string, int,...) or a package. If it is a package, it gets replaced by the path in the store of that package. So to give a short answer, run the following into the REPL to get your path: (use-modules (guix gexp) (guix store) (guix derivations) (gnu packages java)) (define (build-gexp gexp) "Build GEXP using the local daemon." (let ((derivation (run-with-store (open-connection) (gexp->derivation "noname" gexp)))) (build-derivations (open-connection) (list derivation)) (derivation-output-path (assoc-ref (derivation-outputs derivation) "out")))) (build-gexp (with-imported-modules '((guix build utils)) #~(begin (use-modules (guix build utils)) (mkdir-p (string-append #$output "/bin")) (with-output-to-file (string-append #$output "/bin/helloworld.sh") (lambda _ (display (string-append "Iced tea lives at:" #$icedtea-8))))))) This wil output a path, in my case /gnu/store/vv5sc5l488xxysyz88aadjj3fwnqr2xa-noname and in it you'll have the file: /gnu/store/vv5sc5l488xxysyz88aadjj3fwnqr2xa-noname/bin/helloworld.sh which contains Iced tea lives at:/gnu/store/vaqdvsqdv5mads38dp6pc5827pdgnmb3-icedtea-3.7.0 Given your stated use case, you may be interested in the following upcoming patch: https://issues.guix.gnu.org/48277 It will let you wrap any executable in the appropriate env vars, so I guess you will be able to do something like #$(wrap-in-search-paths #~(string-append #$output "/bin/your-script") (list icedtea-8)) Hopefully icedtea-8 sets the correct search paths, but I believe it does. Cheers, Edouard. Phil Beadling writes: > Hi, > > Given a package definition, eg icedtea-8's JDK, how can can I determine the > location of the installed package in my /gnu/store? > > There doesn't seem to be anything on the package module itself, presumably > because this is static data, and what I need is something to calculate the > hash of the resulting install specific to my Guix? > > eg > scheme@(guix-user) [3]> (package-outputs icedtea-8) > $8 = ("out" "jdk" "doc") > scheme@(guix-user) [3]> > > I'd like to return this location using the package name or definition as an > input: > /gnu/store/i3vf1a49m0abcjqza19mb4mkjmc6k60n-icedtea-3.7.0-jdk/ > > The aim is to use this to derivive the JDK include directories in a generic > way for some scripts I'm writing, such that I don't need to update them > each time the JDK hash changes after a guix pull. > > Cheers, > Phil.
[-- Attachment #1: Type: text/plain, Size: 1486 bytes --] On Sat, 15 May 2021 03:28:01 +0100 Phil Beadling <phil@beadling.co.uk> wrote: > Given a package definition, eg icedtea-8's JDK, how can can I > determine the location of the installed package in my /gnu/store? [..] > The aim is to use this to derivive the JDK include directories in a > generic way for some scripts I'm writing, such that I don't need to > update them each time the JDK hash changes after a guix pull. In your store, there will be probably many icedtea-8's lying around, because you or another user on your system updated it several times or even compiled it with different sources. Even when you say you want to to get the hash of what "guix pull" currently has (see Edouard's answer), that might be different from what is in your current profile, because you haven't executed yet a "guix package -u", or you have several profiles around with different versions/states. From a practical perspective, what I have for the JDK: I put different versions in different profiles, like: guix package -i icedtea@3:jdk -p ~/extra-profiles/jdk8 guix package -i openjdk@11:jdk -p ~/extra-profiles/jdk11 (if you want to have the profile in your path, source it as the command-output tells you, or at it to your bashrc) Then I can set the JAVA_HOME variable to JAVA_HOME=~/extra-profiles/jdk11 to use JDK 11. Also in Eclipse in the preferences, you can add different installed JREs. I use this to point to my extra-profile. Björn [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 195 bytes --]
>
> Thanks for both answers on this - it's been an interesting rabbit hole.
> Edouard's script gave me the version of icedtea-8 exactly as sourced by:
>
guix environment --ad-hoc icedtea:jdk
I managed to simplify the script down to a one-liner - giving the same
version as Edourard's:
(display (run-with-store (open-connection) (package-file icedtea-8 #:output
"jdk")))
Bjoern was correct that this was not the version I was looking for - but
having rethought my dependency issue - I managed to solve it a different
way using substitute* to patch the relevent files at build-time.
Still, I learnt quite a bit about the gexps, the store, and patching - so
time well spent - thanks again :-)
Hello Phil, Phil Beadling <phil@beadling.co.uk> writes: > Hi, > > Given a package definition, eg icedtea-8's JDK, how can can I determine the > location of the installed package in my /gnu/store? > > There doesn't seem to be anything on the package module itself, presumably > because this is static data, and what I need is something to calculate the > hash of the resulting install specific to my Guix? From the command line API, the way to retrieve a package's store file name is by doing: $ guix build package > The aim is to use this to derivive the JDK include directories in a generic > way for some scripts I'm writing, such that I don't need to update them > each time the JDK hash changes after a guix pull. If you prefer to use the Guix API from Guile, you could use something like: --8<---------------cut here---------------start------------->8--- (use-modules (guix derivations) (guix gexp) (guix store) (gnu packages base)) (let* ((hello-drv (with-store store (run-with-store store (lower-object hello)))) (hello-store-path (derivation->output-path hello-drv))) (format #t "~a~%" hello-store-path) hello-store-path) --8<---------------cut here---------------end--------------->8--- HTH! Maxim