From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2.migadu.com ([2001:41d0:303:e224::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms13.migadu.com with LMTPS id KHHDB8XVJGdnHAAAe85BDQ:P1 (envelope-from ) for ; Fri, 01 Nov 2024 13:21:09 +0000 Received: from aspmx1.migadu.com ([2001:41d0:303:e224::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2.migadu.com with LMTPS id KHHDB8XVJGdnHAAAe85BDQ (envelope-from ) for ; Fri, 01 Nov 2024 14:21:09 +0100 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=fail ("body hash did not verify") header.d=debbugs.gnu.org header.s=debbugs-gnu-org header.b=knHKkKCt; dkim=fail ("body hash did not verify") header.d=gmail.com header.s=20230601 header.b=bwjWW5C3; dmarc=fail reason="SPF not aligned (relaxed)" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" ARC-Seal: i=1; s=key1; d=yhetil.org; t=1730467268; a=rsa-sha256; cv=none; b=kNKLWhgjCjeYI9NTEYDl4LaUO2Nur4QdIs7j7YiAffq/tmeR3+rO0GvIHoyRSx7nIxxVz4 L8WPOnEztg9UMbh1JHP/0qtjMN7ssbPwXgn7VpnhsBUgvp06sgxc2DNxiWSMwEN7YZmKTj 6UZqjcd/fZFHcuOFVVVSDVT737wwVpxnr8YDe8X2QTCg1AxUfQ0UlLY5rGWvpn/zqkLA7Q qZ/R5X3mYbf56IJNMTSjhwMjWY68q1zbSSfFV3NdkO7knOy8OxRBeR98xTtrlr7TSc+O4U 0CTaDTNUsPwIUUYg+isepOKvv+LfD1hKlXXgrX2ELT3XgdUkq7raGVwAVedJIA== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("body hash did not verify") header.d=debbugs.gnu.org header.s=debbugs-gnu-org header.b=knHKkKCt; dkim=fail ("body hash did not verify") header.d=gmail.com header.s=20230601 header.b=bwjWW5C3; dmarc=fail reason="SPF not aligned (relaxed)" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1730467268; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:resent-cc: resent-from:resent-sender:resent-message-id:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=CGAYZ8hWoX88RL8sjWa8fiY2dRJc8Njv3D4fmR6RQJs=; b=XlTW7bHlU8GwzrqY+he8hi9f5+rXJ23QjjswIGRIQDR25Czix9DY268qFRIjrgTt5r0PzH Dgm3PI7+/uVEvDSykvmQ0PbWKaAdjcXp0iiEfJCdE2PwlHafCWbdVR32iOjxPBA2kqaIfi u11NNRsb0HkS6kMphYK41FulXZBM/sNoheG5TjKqqzZxomgH3YCKRAD6YfBjoCK3KjX1jL 4IVJYddnthm2K1nLmH4R6iwCuYhba7iVMrwnO7uqaVffSWug/3IRQ9WHYttjfWmQnn82dm EYLJTCWZQjEoxXdT+jH+L9ApnExXuSrA8cF9zRXZzxxIQL8A4GxRDbEDV79UwA== 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 7FB431A96D for ; Fri, 01 Nov 2024 14:21:08 +0100 (CET) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1t6raJ-00070A-SJ; Fri, 01 Nov 2024 09:21:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t6raI-0006z3-LF for guix-patches@gnu.org; Fri, 01 Nov 2024 09:21:02 -0400 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1t6raI-0006LD-CQ for guix-patches@gnu.org; Fri, 01 Nov 2024 09:21:02 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=MIME-Version:Date:References:In-Reply-To:From:To:Subject; bh=Kwf3IQyY5SDG/KrS8S6gexSvRPZa2sM8ArGX/YQvVWo=; b=knHKkKCtjnrWhy9uuNjFqhGVtgDvTPJmK0GCF3wVyw8gHOfcUOGuAIdWbBEfMWpXcz1XjkVNGX5IHbi8CQvS20+S1T/gLtd9HcfJ89vaRErPhZ0y4lm+i4JYicg0kPS1IGKOvJSuFW5k1lS8KSOv6P9hBuqGNQLQOJCYciVaOrmWWnVoA2/Eglpdn14EP8g86dx28tuPRAc1geADt4lSnR4X+J4mXvWNmp3dq4Ht60pwhPPUaW98OUMHnFNHHDB+asKeLhv3x2meoN+OV87IU82t0keh0wxYiWdOqD5DsYuCxTNrfrQBiRZlbLkqyP26sKSrmXrsS2Kg74wgcFsqhA==; Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1t6raI-0000iD-0D for guix-patches@gnu.org; Fri, 01 Nov 2024 09:21:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#73842] [PATCH v2 2/3] pack: Add support for AppImage pack format. Resent-From: Maxim Cournoyer Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Fri, 01 Nov 2024 13:21:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 73842 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: =?UTF-8?Q?No=C3=A9?= Lopez Cc: Josselin Poiret , 73842@debbugs.gnu.org, Simon Tournier , Mathieu Othacehe , Ludovic =?UTF-8?Q?Court=C3=A8s?= , Tobias Geerinckx-Rice , Sebastian =?UTF-8?Q?D=C3=BCmcke?= , Christopher Baines Received: via spool by 73842-submit@debbugs.gnu.org id=B73842.17304672442720 (code B ref 73842); Fri, 01 Nov 2024 13:21:01 +0000 Received: (at 73842) by debbugs.gnu.org; 1 Nov 2024 13:20:44 +0000 Received: from localhost ([127.0.0.1]:49447 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t6rZz-0000ho-0b for submit@debbugs.gnu.org; Fri, 01 Nov 2024 09:20:44 -0400 Received: from mail-il1-f182.google.com ([209.85.166.182]:54491) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t6rZv-0000hd-4e for 73842@debbugs.gnu.org; Fri, 01 Nov 2024 09:20:41 -0400 Received: by mail-il1-f182.google.com with SMTP id e9e14a558f8ab-3a394418442so6972925ab.0 for <73842@debbugs.gnu.org>; Fri, 01 Nov 2024 06:20:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1730467178; x=1731071978; darn=debbugs.gnu.org; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:in-reply-to:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Kwf3IQyY5SDG/KrS8S6gexSvRPZa2sM8ArGX/YQvVWo=; b=bwjWW5C38S/0Kf2Z5HFWD5ba/e166599J+cv2QtojmA0A4Ah0ZishZkkBOWwGp8R3X tfgWJ00YrAHrdp3YuQD28+k7wtMyI13B2bm0sqPSrcG11dr9KDBCkvRiJvqbBpBKxHyd o34N34hVf8oASJsHH8xptEPT+1kbRbDWWFbrbChpl73tZkt2zr0YdEhKtD3UjWHkECvn 6LZV6Vx4/GU9g8IoaekT/TWd1Ox22e8GWM4xLRLRXiLdmM/uvtfTFIA8fvqXPiUJ5xga 5cq7FFMY7A5/DDRvThx6Z2J5Wh7anuwCbQ2zlKl6kowz9C921bTIsTeNlJWaLH8979U4 pJiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1730467178; x=1731071978; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:in-reply-to:subject:cc:to:from:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Kwf3IQyY5SDG/KrS8S6gexSvRPZa2sM8ArGX/YQvVWo=; b=icRorw//bmLkxj9j//qDyTg17eQClhK+0NO5A79Vo8dQS8z8Tm+p9fiHW9xUZeF3h5 tdUwIeDOJ35O90jkPkS372oUIFyWAdaKObu6+l+C9fjcCszc+M61YTcS6n5f4aznvHbN YdJd2dv0RqrjPTOE88enYrQ+t7cl64+OzlLhKe8R91U1QsA2tJMv+PwYcNmXkJ0r4oj+ n1I7c44LbVFv4y2zF3Ny+7i7bjw40yzHS+GJ/v68wjbxJzFk4pJtDskbHRKWUVA9EGCR abs8G6oJmdcTRjM/SbkeuHZTBEdSAioriXSc6RfDB3XfzTloIyNsViAKHt3Q1gWM2Fta cTIg== X-Gm-Message-State: AOJu0Yz6Jd9MijQGj5/oRDUq8rJgdylKIfy1lxH/jwH/2POPRdNFp8+D /q0Jdtgx/JqDiUPNoVrbWc3/vdIjOvA9N+SjFaabW+JLMZAWypJx X-Google-Smtp-Source: AGHT+IELnTD5vQwKcq/RKvbjeHQLVVPl4eAan0PZCQVwcSfZ5c+tTTSzVA1bo9Z4Gt/Hi8yFOS6rNQ== X-Received: by 2002:a92:ca4a:0:b0:3a5:e1f5:1572 with SMTP id e9e14a558f8ab-3a6b03b37e0mr35781445ab.22.1730467178126; Fri, 01 Nov 2024 06:19:38 -0700 (PDT) Received: from terra ([2405:6586:be0:0:c8ff:1707:9b9:af89]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7ee45a0f4e3sm2438846a12.87.2024.11.01.06.19.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 01 Nov 2024 06:19:37 -0700 (PDT) From: Maxim Cournoyer In-Reply-To: ("=?UTF-8?Q?No=C3=A9?= Lopez"'s message of "Sat, 26 Oct 2024 19:28:10 +0200") References: Date: Fri, 01 Nov 2024 22:19:32 +0900 Message-ID: <87frob147v.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: guix-patches-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US X-Migadu-Spam-Score: 3.14 X-Spam-Score: 3.14 X-Migadu-Queue-Id: 7FB431A96D X-Migadu-Scanner: mx12.migadu.com X-TUID: hKL45jDoJjRT Hi, No=C3=A9 Lopez writes: > From: Sebastian D=C3=BCmcke > > * guix/scripts/pack.scm: Add Appimage format. > * doc/guix.texi: Document AppImage pack. > > Co-authored-by: No=C3=A9 Lopez Thanks for this great addition. > Change-Id: I33ebfec623cff1cfcd6f029d2d3054c23ab1949a > --- > doc/guix.texi | 55 +++++++++++++++++++++- > guix/scripts/pack.scm | 104 +++++++++++++++++++++++++++++++++++++++++- > tests/pack.scm | 41 ++++++++++++++++- > 3 files changed, 197 insertions(+), 3 deletions(-) > > diff --git a/doc/guix.texi b/doc/guix.texi > index ac3a7adef0..18edf8e550 100644 > --- a/doc/guix.texi > +++ b/doc/guix.texi > @@ -6949,6 +6949,18 @@ Invoking guix pack > environment}, using commands like @command{singularity shell} or > @command{singularity exec}. > > +@cindex AppImage, create an AppImage file with @command{guix pack} > +Another format internally based on SquashFS is > +@uref{https://appimage.org/, AppImage}. An AppImage file can be made > +executable and run without any special privileges: > + > +@example > +guix pack -f appimage --entry-point=3Dbin/guile guile > +cp @var{file} . && chmod u+x $(basename @var{file}) > +./$(basename @var{file}) --help > +@end example > +where @var{file} is the image returned by @command{guix pack}. The chmod is no longer needed in this v2. Also, it could be nicer perhaps to capture the output file in a real variable: @example file=3D$(guix pack -f appimage --entry-point=3Dbin/guile guile) $file @end example > + > Several command-line options allow you to customize your pack: > > @table @code > @@ -7065,6 +7077,47 @@ Invoking guix pack > installation or other, non-rpm packs. > @end quotation > > +@item appimage > +@cindex AppImage, create an AppImage file with @command{guix pack} > +This produces an AppImage file with the @samp{.AppImage} extension. > +AppImage is a SquashFS volume prefixed with a runtime that mounts the > +SquashFS file system and executes the binary provided with > +@option{--entry-point}. This results in a self-contained archive that > +bundles the software and all its requirements into a single file. When > +the file is made executable it runs the packaged software. > + > +@example > +guix pack -f appimage --entry-point=3Dbin/vlc vlc > +@end example > + > +The runtime used by AppImages makes use of libfuse to mount the image > +quickly. If libfuse is not available, the AppImage can still be started > +using the @option{--appimage-extract-and-run} flag. > + > +@quotation Warning > + When building an AppImage, always @emph{pass} the > +@option{--relocatable} option (or @option{-R}, or @option{-RR}) to make > +sure the image can be used on systems where Guix is not installed. A > +warning is printed when this option is not used. Instead of a warning, could we just make it always -RR by default and document that these are always relocatable, by design? The no relocatable flags would be treated as an implicit -RR, and otherwise a single -R would be treated as a single -R (and -RR as -RR, eh). > +@end quotation > + > +@example > +guix pack -f appimage --entry-point=3Dbin/hello --relocatable hello > +@end example > + > +@quotation Note > +The resulting AppImage does not conform to the complete standard as it > +currently does not contain a @file{.DirIcon} file. This does not impact > +functionality of the AppImage itself, but possibly that of software used > +to manage AppImages. > +@end quotation Are there plans to add support for .DirIcon in the future? > +@quotation Note > +As the generated AppImage packages the complete dependency graph, it > +will be larger than comparable AppImage files found online, which depend > +on host system libraries. > +@end quotation > + > @end table > > @cindex relocatable binaries > @@ -7155,7 +7208,7 @@ Invoking guix pack > @cindex entry point, for Docker and Singularity images > @item --entry-point=3D@var{command} > Use @var{command} as the @dfn{entry point} of the resulting pack, if the= pack > -format supports it---currently @code{docker} and @code{squashfs} (Singul= arity) > +format supports it---currently @code{docker}, @code{appimage} and @code{= squashfs} (Singularity) > support it. @var{command} must be relative to the profile contained in = the > pack. > > diff --git a/guix/scripts/pack.scm b/guix/scripts/pack.scm > index 7c5fe76fe0..95b40a743b 100644 > --- a/guix/scripts/pack.scm > +++ b/guix/scripts/pack.scm > @@ -10,6 +10,8 @@ > ;;; Copyright =C2=A9 2022 Alex Griffin > ;;; Copyright =C2=A9 2023 Graham James Addis > ;;; Copyright =C2=A9 2023 Oleg Pykhalov > +;;; Copyright =C2=A9 2024 Sebastian D=C3=BCmcke > +;;; Copyright =C2=A9 2024 No=C3=A9 Lopez > ;;; > ;;; This file is part of GNU Guix. > ;;; > @@ -56,6 +58,7 @@ (define-module (guix scripts pack) > #:use-module ((gnu packages compression) #:hide (zip)) > #:use-module (gnu packages guile) > #:use-module (gnu packages base) > + #:autoload (gnu packages appimage) (appimage-type2-runtime) > #:autoload (gnu packages gnupg) (guile-gcrypt) > #:autoload (gnu packages guile) (guile2.0-json guile-json) > #:use-module (srfi srfi-1) > @@ -64,6 +67,7 @@ (define-module (guix scripts pack) > #:use-module (srfi srfi-35) > #:use-module (srfi srfi-37) > #:use-module (ice-9 match) > + #:use-module (ice-9 optargs) > #:export (symlink-spec-option-parser > > self-contained-tarball > @@ -71,6 +75,7 @@ (define-module (guix scripts pack) > rpm-archive > docker-image > squashfs-image > + self-contained-appimage > > %formats > guix-pack)) > @@ -974,8 +979,100 @@ (define* (rpm-archive name profile > (gexp->derivation (string-append name ".rpm") build > #:target target > #:references-graphs `(("profile" ,profile)))) > + > +;;; > +;;; AppImage format > +;;; > +(define* (self-contained-appimage name profile > + #:key target > + (profile-name "guix-profile") > + entry-point > + (compressor (lookup-compressor "zstd")) > + localstatedir? > + (symlinks '()) > + (archiver tar) > + (extra-options '())) > + "Return a self-contained AppImage containing a store initialized with = the > +closure of PROFILE, a derivation. The AppImage contains /gnu/store unle= ss > +RELOCATABLE option is used; if LOCALSTATEDIR? is true, it also contains > +/var/guix, including /var/guix/db with a properly initialized store data= base. > + > +SYMLINKS must be a list of (SOURCE -> TARGET) tuples denoting symlinks t= o be > +added to the pack." > + (unless entry-point > + (leave (G_ "entry-point must be provided in the '~a' format~%") > + 'appimage)) > + (let-keywords extra-options #f ((relocatable? #f)) > + (unless relocatable? > + (warning (G_ "AppImages should be built with the --relocatable fla= g~%")))) > + > + (define runtime-package appimage-type2-runtime) > + (define runtime-path "bin/runtime-fuse3") > + (define %valid-compressors '("gzip" "zstd")) > + > + (let ((compressor-name (compressor-name compressor))) > + (unless (member compressor-name %valid-compressors) > + (leave (G_ "~a is not a valid squashfs archive compressor used in > +generating the AppImage. Valid compressors are: ~a~%") > + compressor-name > + %valid-compressors))) > > - > + (define builder > + (with-extensions (list guile-gcrypt) > + (with-imported-modules (source-module-closure > + '((guix build store-copy) > + (guix build utils)) > + #:select? not-config?) > + #~(begin > + (use-modules (guix build utils) > + (guix build store-copy) > + (rnrs io ports) > + (srfi srfi-1) > + (srfi srfi-26)) > + > + (define (concatenate-files result file1 file2) > + "Creates a new file RESULT containing FILE1 followed by FI= LE2." > + (call-with-output-file result > + (lambda (output) > + (call-with-input-file file1 > + (lambda (input) > + (dump-port input output))) > + (call-with-input-file file2 > + (lambda (input) > + (dump-port input output)))))) > + > + (let* ((appdir "AppDir") > + (squashfs "squashfs") > + (profile-items (map store-info-item > + (call-with-input-file "profile" r= ead-reference-graph))) > + (profile (find (lambda (item) > + (string-suffix? "-profile" item)) > + profile-items))) > + (mkdir-p appdir) > + ;; copy all store items from the profile to the AppDir > + (populate-store '("profile") appdir) > + ;; symlink the provided entry-point to AppDir/AppRun > + (symlink (string-append "." profile "/" #$entry-point) > + (string-append appdir "/AppRun")) > + ;; create .desktop file as required by the spec > + (make-desktop-entry-file > + (string-append appdir "/" #$name ".desktop") > + #:name #$name > + #:exec #$entry-point) > + ;; compress the AppDir > + (invoke #+(file-append squashfs-tools "/bin/mksquashfs") a= ppdir > + squashfs "-root-owned" "-noappend" > + "-comp" #+(compressor-name compressor)) > + ;; append runtime and squashFS into file AppImage > + (concatenate-files #$output > + #$(file-append runtime-package "/" runt= ime-path) > + squashfs) > + ;; add execution permission Standalone comments (those starting on their own line with ;;) should be fully punctuated (complete sentence), e.g.: "Add execution permission." for the last one. > + (chmod #$output #o555)))))) > + (gexp->derivation (string-append name ".AppImage") builder > + #:target target > + #:references-graphs `(("profile" ,profile)))) > + > ;;; > ;;; Compiling C programs. > ;;; > @@ -1311,6 +1408,7 @@ (define %formats > (squashfs . ,squashfs-image) > (docker . ,docker-image) > (deb . ,debian-archive) > + (appimage . ,self-contained-appimage) > (rpm . ,rpm-archive))) > > (define (show-formats) > @@ -1327,6 +1425,8 @@ (define (show-formats) > deb Debian archive installable via dpkg/apt")) > (display (G_ " > rpm RPM archive installable via rpm/yum")) > + (display (G_ " > + appimage AppImage self-contained and executable format")) > (newline)) > > (define (required-option symbol) > @@ -1694,6 +1794,8 @@ (define-command (guix-pack . args) > (process-file-arg opts 'preun= -file) > #:postun-file > (process-file-arg opts 'postu= n-file))) > + ('appimage > + (list #:relocatable? relocatable?)) > (_ '()))) > (target (assoc-ref opts 'target)) > (bootstrap? (assoc-ref opts 'bootstrap?)) > diff --git a/tests/pack.scm b/tests/pack.scm > index f8a9e09c28..6ac9a966af 100644 > --- a/tests/pack.scm > +++ b/tests/pack.scm > @@ -3,6 +3,7 @@ > ;;; Copyright =C2=A9 2018 Ricardo Wurmus > ;;; Copyright =C2=A9 2021, 2023 Maxim Cournoyer > ;;; Copyright =C2=A9 2023 Oleg Pykhalov > +;;; Copyright =C2=A9 2024 No=C3=A9 Lopez > ;;; > ;;; This file is part of GNU Guix. > ;;; > @@ -32,7 +33,8 @@ (define-module (test-pack) > #:use-module (guix utils) > #:use-module ((guix build utils) #:select (%store-directory)) > #:use-module (gnu packages) > - #:use-module ((gnu packages base) #:select (libc-utf8-locales-for-targ= et)) > + #:use-module ((gnu packages base) #:select (libc-utf8-locales-for-targ= et > + hello)) > #:use-module (gnu packages bootstrap) > #:use-module ((gnu packages package-management) #:select (rpm)) > #:use-module ((gnu packages compression) #:select (squashfs-tools)) > @@ -340,6 +342,43 @@ (define rpm-for-tests > (mkdir #$output)))))))) > (built-derivations (list check)))) > > + (unless store (test-skip 1)) > + (test-assertm "appimage" > + (mlet* %store-monad > + ((guile (set-guile-for-build (default-guile))) > + (profile -> (profile > + (content (packages->manifest (list %bootstrap-guil= e hello))) > + (hooks '()) > + (locales? #f))) > + (image (self-contained-appimage "hello-appimage" profile > + #:entry-point "bin/hello" > + #:extra-options > + (list #:relocatable? #t))) > + (check (gexp->derivation > + "check-appimage" > + #~(begin > + (invoke #$image))))) > + (built-derivations (list check)))) > + > + (unless store (test-skip 1)) > + (test-assertm "appimage + localstatedir" > + (mlet* %store-monad > + ((guile (set-guile-for-build (default-guile))) > + (profile -> (profile > + (content (packages->manifest (list %bootstrap-guil= e hello))) > + (hooks '()) > + (locales? #f))) > + (image (self-contained-appimage "hello-appimage" profile > + #:entry-point "bin/hello" > + #:localstatedir? #t > + #:extra-options > + (list #:relocatable? #t))) > + (check (gexp->derivation > + "check-appimage" > + #~(begin > + (invoke #$image))))) > + (built-derivations (list check)))) > + > (unless store (test-skip 1)) > (test-assertm "deb archive with symlinks and control files" > (mlet* %store-monad The rest looks good to me, from a quick read. If you could send a v3, I'll then give it a real try. --=20 Thanks, Maxim