From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ricardo Wurmus Subject: Re: [PATCH 2/2] profiles: Build GTK+ input module cache. Date: Sun, 30 Oct 2016 08:05:42 +0100 Message-ID: <87bmy29v09.fsf@elephly.net> References: <20160922202827.22039-1-rekado@elephly.net> <20160922202827.22039-2-rekado@elephly.net> <878tuekjma.fsf@gnu.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:41849) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c0kDK-0002tc-SH for guix-devel@gnu.org; Sun, 30 Oct 2016 03:07:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c0kDJ-0003Ve-S5 for guix-devel@gnu.org; Sun, 30 Oct 2016 03:07:30 -0400 In-reply-to: <878tuekjma.fsf@gnu.org> List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: "Guix-devel" To: Ludovic =?utf-8?Q?Court=C3=A8s?= Cc: guix-devel@gnu.org Hi Ludo, I had already pushed the change by the time I got this email, and then I forgot to reply to it in time. While trying to clean up my massive Guix inbox I stumbled upon this unreplied email. My apologies for the delay! Ludovic Courtès writes: > Ricardo Wurmus skribis: > >> * guix/profiles.scm (gtk-im-modules): New procedure. >> (%default-profile-hooks): Add it. > > Very nice! > >> +(define (gtk-im-modules manifest) >> + "Return a derivation that builds the cache files for input method modules >> +for both major versions of GTK+." >> + >> + (mlet %store-monad ((gtk+ (manifest-lookup-package manifest "gtk+" "3")) >> + (gtk+-2 (manifest-lookup-package manifest "gtk+" "2"))) >> + >> + (define (build gtk gtk-version) >> + (let ((major (string-take gtk-version 1))) > > Rather: (version-prefix gtk-version 1). Okay. >> + ;; Generate a new 'immodules.cache' file. >> + (let ((pipe (apply open-pipe* >> + OPEN_READ query >> + (map readlink (find-files destdir "\\.so$")))) >> + (outfile (string-append #$output prefix >> + "/immodules-gtk" #$major ".cache"))) >> + (dynamic-wind >> + (const #t) >> + (lambda () >> + (call-with-output-file outfile >> + (lambda (out) >> + (while (not (eof-object? (peek-char pipe))) >> + (write-char (read-char pipe) out)))) >> + #t) >> + (lambda () >> + (close-pipe pipe))))))))) > > What about something along these lines instead: > > (define result > (call-with-output-file "immodules.cache" > (lambda (port) > (close-fdes 1) > (dup->fdes port 1) > (system* query …)))) > > ;; Fail when gtk-immodules-query fails. > (zero? result) This does indeed look nicer. I’ll put this on my TODO list and revisit the code at a later point in time. >> + ;; Don't run the hook when there's nothing to do. >> + (let ((gexp #~(begin >> + #$(if gtk+ (build gtk+ "3.0.0") #t) >> + #$(if gtk+-2 (build gtk+-2 "2.10.0") #t)))) > > Simply: > > (let ((gexp (cond (gtk+ (build gtk+ "3.0.0")) > (gtk+-2 (built gtk+-2 …)) > (else #f)))) > …) Here I’m building one big gexp containing what’s needed for whatever version of GTK is installed in the profile. Your version would pick only one of the expressions for a single version, which doesn’t cover the case where both are installed. > We should avoid the hardcoded version numbers though. I agree but I don’t know how to avoid this elegantly. These numbers seem almost arbitrary. Since we only have two major versions at this point I don’t think it’s worth trying to generalise this. ~~ Ricardo