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 UNlNONHvzl59SgAA0tVLHw (envelope-from ) for ; Wed, 27 May 2020 22:55:13 +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 cKA9NNHvzl49ewAAB5/wlQ (envelope-from ) for ; Wed, 27 May 2020 22:55:13 +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 0CAFE9401AE for ; Wed, 27 May 2020 22:55:12 +0000 (UTC) Received: from localhost ([::1]:46718 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1je4x3-0004ik-DH for larch@yhetil.org; Wed, 27 May 2020 18:55:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54912) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1je4ww-0004iN-TX for guix-patches@gnu.org; Wed, 27 May 2020 18:55:02 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:38746) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1je4ww-0002TY-KU for guix-patches@gnu.org; Wed, 27 May 2020 18:55:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1je4ww-0003uP-J2 for guix-patches@gnu.org; Wed, 27 May 2020 18:55:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#41350] [PATCH v2 3/3] system: vm: Build vm-image using native qemu, for the Hurd. Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Wed, 27 May 2020 22:55:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41350 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: Mathieu Othacehe Cc: 41350@debbugs.gnu.org, "Jan \(janneke\) Nieuwenhuizen" Received: via spool by 41350-submit@debbugs.gnu.org id=B41350.159062007314985 (code B ref 41350); Wed, 27 May 2020 22:55:02 +0000 Received: (at 41350) by debbugs.gnu.org; 27 May 2020 22:54:33 +0000 Received: from localhost ([127.0.0.1]:50292 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1je4wE-0003tQ-V0 for submit@debbugs.gnu.org; Wed, 27 May 2020 18:54:32 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47442) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1je4wC-0003t5-2o for 41350@debbugs.gnu.org; Wed, 27 May 2020 18:54:17 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:47700) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1je4w5-0002Bt-DD; Wed, 27 May 2020 18:54:09 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=37264 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1je4w3-0003I8-L1; Wed, 27 May 2020 18:54:08 -0400 From: Ludovic =?UTF-8?Q?Court=C3=A8s?= References: <20200519072302.9202-1-janneke@gnu.org> <20200519072302.9202-3-janneke@gnu.org> <87367ue09v.fsf@gnu.org> <87pnavu611.fsf@gnu.org> Date: Thu, 28 May 2020 00:54:05 +0200 In-Reply-To: <87pnavu611.fsf@gnu.org> (Mathieu Othacehe's message of "Fri, 22 May 2020 21:24:42 +0200") Message-ID: <87zh9tf0qa.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-Spam-Score: -1.0 (-) 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" X-Scanner: scn0 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of guix-patches-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-patches-bounces@gnu.org X-Spam-Score: 0.49 X-TUID: R1+97VqvLCX9 --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi! Mathieu Othacehe skribis: >> 1. When cross-compiling, can the =E2=80=98qemu-image=E2=80=99 procedur= e to its job by >> running exclusively native software (in particular using a native >> QEMU, native kernel, etc.)? > > I think the answer is yes, but I raised a concern about being able to > run grub-install from an ARM system to build a cross-compiled x86-64 > system (for instance). > > For now, running this command shows: > > ls $(guix build --system=3Daarch64-linux grub)/lib/grub/ > arm64-efi > > So, the native aarch64-linux is only able to install itself on the same > system. I think can be fixed though (same as for grub-hybrid package). > >> As for (2), I=E2=80=99d say that when cross-compiling, it should just ru= n native >> software but simply preserve references to cross-compiled software, >> which is what janneke=E2=80=99s patch does. > > Yes, I agree. So it took me the whole day, but I ended up with the following patches addressing these two points. With that on master, I can do: guix system vm --target=3Darm-linux-gnueabihf --no-grafts \ gnu/system/examples/bare-bones.tmpl and get a usable script that spawns an ARM VM (I still need to add =E2=80= =98-M virt -nographic=E2=80=99 and remove =E2=80=98-enable-kvm=E2=80=99, but that= =E2=80=99s a secondary issue.) Likewise, this produces what looks like a valid image, except probably for the bootloader (I used GRUB in bare-bones, which didn=E2=80=99t complai= n, but the result doesn=E2=80=99t work): guix system vm-image --target=3Darm-linux-gnueabihf =E2=80=A6 Thoughts? I=E2=80=99ll see if I can test it with =E2=80=98wip-hurd-vm=E2=80=99 on top= but I=E2=80=99m not sure I=E2=80=99ll do it before the week-end. > However, I think I found a way to install Grub, without root > permissions, from the host system (see: > https://lists.gnu.org/archive/html/guix-patches/2020-05/msg00988.html). Yay! > This should allow to deprecate the whole (gnu system vm) module. Yeah, using the new image API will be nicer. We still need to keep some of the API in (guix system vm), at least for the =E2=80=98guix system vm=E2= =80=99 command. Thanks, Ludo=E2=80=99. --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0001-system-system-linux-image-file-name-takes-an-optiona.patch >From 1ccd6f8e853be17fa4ec244a660fa53ffcec979f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 27 May 2020 17:40:14 +0200 Subject: [PATCH 1/7] system: 'system-linux-image-file-name' takes an optional parameter. * gnu/system.scm (system-linux-image-file-name): Make 'target' an optional parameter. --- gnu/system.scm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/gnu/system.scm b/gnu/system.scm index d929187695..ab0a6dfc33 100644 --- a/gnu/system.scm +++ b/gnu/system.scm @@ -466,15 +466,15 @@ from the initrd." "Return the list of swap services for OS." (map swap-service (operating-system-swap-devices os))) -(define* (system-linux-image-file-name) - "Return the basename of the kernel image file for SYSTEM." - ;; FIXME: Evaluate the conditional based on the actual current system. - (let ((target (or (%current-target-system) (%current-system)))) - (cond - ((string-prefix? "arm" target) "zImage") - ((string-prefix? "mips" target) "vmlinuz") - ((string-prefix? "aarch64" target) "Image") - (else "bzImage")))) +(define* (system-linux-image-file-name #:optional + (target (or (%current-target-system) + (%current-system)))) + "Return the basename of the kernel image file for TARGET." + (cond + ((string-prefix? "arm" target) "zImage") + ((string-prefix? "mips" target) "vmlinuz") + ((string-prefix? "aarch64" target) "Image") + (else "bzImage"))) (define (operating-system-kernel-file os) "Return an object representing the absolute file name of the kernel image of -- 2.26.2 --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0002-vm-expression-derivation-in-linux-vm-always-returns-.patch >From 56d8d921199bfdf151d899639052f579f24fdd00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 27 May 2020 23:04:48 +0200 Subject: [PATCH 2/7] vm: 'expression->derivation-in-linux-vm' always returns a native build. * gnu/system/vm.scm (expression->derivation-in-linux-vm): Remove #:target. [builder]: Use #+. Don't pass #:target-arm32? and #:target-aarch64? to 'load-in-linux-vm'. Pass #:target #f to 'gexp->derivation'. (qemu-image): Adjust accordingly. * gnu/build/vm.scm (load-in-linux-vm): Remove #:target-aarch64? and #:target-arm32?. Define them as local variables. --- gnu/build/vm.scm | 11 ++++++++--- gnu/system/vm.scm | 16 +++++++--------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm index 433b5a7e8d..0f0ceae18f 100644 --- a/gnu/build/vm.scm +++ b/gnu/build/vm.scm @@ -84,8 +84,6 @@ linux initrd make-disk-image? single-file-output? - target-arm32? - target-aarch64? (disk-image-size (* 100 (expt 2 20))) (disk-image-format "qcow2") (references-graphs '())) @@ -101,7 +99,14 @@ access it via /dev/hda. REFERENCES-GRAPHS can specify a list of reference-graph files as produced by the #:references-graphs parameter of 'derivation'." - (define target-arm? (or target-arm32? target-aarch64?)) + (define target-arm32? + (string-prefix? "arm-" %host-type)) + + (define target-aarch64? + (string-prefix? "aarch64-" %host-type)) + + (define target-arm? + (or target-arm32? target-aarch64?)) (define arch-specific-flags `(;; On ARM, a machine has to be specified. Use "virt" machine to avoid diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 3e483fd86c..d737a5e4ec 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -141,7 +141,7 @@ (define* (expression->derivation-in-linux-vm name exp #:key - (system (%current-system)) target + (system (%current-system)) (linux linux-libre) initrd (qemu qemu-minimal) @@ -226,10 +226,11 @@ substitutable." (let* ((native-inputs '#+(list qemu (canonical-package coreutils))) - (linux (string-append #$linux "/" - #$(system-linux-image-file-name))) - (initrd #$initrd) - (loader #$loader) + (linux (string-append + #+linux "/" + #+(system-linux-image-file-name system))) + (initrd #+initrd) + (loader #+loader) (graphs '#$(match references-graphs (((graph-files . _) ...) graph-files) (_ #f))) @@ -249,8 +250,6 @@ substitutable." #:memory-size #$memory-size #:make-disk-image? #$make-disk-image? #:single-file-output? #$single-file-output? - #:target-arm32? #$(check target-arm32?) - #:target-aarch64? #$(check target-aarch64?) #:disk-image-format #$disk-image-format #:disk-image-size size #:references-graphs graphs)))))) @@ -258,7 +257,7 @@ substitutable." (gexp->derivation name builder ;; TODO: Require the "kvm" feature. #:system system - #:target target + #:target #f ;EXP is always executed natively #:env-vars env-vars #:guile-for-build guile-for-build #:references-graphs references-graphs @@ -430,7 +429,6 @@ system that is passed to 'populate-root-file-system'." #:bootloader-installer #$(bootloader-installer bootloader))))))) #:system system - #:target target #:make-disk-image? #t #:disk-image-size disk-image-size #:disk-image-format disk-image-format -- 2.26.2 --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0003-vm-qemu-image-uses-the-native-partitioning-tools-and.patch >From a2b70d97aa80f70cba56d419470ee8d2221dcc1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 27 May 2020 23:08:15 +0200 Subject: [PATCH 3/7] vm: 'qemu-image' uses the native partitioning tools and bootloader. * gnu/system/vm.scm (qemu-image): Use #+ for Parted, the bootloader, etc. --- gnu/system/vm.scm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index d737a5e4ec..c7767db9df 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -345,7 +345,7 @@ system that is passed to 'populate-root-file-system'." (setlocale LC_ALL "en_US.utf8") (let ((inputs - '#$(append (list parted e2fsprogs dosfstools) + '#+(append (list parted e2fsprogs dosfstools) (map canonical-package (list sed grep coreutils findutils gawk)))) @@ -422,12 +422,12 @@ system that is passed to 'populate-root-file-system'." #:partitions partitions #:grub-efi grub-efi #:bootloader-package - #$(bootloader-package bootloader) + #+(bootloader-package bootloader) #:bootcfg #$bootcfg-drv #:bootcfg-location #$(bootloader-configuration-file bootloader) #:bootloader-installer - #$(bootloader-installer bootloader))))))) + #+(bootloader-installer bootloader))))))) #:system system #:make-disk-image? #t #:disk-image-size disk-image-size -- 2.26.2 --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0004-vm-qemu-image-preserves-the-cross-compilation-target.patch >From db7a12bf54585c8979602956a03fbb6502381dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Thu, 28 May 2020 00:37:33 +0200 Subject: [PATCH 4/7] vm: 'qemu-image' preserves the cross-compilation target of the OS. * gnu/system/vm.scm (qemu-image)[preserve-target, inputs*]: New variables. In gexp, use INPUTS* instead of INPUTS. Wrap OS and BOOTCFG-DRV in 'preserve-target'. Pass INPUTS* instead of INPUTS as the #:references-graphs. --- gnu/system/vm.scm | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index c7767db9df..991ea2d837 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -317,6 +317,21 @@ system that is passed to 'populate-root-file-system'." (local-file (search-path %load-path "guix/store/schema.sql")))) + (define preserve-target + (if target + (lambda (obj) + (with-parameters ((%current-target-system target)) + obj)) + identity)) + + (define inputs* + (map (match-lambda + ((name thing) + `(,name ,(preserve-target thing))) + ((name thing output) + `(,name ,(preserve-target thing) ,output))) + inputs)) + (expression->derivation-in-linux-vm name (with-extensions gcrypt-sqlite3&co @@ -355,7 +370,7 @@ system that is passed to 'populate-root-file-system'." '#$(map (match-lambda ((name thing) thing) ((name thing output) `(,thing ,output))) - inputs))) + inputs*))) (set-path-environment-variable "PATH" '("bin" "sbin") inputs) @@ -367,7 +382,7 @@ system that is passed to 'populate-root-file-system'." #:closures graphs #:copy-closures? #$copy-inputs? #:register-closures? #$register-closures? - #:system-directory #$os + #:system-directory #$(preserve-target os) #:make-device-nodes #$(match device-nodes @@ -423,7 +438,7 @@ system that is passed to 'populate-root-file-system'." #:grub-efi grub-efi #:bootloader-package #+(bootloader-package bootloader) - #:bootcfg #$bootcfg-drv + #:bootcfg #$(preserve-target bootcfg-drv) #:bootcfg-location #$(bootloader-configuration-file bootloader) #:bootloader-installer @@ -432,7 +447,7 @@ system that is passed to 'populate-root-file-system'." #:make-disk-image? #t #:disk-image-size disk-image-size #:disk-image-format disk-image-format - #:references-graphs inputs + #:references-graphs inputs* #:substitutable? substitutable?)) (define* (system-docker-image os -- 2.26.2 --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0005-vm-virtual-machine-compiler-honors-system-and-target.patch >From a9270c1261b747dc9a82b52d1ce38314862c51cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 27 May 2020 23:09:49 +0200 Subject: [PATCH 5/7] vm: compiler honors system and target. * gnu/system/vm.scm (system-qemu-image/shared-store): Add #:system and #:target. Pass it down. (system-qemu-image/shared-store-script): Likewise. (virtual-machine-compiler): Likewise. --- gnu/system/vm.scm | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 991ea2d837..05f3986aca 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -764,6 +764,8 @@ environment with the store shared with the host. MAPPINGS is a list of (define* (system-qemu-image/shared-store os #:key + (system (%current-system)) + (target (%current-target-system)) full-boot? (disk-image-size (* (if full-boot? 500 30) (expt 2 20)))) "Return a derivation that builds a QEMU image of OS that shares its store @@ -784,6 +786,8 @@ bootloader refers to: OS kernel, initrd, bootloader data, etc." ;; This is more than needed (we only need the kernel, initrd, GRUB for its ;; font, and the background image), but it's hard to filter that. (qemu-image #:os os + #:system system + #:target target #:bootcfg-drv bootcfg #:bootloader (bootloader-configuration-bootloader (operating-system-bootloader os)) @@ -824,6 +828,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS." (define* (system-qemu-image/shared-store-script os #:key + (system (%current-system)) + (target (%current-target-system)) (qemu qemu) (graphic? #t) (memory-size 256) @@ -847,6 +853,8 @@ it is mostly useful when FULL-BOOT? is true." (mlet* %store-monad ((os -> (virtualized-operating-system os mappings full-boot?)) (image (system-qemu-image/shared-store os + #:system system + #:target target #:full-boot? full-boot? #:disk-image-size disk-image-size))) (define kernel-arguments @@ -920,10 +928,11 @@ FORWARDINGS is a list of host-port/guest-port pairs." (define-gexp-compiler (virtual-machine-compiler (vm ) system target) - ;; XXX: SYSTEM and TARGET are ignored. (match vm (($ os qemu graphic? memory-size disk-image-size ()) (system-qemu-image/shared-store-script os + #:system system + #:target target #:qemu qemu #:graphic? graphic? #:memory-size memory-size @@ -936,6 +945,8 @@ FORWARDINGS is a list of host-port/guest-port pairs." "user,model=virtio-net-pci," (port-forwardings->qemu-options forwardings))))) (system-qemu-image/shared-store-script os + #:system system + #:target target #:qemu qemu #:graphic? graphic? #:memory-size memory-size -- 2.26.2 --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0006-vm-Shared-store-script-runs-that-native-QEMU-and-Bas.patch >From dc3f04a9f412045a85ac810f9436648368c36adc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 27 May 2020 23:11:14 +0200 Subject: [PATCH 6/7] vm: Shared-store script runs that native QEMU and Bash. * gnu/system/vm.scm (system-qemu-image/shared-store-script): Use #+ for QEMU and BASH. --- gnu/system/vm.scm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 05f3986aca..038cce19b6 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -862,7 +862,8 @@ it is mostly useful when FULL-BOOT? is true." #+@(operating-system-kernel-arguments os "/dev/vda1"))) (define qemu-exec - #~(list (string-append #$qemu "/bin/" #$(qemu-command (%current-system))) + #~(list #+(file-append qemu "/bin/" + (qemu-command (or target system))) #$@(if full-boot? #~() #~("-kernel" #$(operating-system-kernel-file os) @@ -879,7 +880,7 @@ it is mostly useful when FULL-BOOT? is true." #~(call-with-output-file #$output (lambda (port) (format port "#!~a~% exec ~a \"$@\"~%" - #$(file-append bash "/bin/sh") + #+(file-append bash "/bin/sh") (string-join #$qemu-exec " ")) (chmod port #o555)))) -- 2.26.2 --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0007-gnu-guile-static-Disable-JIT-on-ARMv7.patch >From 6e936131ca85aba24f82d35c4616afe835ac7da5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 27 May 2020 23:57:41 +0200 Subject: [PATCH 7/7] gnu: guile-static: Disable JIT on ARMv7. * gnu/packages/make-bootstrap.scm (make-guile-static): Pass "--disable-jit" when 'target-arm32?' is true. --- gnu/packages/make-bootstrap.scm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gnu/packages/make-bootstrap.scm b/gnu/packages/make-bootstrap.scm index fe86f810bf..b2d3e2a326 100644 --- a/gnu/packages/make-bootstrap.scm +++ b/gnu/packages/make-bootstrap.scm @@ -706,7 +706,12 @@ for `sh' in $PATH, and without nscd, and with static NSS modules." ;; When `configure' checks for ltdl availability, it ;; doesn't try to link using libtool, and thus fails ;; because of a missing -ldl. Work around that. - ''("LDFLAGS=-ldl")) + + ;; XXX: On ARMv7, disable JIT: it causes crashes with 3.0.2, + ;; possibly related to . + (if (target-arm32?) + ''("LDFLAGS=-ldl" "--disable-jit") + ''("LDFLAGS=-ldl"))) ((#:phases phases '%standard-phases) `(modify-phases ,phases -- 2.26.2 --=-=-=--