From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id 6DBLDcj9VV9eNwAA0tVLHw (envelope-from ) for ; Mon, 07 Sep 2020 09:30:48 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id 2A6YCMj9VV+xJwAAB5/wlQ (envelope-from ) for ; Mon, 07 Sep 2020 09:30:48 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id B4081940142 for ; Mon, 7 Sep 2020 09:30:47 +0000 (UTC) Received: from localhost ([::1]:52118 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kFDU6-00082R-ON for larch@yhetil.org; Mon, 07 Sep 2020 05:30:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:36942) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kFDTy-00082K-95 for guix-devel@gnu.org; Mon, 07 Sep 2020 05:30:38 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:39087) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kFDTx-0004EC-Vn; Mon, 07 Sep 2020 05:30:37 -0400 Received: from [2001:660:6102:320:e120:2c8f:8909:cdfe] (port=54810 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1kFDTx-0001SG-An; Mon, 07 Sep 2020 05:30:37 -0400 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Maxim Cournoyer Subject: Re: Dependency cycle issues when using a Gexp-based snippet References: <87h7ssx07p.fsf@gmail.com> <87wo1nzr6p.fsf@gnu.org> <87mu286wt0.fsf@gmail.com> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 22 Fructidor an 228 de la =?utf-8?Q?R=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Mon, 07 Sep 2020 11:30:32 +0200 In-Reply-To: <87mu286wt0.fsf@gmail.com> (Maxim Cournoyer's message of "Wed, 02 Sep 2020 11:08:27 -0400") Message-ID: <877dt6orwn.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-BeenThere: guix-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: guix-devel Errors-To: guix-devel-bounces+larch=yhetil.org@gnu.org Sender: "Guix-devel" X-Scanner: scn0 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of guix-devel-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-devel-bounces@gnu.org X-Spam-Score: -1.01 X-TUID: KIjWpxUtOoQp Hi Maxim, Maxim Cournoyer skribis: >>> Attempting a suggested fix by Ludovic in that same conversation [0], >>> namely, making the snippet field of the record a thunked one: >>> >>> modified guix/packages.scm >>> @@ -250,7 +250,8 @@ as base32. Otherwise, it must be a bytevector." >>> (patches origin-patches ; list of file names >>> (default '()) (delayed)) >>> >>> - (snippet origin-snippet (default #f)) ; sexp or #f >>> + (snippet origin-snippet >>> + (default #f) (thunked)) ; sexp or #f >>> (patch-flags origin-patch-flags ; list of strings >>> (default '("-p1"))) >> >> We should check what this change costs in CPU and memory, but it=E2=80= =99s >> probably worth it. As Marius noted before, the snippets for >> ungoogled-chromium and linux-libre are contrived because of this >> limitation. (Perhaps we can use =E2=80=98delayed=E2=80=99 instead of = =E2=80=98thunked=E2=80=99.) > > What is the difference between delayed and thunked? Would a thunked > capture the closure of its environment while delayed not? Is the > closure useful to access record-bound values such as the version field > of a package? =E2=80=98Thunk=E2=80=99 uses an actual thunk (zero-argument procedure) that= =E2=80=99s called each time the field is accessed; =E2=80=98delayed=E2=80=99 uses a promise, = which is similar except that the result is memoized (info "(guile) Delayed Evaluation"). > I checked the usage at compilation and run time, using the 'time' > command (aliased to time+ on my system), and didn't find any meaningful > difference whether the snippet is made a thunked or delayed field, or > none (current situation): > > On current master: > > time+ make -j8 > 2436.29user 56.47system 14:29.36elapsed 286%CPU (0avgtext+0avgdata 870828= maxresident)k > 5480inputs+405952outputs (71major+320522minor)pagefaults 0swaps > > time+ ./pre-inst-env guix package -A | wc -l > 9.87user 0.24system 0:06.51elapsed 155%CPU (0avgtext+0avgdata 281564maxre= sident)k > 0inputs+0outputs (0major+25636minor)pagefaults 0swaps > 14702 What would be interesting is a comparison of the performance of =E2=80=98package-derivation=E2=80=99, which can be done with something like: time guix build -d --no-grafts libreoffice pandoc For memory consumption, try: GUIX_PROFILING=3Dgc guix build -d --no-grafts libreoffice pandoc >> + (snippet >> + (with-imported-modules '((guix build utils)) >> + #~(begin >> + (use-modules (guix build utils)) >> + ;; corelib uses bundled harfbuzz, md4, md5, sha3 >> + (with-directory-excursion "src/3rdparty" >> + (for-each delete-file-recursively >> + (list "double-conversion" "freetype" "= harfbuzz-ng" >> + "libpng" "libjpeg" "pcre2" "sqli= te" "xcb" >> + "zlib"))) >> + >> + (let ((coreutils #+(canonical-package coreutils))) >> + (substitute* "configure" >> + (("/bin/pwd") >> + (string-append coreutils "/bin/pwd"))) >> + (substitute* "src/corelib/global/global.pri" >> + (("/bin/ls") >> + (string-append coreutils "/bin/ls")))) >> + #t))))) >> >> Such substitutions are system-dependent; thus, they should be made in a >> phase, not in a snippet. Perhaps we=E2=80=99ll sidestep the issue altog= ether? >> :-) > > Indeed. I didn't consider this aspect well. Apart from being > inefficient (the sources of a package would be different for each > system) it would still technically work, no? It would work, but it=E2=80=99s =E2=80=9Cnot the right place=E2=80=9D for t= hat, aesthetically. (Note that when there=E2=80=99s a snippet, we get different derivations for= each system anyway.) Thanks, Ludo=E2=80=99.