From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from atuin.qyliss.net (localhost [IPv6:::1]) by atuin.qyliss.net (Postfix) with ESMTP id 75B1F45C; Sun, 21 Sep 2025 17:25:44 +0000 (UTC) Received: by atuin.qyliss.net (Postfix, from userid 993) id 86470439; Sun, 21 Sep 2025 17:25:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on atuin.qyliss.net X-Spam-Level: X-Spam-Status: No, score=-0.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DMARC_PASS,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 Received: from mail-yb1-xb33.google.com (mail-yb1-xb33.google.com [IPv6:2607:f8b0:4864:20::b33]) by atuin.qyliss.net (Postfix) with ESMTPS id E65553C7 for ; Sun, 21 Sep 2025 17:25:39 +0000 (UTC) Received: by mail-yb1-xb33.google.com with SMTP id 3f1490d57ef6-e931c858dbbso2524220276.0 for ; Sun, 21 Sep 2025 10:25:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758475537; x=1759080337; darn=spectrum-os.org; h=cc:to:references:in-reply-to:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=FetgBciCdEM7uvE5jHJJDuTdehSq1D3NXEU1JPOAA0A=; b=k5rAa6WF4YaMqmDoCa5AB6pWvnM3kSkjH9xONTfwTZFeu4Yov4Q2cUzGq1j+hKOYh3 cPhaVDP45mpn0xS2Xs0bf105wc4qjpeHCKD8zeknur+Oemeljf3aFKb5B3DqHswQpVSu cxMAfukVI6VOh1jXZzwGEbNLVrxI0pcHfpG7Gc1PJqZvcuo9HFlXHQ/FNmcFOB9nWC1q 22oJerAIeQVfYsFcghuVHjHbhFyPN00/E/QxtwuUi2vKbg5GWKPfG1O93//IzZNw+BHu PI7D5kfwIPa88VhE+N36N88KVWNHQGJL97wCRBgStMW+9ItyXK7hZtvJMT00q4p8YJS8 xJew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758475537; x=1759080337; h=cc:to:references:in-reply-to:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FetgBciCdEM7uvE5jHJJDuTdehSq1D3NXEU1JPOAA0A=; b=do2g6wdLNFYuVBcaMTQsEIbMGQXnzLQif1m+6tMhw87esiAkTB2UO9qqOqlBEQYjp5 HKYJjgbj3aqDTPgrAo6OYM1d0mjL+nud/YqGTdgGA6rDFAhMxM2MeUwi9XFSoiTffg2v XTjlpqHKlkao7lYvuNAc2XBgDWrwaYJdlIWLhMM5dEBnkcR/S18I9OywxAQYtKTPZClX KUkqW1U8KPml9ikdnLRYTsQzEs66J3ZbNQdSUNJbnhodS3LMxPW5JeHdehMnrbHBNlGJ bEuzEWicEp8tbJZ+FFVu5Igk/JBZASIIuoRcYRDDG+Qj+zk2cRyolFR7vxNfJA3zcwVM Cqzg== X-Gm-Message-State: AOJu0YytTvJxAAJzO5RNR9jVNotHBRUNMgfgWl8fK2s5V4DqfwbHx0C6 CQwiV94RFDL3fDpyoQ/kOB6xIrMzcZZGTJBpYGfRhr8RNe1YjM6uo5dmbYtenQ== X-Gm-Gg: ASbGncvwcmxhdgVtTGJZMraJnkw/ru2caL1eLd1q5BhaLAG/e8dK0dUcdlNjGJvo5K7 244EjMRN8mtoIBGszak1tes/hnpCwApPIGIOW3/PFbt0FVXGRtLrLLpjfiSKfGQJyQhLm/PLCQr pSEZDNtjjQ7y0CQVXhqvEvSNL/+B+FPvAGYfV9RhxyH87ZfLcNbBtihYOSwWvAFXC/L+xFkERCo cTwnKJTflXgc0u5ONJi2O3p83ELIbBo+YqO2sEPYmvuN7PUXr7gegHHg9TzjxQ8/5ABLTAZlyIP SpWHDiZxSh/7HMNoYHcKTMiv+TFKy2dmo21l4zMqVPvzE8UsQlmeNeL5INloOr875xygjptgkBL iAl9ZpCiz/ATBLoWhdE0O3Zah4vnuTPSKorVZD5pCTYX6JHBhnLzsx3D1R75kGR4/hXva4fud6z IdL9Qh0oee47AztC/wBl25gVeNHrAQ1AiJ79Bbg8HsfCc= X-Google-Smtp-Source: AGHT+IHd1UZewnYNKzXoKJUlIhIOti2m5roRTeLl8dWQMxNV9o8YYqANT0QWGqoCeJn1iszDP06jCQ== X-Received: by 2002:a05:690c:4c07:b0:726:37ae:95a0 with SMTP id 00721157ae682-73d3ce79ed9mr95445477b3.47.1758475536723; Sun, 21 Sep 2025 10:25:36 -0700 (PDT) Received: from localhost.localdomain (h96-60-249-169.cncrtn.broadband.dynamic.tds.net. [96.60.249.169]) by smtp.gmail.com with UTF8SMTPSA id 00721157ae682-7397188885bsm28000637b3.51.2025.09.21.10.25.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 21 Sep 2025 10:25:36 -0700 (PDT) From: Demi Marie Obenour Date: Sun, 21 Sep 2025 13:24:01 -0400 Subject: [PATCH v4] Generate file lists from a script MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20250921-genfiles-v4-1-4375bda78707@gmail.com> X-B4-Tracking: v=1; b=H4sIALA00GgC/2XMTQ6CMBCG4auQrq3pny115T2MCxim0ATBtKbRE O5uwYVNXH6Ted6FRAweIzlXCwmYfPTzlIc6VASGZuqR+i5vIpg4sVpy2uPk/IiRKm1q44CzWlu S3x8BnX/tqest78HH5xzeeznx7fqNWCZ/kcQpowDWSgctRwWX/t748QjznWyRJArIWQFFhtJgi 8w0Ero/KAsoSigpp50G0WqjTatECdd1/QBWcBz/EgEAAA== X-Change-ID: 20250831-genfiles-46787fc10869 In-Reply-To: <20250920-genfiles-v3-1-d6c2b6767b42@gmail.com> References: <20250920-genfiles-v3-1-d6c2b6767b42@gmail.com> To: Spectrum OS Development X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1758475440; l=30578; i=demiobenour@gmail.com; s=20250729; h=from:subject:message-id; bh=aR/keRlWseiX+5kuvp5DgGmkLN3CNuz0Mc8FZr5vS9o=; b=7GFBP7aqSXp7BQ7LyAOemWXsctlT8Dt19KKzrHxVQOicLgweBvaAAx0lSDJ0e5idOJvbFARvz SuZs7CDt9/dAJPqD2eEc9ZtGY+znD63qis5fWigJRPuyOObocLpszgF X-Developer-Key: i=demiobenour@gmail.com; a=ed25519; pk=X57Q4/YQDj9t4SBeKaDwvXYKB6quZJVx/DE2Ly2out0= Message-ID-Hash: GL4W4CNZWDXH5X65INJTXNNVUON45EYB X-Message-ID-Hash: GL4W4CNZWDXH5X65INJTXNNVUON45EYB X-MailFrom: demiobenour@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-devel.spectrum-os.org-0; header-match-devel.spectrum-os.org-1; header-match-devel.spectrum-os.org-2; header-match-devel.spectrum-os.org-3; header-match-devel.spectrum-os.org-4; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Alyssa Ross , Demi Marie Obenour X-Mailman-Version: 3.3.9 Precedence: list List-Id: Patches and low-level development discussion Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Right now, the makefiles in host/rootfs, vm/sys/net, and img/app have manually-maintained lists of files and symlinks. These duplicate the information in the git repository and can easily get out of sync or cause unnecessary merge conflicts. Fix all of these issues by having the git repository be the source of truth, and using a script to generate the file lists. Developers can regenerate the lists before every commit, or even add a git hook to do that. Signed-off-by: Demi Marie Obenour --- This actually reduces the amount of code that has to be written by hand. --- Changes in v4: - Use /bin/sh instead of bash. - Do not assume that negated awk character classes match all bytes. - Do not check the mode of license files. - Use implicit awk variable initialization. - Use 'git rev-parse --show-toplevel' to find the repository root. - Remove wrongly added copyright header. - Improve documentation. - Remove git hooks. - Add missing copyright header. - Avoid non-portable /usr/bin/env -S. - Avoid assuming that awk is GNU awk. - Avoid non-portable awk -E. - Do not check for git bugs. - Fix link in v3 changelog. - Link to v3: https://spectrum-os.org/lists/archives/spectrum-devel/20250920-genfiles-v3-1-d6c2b6767b42@gmail.com Changes in v3: - Only include the file list generator. Move the rest to separate patch series. - Remove the update-file-list make targets from img/app/Makefile and vm/sys/net/Makefile. - Link to v2: https://spectrum-os.org/lists/archives/spectrum-devel/20250910-genfiles-v2-0-37ebe07a3cdc@gmail.com Changes in v2: - Drop the last patch (switching to /etc/s6-rc/compiled) as it is controversial and should be reviewed separately. - Add missing copyright notices. - Use a wrapper shell script to make the awk code easier to read. - Improve documentation. - Add helper scripts for use in git hooks and rebasing. - Link to v1: https://spectrum-os.org/lists/archives/spectrum-devel/20250903-genfiles-v1-0-cc993fcb1e4c@gmail.com/ --- Documentation/development/built-in-vms.adoc | 7 ++ host/rootfs/Makefile | 102 +--------------------------- host/rootfs/file-list.mk | 99 +++++++++++++++++++++++++++ img/app/Makefile | 80 +++------------------- img/app/file-list.mk | 65 ++++++++++++++++++ scripts/genfiles.awk | 90 ++++++++++++++++++++++++ scripts/genfiles.sh | 28 ++++++++ vm/sys/net/Makefile | 50 ++------------ vm/sys/net/file-list.mk | 42 ++++++++++++ 9 files changed, 352 insertions(+), 211 deletions(-) diff --git a/Documentation/development/built-in-vms.adoc b/Documentation/development/built-in-vms.adoc index e90009ee5a3c2c254a7ae11e36121576b819eee7..d044e7509a43df4b015f312dac61be6c74cc7feb 100644 --- a/Documentation/development/built-in-vms.adoc +++ b/Documentation/development/built-in-vms.adoc @@ -3,6 +3,7 @@ :page-nav_order: 3 // SPDX-FileCopyrightText: 2023-2025 Alyssa Ross +// SPDX-FileCopyrightText: 2025 Demi Marie Obenour // SPDX-License-Identifier: GFDL-1.3-no-invariants-or-later OR CC-BY-SA-4.0 Spectrum comes with some built-in application VMs, to demonstrate @@ -44,6 +45,12 @@ NOTE: As a special convenience, it's not necessary to run `make clean` if the only change to the Nix files is modifying the packages installed in the VM. +The list of files used for images is stored in a separate file, +file-list.mk. To update it, run scripts/genfiles.sh, which will +regenerate it from the output of `git ls-files`. This script uses +Git's index to generate the list, so only staged changes will be +reflected in its output. + By default, `make run` runs the VM in Cloud Hypervisor, to match the Spectrum environment. You can also add `VMM=crosvm` or `VMM=qemu` to your command line to run the VM in a different VMM. One reason to do diff --git a/host/rootfs/Makefile b/host/rootfs/Makefile index 322d75026dbcba4301f26abfbf74efa8cc68cdfd..da868557328fa84082e7b4cd968a1c2f7dd99af6 100644 --- a/host/rootfs/Makefile +++ b/host/rootfs/Makefile @@ -4,67 +4,10 @@ .POSIX: include ../../lib/common.mk +include file-list.mk dest = build/rootfs.erofs -FILES = \ - image/etc/fonts/fonts.conf \ - image/etc/fstab \ - image/etc/group \ - image/etc/init \ - image/etc/login \ - image/etc/mdev.conf \ - image/etc/mdev/listen \ - image/etc/mdev/net/add \ - image/etc/mdev/wait \ - image/etc/parse-devname \ - image/etc/passwd \ - image/etc/s6-linux-init/env/WAYLAND_DISPLAY \ - image/etc/s6-linux-init/env/XDG_RUNTIME_DIR \ - image/etc/s6-linux-init/run-image/service/dbus/notification-fd \ - image/etc/s6-linux-init/run-image/service/dbus/run \ - image/etc/s6-linux-init/run-image/service/dbus/template/notification-fd \ - image/etc/s6-linux-init/run-image/service/dbus/template/run \ - image/etc/s6-linux-init/run-image/service/getty-tty1/run \ - image/etc/s6-linux-init/run-image/service/getty-tty2/run \ - image/etc/s6-linux-init/run-image/service/getty-tty3/run \ - image/etc/s6-linux-init/run-image/service/getty-tty4/run \ - image/etc/s6-linux-init/run-image/service/s6-svscan-log/notification-fd \ - image/etc/s6-linux-init/run-image/service/s6-svscan-log/run \ - image/etc/s6-linux-init/run-image/service/serial-getty-generator/run \ - image/etc/s6-linux-init/run-image/service/serial-getty/notification-fd \ - image/etc/s6-linux-init/run-image/service/serial-getty/run \ - image/etc/s6-linux-init/run-image/service/serial-getty/template/run \ - image/etc/s6-linux-init/run-image/service/vhost-user-fs/notification-fd \ - image/etc/s6-linux-init/run-image/service/vhost-user-fs/run \ - image/etc/s6-linux-init/run-image/service/vhost-user-fs/template/notification-fd \ - image/etc/s6-linux-init/run-image/service/vhost-user-fs/template/run \ - image/etc/s6-linux-init/run-image/service/vhost-user-gpu/notification-fd \ - image/etc/s6-linux-init/run-image/service/vhost-user-gpu/run \ - image/etc/s6-linux-init/run-image/service/vhost-user-gpu/template/data/check \ - image/etc/s6-linux-init/run-image/service/vhost-user-gpu/template/notification-fd \ - image/etc/s6-linux-init/run-image/service/vhost-user-gpu/template/run \ - image/etc/s6-linux-init/run-image/service/vmm/notification-fd \ - image/etc/s6-linux-init/run-image/service/vmm/run \ - image/etc/s6-linux-init/run-image/service/vmm/template/notification-fd \ - image/etc/s6-linux-init/run-image/service/xdg-desktop-portal-spectrum-host/notification-fd \ - image/etc/s6-linux-init/run-image/service/xdg-desktop-portal-spectrum-host/run \ - image/etc/s6-linux-init/run-image/service/xdg-desktop-portal-spectrum-host/template/notification-fd \ - image/etc/s6-linux-init/run-image/service/xdg-desktop-portal-spectrum-host/template/run \ - image/etc/s6-linux-init/scripts/rc.init \ - image/etc/xdg/weston/autolaunch \ - image/etc/xdg/weston/weston.ini \ - image/usr/share/dbus-1/services/org.freedesktop.portal.Documents.service \ - image/usr/bin/assign-devices \ - image/usr/bin/create-vm-dependencies \ - image/usr/bin/run-appimage \ - image/usr/bin/run-vmm \ - image/usr/bin/vm-console \ - image/usr/bin/vm-import \ - image/usr/bin/vm-start \ - image/usr/bin/vm-stop \ - image/usr/bin/xdg-open - DIRS = \ dev \ etc/s6-linux-init/env \ @@ -101,18 +44,9 @@ DIRS = \ FIFOS = etc/s6-linux-init/run-image/service/s6-svscan-log/fifo -# These are separate because they need to be included, but putting -# them as make dependencies would confuse make. -LINKS = \ - image/bin \ - image/etc/s6-linux-init/run-image/opengl-driver \ - image/etc/s6-linux-init/run-image/service/vmm/template/run \ - image/lib \ - image/sbin - BUILD_FILES = build/etc/s6-rc -$(dest): ../../scripts/make-erofs.sh $(PACKAGES_FILE) $(FILES) $(BUILD_FILES) build/empty build/fifo +$(dest): ../../scripts/make-erofs.sh $(PACKAGES_FILE) $(FILES) $(BUILD_FILES) build/empty build/fifo file-list.mk ( \ cat $(PACKAGES_FILE) ;\ for file in $(FILES) $(LINKS); do printf '%s\n%s\n' $$file "$${file#image/}"; done ;\ @@ -128,36 +62,6 @@ build/fifo: build/empty: mkdir -p $@ -S6_RC_FILES = \ - image/etc/s6-rc/card0/type \ - image/etc/s6-rc/card0/up \ - image/etc/s6-rc/core/type \ - image/etc/s6-rc/core/up \ - image/etc/s6-rc/kvm/timeout-up \ - image/etc/s6-rc/kvm/type \ - image/etc/s6-rc/kvm/up \ - image/etc/s6-rc/mdevd-coldplug/dependencies.d/mdevd \ - image/etc/s6-rc/mdevd-coldplug/type \ - image/etc/s6-rc/mdevd-coldplug/up \ - image/etc/s6-rc/mdevd/notification-fd \ - image/etc/s6-rc/mdevd/run \ - image/etc/s6-rc/mdevd/type \ - image/etc/s6-rc/ok-all/contents \ - image/etc/s6-rc/ok-all/type \ - image/etc/s6-rc/static-nodes/type \ - image/etc/s6-rc/static-nodes/up \ - image/etc/s6-rc/sys-vmms/dependencies.d/vmm-env \ - image/etc/s6-rc/sys-vmms/type \ - image/etc/s6-rc/sys-vmms/up \ - image/etc/s6-rc/vm-env/contents \ - image/etc/s6-rc/vm-env/type \ - image/etc/s6-rc/vmm-env/contents \ - image/etc/s6-rc/vmm-env/type \ - image/etc/s6-rc/weston/dependencies.d/card0 \ - image/etc/s6-rc/weston/notification-fd \ - image/etc/s6-rc/weston/run \ - image/etc/s6-rc/weston/type - # s6-rc-compile's input is a directory, but that doesn't play nice # with Make, because it won't know to update if some file in the # directory is changed, or a file is created or removed in a @@ -165,7 +69,7 @@ S6_RC_FILES = \ # including files that aren't intended to be part of the input, like # temporary editor files or .license files. So for all these reasons, # only explicitly listed files are made available to s6-rc-compile. -build/etc/s6-rc: $(S6_RC_FILES) +build/etc/s6-rc: $(S6_RC_FILES) file-list.mk mkdir -p $$(dirname $@) rm -rf $@ set -uo pipefail && dir=$$(mktemp -d) && \ diff --git a/host/rootfs/file-list.mk b/host/rootfs/file-list.mk new file mode 100644 index 0000000000000000000000000000000000000000..e800062de9fa2b057e0f3027e48b9ed3a65d3dc3 --- /dev/null +++ b/host/rootfs/file-list.mk @@ -0,0 +1,99 @@ +# SPDX-License-Identifier: EUPL-1.2+ +# SPDX-FileCopyrightText: 2021-2024 Alyssa Ross +# Generated by scripts/genfile.sh. Any changes will be overwritten. +FILES = \ + image/etc/fonts/fonts.conf \ + image/etc/fstab \ + image/etc/group \ + image/etc/init \ + image/etc/login \ + image/etc/mdev.conf \ + image/etc/mdev/listen \ + image/etc/mdev/net/add \ + image/etc/mdev/wait \ + image/etc/parse-devname \ + image/etc/passwd \ + image/etc/s6-linux-init/env/WAYLAND_DISPLAY \ + image/etc/s6-linux-init/env/XDG_RUNTIME_DIR \ + image/etc/s6-linux-init/run-image/service/dbus/notification-fd \ + image/etc/s6-linux-init/run-image/service/dbus/run \ + image/etc/s6-linux-init/run-image/service/dbus/template/notification-fd \ + image/etc/s6-linux-init/run-image/service/dbus/template/run \ + image/etc/s6-linux-init/run-image/service/getty-tty1/run \ + image/etc/s6-linux-init/run-image/service/getty-tty2/run \ + image/etc/s6-linux-init/run-image/service/getty-tty3/run \ + image/etc/s6-linux-init/run-image/service/getty-tty4/run \ + image/etc/s6-linux-init/run-image/service/s6-svscan-log/notification-fd \ + image/etc/s6-linux-init/run-image/service/s6-svscan-log/run \ + image/etc/s6-linux-init/run-image/service/serial-getty-generator/run \ + image/etc/s6-linux-init/run-image/service/serial-getty/notification-fd \ + image/etc/s6-linux-init/run-image/service/serial-getty/run \ + image/etc/s6-linux-init/run-image/service/serial-getty/template/run \ + image/etc/s6-linux-init/run-image/service/vhost-user-fs/notification-fd \ + image/etc/s6-linux-init/run-image/service/vhost-user-fs/run \ + image/etc/s6-linux-init/run-image/service/vhost-user-fs/template/notification-fd \ + image/etc/s6-linux-init/run-image/service/vhost-user-fs/template/run \ + image/etc/s6-linux-init/run-image/service/vhost-user-gpu/notification-fd \ + image/etc/s6-linux-init/run-image/service/vhost-user-gpu/run \ + image/etc/s6-linux-init/run-image/service/vhost-user-gpu/template/data/check \ + image/etc/s6-linux-init/run-image/service/vhost-user-gpu/template/notification-fd \ + image/etc/s6-linux-init/run-image/service/vhost-user-gpu/template/run \ + image/etc/s6-linux-init/run-image/service/vmm/notification-fd \ + image/etc/s6-linux-init/run-image/service/vmm/run \ + image/etc/s6-linux-init/run-image/service/vmm/template/notification-fd \ + image/etc/s6-linux-init/run-image/service/xdg-desktop-portal-spectrum-host/notification-fd \ + image/etc/s6-linux-init/run-image/service/xdg-desktop-portal-spectrum-host/run \ + image/etc/s6-linux-init/run-image/service/xdg-desktop-portal-spectrum-host/template/notification-fd \ + image/etc/s6-linux-init/run-image/service/xdg-desktop-portal-spectrum-host/template/run \ + image/etc/s6-linux-init/scripts/rc.init \ + image/etc/xdg/weston/autolaunch \ + image/etc/xdg/weston/weston.ini \ + image/usr/bin/assign-devices \ + image/usr/bin/create-vm-dependencies \ + image/usr/bin/run-appimage \ + image/usr/bin/run-vmm \ + image/usr/bin/vm-console \ + image/usr/bin/vm-import \ + image/usr/bin/vm-start \ + image/usr/bin/vm-stop \ + image/usr/bin/xdg-open \ + image/usr/share/dbus-1/services/org.freedesktop.portal.Documents.service + +# These are separate because they need to be included, but putting +# them as make dependencies would confuse make. +LINKS = \ + image/bin \ + image/etc/s6-linux-init/run-image/opengl-driver \ + image/etc/s6-linux-init/run-image/service/vmm/template/run \ + image/lib \ + image/sbin + +S6_RC_FILES = \ + image/etc/s6-rc/card0/type \ + image/etc/s6-rc/card0/up \ + image/etc/s6-rc/core/type \ + image/etc/s6-rc/core/up \ + image/etc/s6-rc/kvm/timeout-up \ + image/etc/s6-rc/kvm/type \ + image/etc/s6-rc/kvm/up \ + image/etc/s6-rc/mdevd-coldplug/dependencies.d/mdevd \ + image/etc/s6-rc/mdevd-coldplug/type \ + image/etc/s6-rc/mdevd-coldplug/up \ + image/etc/s6-rc/mdevd/notification-fd \ + image/etc/s6-rc/mdevd/run \ + image/etc/s6-rc/mdevd/type \ + image/etc/s6-rc/ok-all/contents \ + image/etc/s6-rc/ok-all/type \ + image/etc/s6-rc/static-nodes/type \ + image/etc/s6-rc/static-nodes/up \ + image/etc/s6-rc/sys-vmms/dependencies.d/vmm-env \ + image/etc/s6-rc/sys-vmms/type \ + image/etc/s6-rc/sys-vmms/up \ + image/etc/s6-rc/vm-env/contents \ + image/etc/s6-rc/vm-env/type \ + image/etc/s6-rc/vmm-env/contents \ + image/etc/s6-rc/vmm-env/type \ + image/etc/s6-rc/weston/dependencies.d/card0 \ + image/etc/s6-rc/weston/notification-fd \ + image/etc/s6-rc/weston/run \ + image/etc/s6-rc/weston/typeDONE diff --git a/img/app/Makefile b/img/app/Makefile index 8b9ecf990fe10adb7aa19b46935826d684f10686..50c6e126cef9fd4e7d1f3139a5bf00ef5f96fa8c 100644 --- a/img/app/Makefile +++ b/img/app/Makefile @@ -5,6 +5,7 @@ .POSIX: include ../../lib/common.mk +include file-list.mk prefix = build/host libdir = $(prefix)/lib @@ -29,45 +30,13 @@ $(imgdir)/appvm/blk/root.img: ../../scripts/make-gpt.sh ../../scripts/sfdisk-fie build/rootfs.erofs:root:5460386f-2203-4911-8694-91400125c604:root mv $@.tmp $@ -VM_FILES = \ - image/etc/dbus-1/session.conf \ - image/etc/fonts/fonts.conf \ - image/etc/fstab \ - image/etc/init \ - image/etc/mdev.conf \ - image/etc/mdev/iface \ - image/etc/mdev/listen \ - image/etc/mdev/virtiofs \ - image/etc/mdev/wait \ - image/etc/passwd \ - image/etc/pipewire/pipewire.conf \ - image/etc/resolv.conf \ - image/etc/s6-linux-init/env/DBUS_SESSION_BUS_ADDRESS \ - image/etc/s6-linux-init/env/DISPLAY \ - image/etc/s6-linux-init/env/GTK_USE_PORTAL \ - image/etc/s6-linux-init/env/NIX_XDG_DESKTOP_PORTAL_DIR \ - image/etc/s6-linux-init/env/WAYLAND_DISPLAY \ - image/etc/s6-linux-init/env/XDG_RUNTIME_DIR \ - image/etc/s6-linux-init/run-image/service/getty-hvc0/run \ - image/etc/s6-linux-init/run-image/service/s6-linux-init-shutdownd/notification-fd \ - image/etc/s6-linux-init/run-image/service/s6-linux-init-shutdownd/run \ - image/etc/s6-linux-init/scripts/rc.init \ - image/etc/s6-linux-init/scripts/rc.shutdown \ - image/etc/s6-linux-init/scripts/rc.shutdown.final \ - image/etc/wireplumber/wireplumber.conf.d/99_spectrum.conf \ - image/etc/xdg/xdg-desktop-portal/portals.conf - -VM_DIRS = dev run proc sys tmp \ +DIRS = dev run proc sys tmp \ etc/s6-linux-init/run-image/service \ etc/s6-linux-init/run-image/user \ etc/s6-linux-init/run-image/wait -VM_FIFOS = etc/s6-linux-init/run-image/service/s6-linux-init-shutdownd/fifo +FIFOS = etc/s6-linux-init/run-image/service/s6-linux-init-shutdownd/fifo -# These are separate because they need to be included, but putting -# them as make dependencies would confuse make. -VM_LINKS = image/bin image/etc/ssl/certs/ca-certificates.crt image/sbin - -VM_BUILD_FILES = build/etc/s6-rc +BUILD_FILES = build/etc/s6-rc build/fifo: mkdir -p build @@ -76,44 +45,17 @@ build/fifo: build/empty: mkdir -p $@ -build/rootfs.erofs: ../../scripts/make-erofs.sh $(PACKAGES_FILE) $(VM_FILES) $(VM_BUILD_FILES) build/empty build/fifo +build/rootfs.erofs: ../../scripts/make-erofs.sh $(PACKAGES_FILE) $(FILES) $(BUILD_FILES) build/empty build/fifo file-list.mk ( \ cat $(PACKAGES_FILE) ;\ - for file in $(VM_FILES) $(VM_LINKS); do printf '%s\n%s\n' $$file "$${file#image/}"; done ;\ - for file in $(VM_BUILD_FILES); do printf '%s\n%s\n' $$file $${file#build/}; done ;\ - printf 'build/empty\n%s\n' $(VM_DIRS) ;\ - printf 'build/fifo\n%s\n' $(VM_FIFOS) ;\ + for file in $(FILES) $(LINKS); do printf '%s\n%s\n' $$file $${file#image/}; done ;\ + for file in $(BUILD_FILES); do printf '%s\n%s\n' $$file $${file#build/}; done ;\ + printf 'build/empty\n%s\n' $(DIRS) ;\ + printf 'build/fifo\n%s\n' $(FIFOS) ;\ ) | ../../scripts/make-erofs.sh $@ -VM_S6_RC_FILES = \ - image/etc/s6-rc/app/dependencies.d/dbus \ - image/etc/s6-rc/app/dependencies.d/pipewire \ - image/etc/s6-rc/app/dependencies.d/wayland-proxy-virtwl \ - image/etc/s6-rc/app/run \ - image/etc/s6-rc/app/type \ - image/etc/s6-rc/dbus/notification-fd \ - image/etc/s6-rc/dbus/run \ - image/etc/s6-rc/dbus/type \ - image/etc/s6-rc/mdevd-coldplug/dependencies.d/mdevd \ - image/etc/s6-rc/mdevd-coldplug/type \ - image/etc/s6-rc/mdevd-coldplug/up \ - image/etc/s6-rc/mdevd/notification-fd \ - image/etc/s6-rc/mdevd/run \ - image/etc/s6-rc/mdevd/type \ - image/etc/s6-rc/ok-all/contents \ - image/etc/s6-rc/ok-all/type \ - image/etc/s6-rc/pipewire/notification-fd \ - image/etc/s6-rc/pipewire/run \ - image/etc/s6-rc/pipewire/type \ - image/etc/s6-rc/wayland-proxy-virtwl/notification-fd \ - image/etc/s6-rc/wayland-proxy-virtwl/run \ - image/etc/s6-rc/wayland-proxy-virtwl/type \ - image/etc/s6-rc/wireplumber/dependencies.d/dbus \ - image/etc/s6-rc/wireplumber/dependencies.d/pipewire \ - image/etc/s6-rc/wireplumber/run \ - image/etc/s6-rc/wireplumber/type - -build/etc/s6-rc: $(VM_S6_RC_FILES) + +build/etc/s6-rc: $(S6_RC_FILES) file-list.mk mkdir -p $$(dirname $@) rm -rf $@ set -uo pipefail && dir=$$(mktemp -d) && \ diff --git a/img/app/file-list.mk b/img/app/file-list.mk new file mode 100644 index 0000000000000000000000000000000000000000..cc94384585e4b61b090244e7dbb753b8f51b1bea --- /dev/null +++ b/img/app/file-list.mk @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: EUPL-1.2+ +# SPDX-FileCopyrightText: 2021-2024 Alyssa Ross +# Generated by scripts/genfile.sh. Any changes will be overwritten. +FILES = \ + image/etc/dbus-1/session.conf \ + image/etc/fonts/fonts.conf \ + image/etc/fstab \ + image/etc/init \ + image/etc/mdev.conf \ + image/etc/mdev/iface \ + image/etc/mdev/listen \ + image/etc/mdev/virtiofs \ + image/etc/mdev/wait \ + image/etc/passwd \ + image/etc/pipewire/pipewire.conf \ + image/etc/resolv.conf \ + image/etc/s6-linux-init/env/DBUS_SESSION_BUS_ADDRESS \ + image/etc/s6-linux-init/env/DISPLAY \ + image/etc/s6-linux-init/env/GTK_USE_PORTAL \ + image/etc/s6-linux-init/env/NIX_XDG_DESKTOP_PORTAL_DIR \ + image/etc/s6-linux-init/env/WAYLAND_DISPLAY \ + image/etc/s6-linux-init/env/XDG_RUNTIME_DIR \ + image/etc/s6-linux-init/run-image/service/getty-hvc0/run \ + image/etc/s6-linux-init/run-image/service/s6-linux-init-shutdownd/notification-fd \ + image/etc/s6-linux-init/run-image/service/s6-linux-init-shutdownd/run \ + image/etc/s6-linux-init/scripts/rc.init \ + image/etc/s6-linux-init/scripts/rc.shutdown \ + image/etc/s6-linux-init/scripts/rc.shutdown.final \ + image/etc/wireplumber/wireplumber.conf.d/99_spectrum.conf \ + image/etc/xdg/xdg-desktop-portal/portals.conf + +# These are separate because they need to be included, but putting +# them as make dependencies would confuse make. +LINKS = \ + image/bin \ + image/etc/ssl/certs/ca-certificates.crt \ + image/sbin + +S6_RC_FILES = \ + image/etc/s6-rc/app/dependencies.d/dbus \ + image/etc/s6-rc/app/dependencies.d/pipewire \ + image/etc/s6-rc/app/dependencies.d/wayland-proxy-virtwl \ + image/etc/s6-rc/app/run \ + image/etc/s6-rc/app/type \ + image/etc/s6-rc/dbus/notification-fd \ + image/etc/s6-rc/dbus/run \ + image/etc/s6-rc/dbus/type \ + image/etc/s6-rc/mdevd-coldplug/dependencies.d/mdevd \ + image/etc/s6-rc/mdevd-coldplug/type \ + image/etc/s6-rc/mdevd-coldplug/up \ + image/etc/s6-rc/mdevd/notification-fd \ + image/etc/s6-rc/mdevd/run \ + image/etc/s6-rc/mdevd/type \ + image/etc/s6-rc/ok-all/contents \ + image/etc/s6-rc/ok-all/type \ + image/etc/s6-rc/pipewire/notification-fd \ + image/etc/s6-rc/pipewire/run \ + image/etc/s6-rc/pipewire/type \ + image/etc/s6-rc/wayland-proxy-virtwl/notification-fd \ + image/etc/s6-rc/wayland-proxy-virtwl/run \ + image/etc/s6-rc/wayland-proxy-virtwl/type \ + image/etc/s6-rc/wireplumber/dependencies.d/dbus \ + image/etc/s6-rc/wireplumber/dependencies.d/pipewire \ + image/etc/s6-rc/wireplumber/run \ + image/etc/s6-rc/wireplumber/typeDONE diff --git a/scripts/genfiles.awk b/scripts/genfiles.awk new file mode 100644 index 0000000000000000000000000000000000000000..891ad162ea9748e275f7a048db3acbd9e7895a9b --- /dev/null +++ b/scripts/genfiles.awk @@ -0,0 +1,90 @@ +# SPDX-License-Identifier: EUPL-1.2+ +# SPDX-FileCopyrightText: 2021-2024 Alyssa Ross +# SPDX-FileCopyrightText: 2025 Demi Marie Obenour +BEGIN { + RS = "\n"; + FS = "\t"; + modes["120000"] = "symlink"; + modes["100644"] = "regular"; + modes["100755"] = "regular"; +} + +function fail(msg) { + exit_code = 1; + print msg > "/dev/stderr"; + exit 1; +} + +done { fail("Junk after DONE", 1); } + +$0 == "DONE" { + done = 1; + next; +} + +# Extract data from built-in variables. +{ + filename = $2; + raw_mode = $1; + # awk autocreates empty string entries if the key is invalid, + # but the code exits in this case so that is okay. + mode = modes[raw_mode]; +} + +filename !~ /^[[:alnum:]_.+@/-]+$/ { + fail("filename '" filename "' has forbidden characters"); +} + +# Skip license files +/\.license$/ { next } + +filename ~ /^image\/etc\/s6-rc\// { + if (mode != "regular") { + fail("s6-rc-compile input '" filename "' isn't a regular file"); + } + rc_files[rc_count++] = filename; + next; +} + +mode == "symlink" { + symlinks[symlink_count++] = filename; + next; +} + +mode == "regular" { + files[file_count++] = filename; + next; +} + +{ fail("File '" filename "' is not regular file or symlink (mode " raw_mode ")"); } + +END { + if (exit_code) { + exit exit_code; + } + if (!done) { + fail("Did not receive DONE line"); + } + printf ("# SPDX-License-Identifier: EUPL-1.2+\n" \ +"# SPDX-FileCopyrightText: 2021-2024 Alyssa Ross \n" \ +"# Generated by scripts/genfile.sh. Any changes will be overwritten.\n" \ +"FILES =") > out_file; + for (array_index = 0; array_index < file_count; array_index += 1) { + printf " \\\n\t%s", files[array_index] > out_file; + } + printf ("\n\n" \ +"# These are separate because they need to be included, but putting\n" \ +"# them as make dependencies would confuse make.\n" \ +"LINKS =") > out_file; + for (array_index = 0; array_index < symlink_count; array_index += 1) { + printf " \\\n\t%s", symlinks[array_index] > out_file; + } + printf "\n\nS6_RC_FILES =" > out_file; + for (array_index = 0; array_index < rc_count; array_index += 1) { + printf " \\\n\t%s", rc_files[array_index] > out_file; + } + print > out_file; + if (close(out_file)) { + fail("Cannot close output file: " ERRNO); + } +} diff --git a/scripts/genfiles.sh b/scripts/genfiles.sh new file mode 100755 index 0000000000000000000000000000000000000000..65e8b56654448f4c9529e00807e68adb0bcfefbf --- /dev/null +++ b/scripts/genfiles.sh @@ -0,0 +1,28 @@ +#!/bin/sh -- +set -euo pipefail +export LC_ALL=C LANGUAGE=C +# shell strips trailing newlines, so add something after the newline +dir=$(git rev-parse --show-toplevel && echo a) +cd "${dir%' +a'}" +for i in host/rootfs img/app vm/sys/net; do + output_file=$i/file-list.mk + { + git -C "$i" -c core.quotePath=true ls-files $'--format=%(objectmode)\t%(path)' -- image | + sort -t $'\t' -k 2 + echo DONE + } | + awk -v "out_file=$output_file.tmp" -f scripts/genfiles.awk + if [ -f "$output_file" ]; then + # Avoid changing output file if it is up to date, as that + # would cause unnecessary rebuilds. + if cmp -s -- "$output_file.tmp" "$output_file"; then + rm -- "$output_file.tmp" + continue + else + astatus=$? + if [ "$astatus" != 1 ]; then exit "$astatus"; fi + fi + fi + mv -- "$output_file.tmp" "$output_file" +done diff --git a/vm/sys/net/Makefile b/vm/sys/net/Makefile index 0193cc8c09f895a6021de0d02fde20362818e185..989c5e79862f1918153776cadab3837e820ef9b8 100644 --- a/vm/sys/net/Makefile +++ b/vm/sys/net/Makefile @@ -4,6 +4,7 @@ .POSIX: include ../../../lib/common.mk +include file-list.mk prefix = build/host libdir = $(prefix)/lib @@ -28,57 +29,20 @@ $(vmdir)/netvm/blk/root.img: ../../../scripts/make-gpt.sh ../../../scripts/sfdis build/rootfs.erofs:root:ea21da27-0391-48da-9235-9d2ab2ca7844:root mv $@.tmp $@ -VM_FILES = \ - image/etc/dbus-1/system.conf \ - image/etc/fstab \ - image/etc/init \ - image/etc/mdev.conf \ - image/etc/mdev/iface \ - image/etc/nftables.conf \ - image/etc/passwd \ - image/etc/s6-linux-init/run-image/service/getty-hvc0/run \ - image/etc/s6-linux-init/scripts/rc.init \ - image/etc/sysctl.conf -VM_DIRS = dev etc/s6-linux-init/env run proc sys var/lib/connman - -# These are separate because they need to be included, but putting -# them as make dependencies would confuse make. -VM_LINKS = image/bin image/lib image/sbin image/var/run - -VM_BUILD_FILES = build/etc/s6-rc +BUILD_FILES = build/etc/s6-rc build/empty: mkdir -p $@ -build/rootfs.erofs: ../../../scripts/make-erofs.sh $(PACKAGES_FILE) $(VM_FILES) $(VM_BUILD_FILES) build/empty +build/rootfs.erofs: ../../../scripts/make-erofs.sh $(PACKAGES_FILE) $(FILES) $(BUILD_FILES) build/empty file-list.mk ( \ cat $(PACKAGES_FILE) ;\ - for file in $(VM_FILES) $(VM_LINKS); do printf '%s\n%s\n' $$file "$${file#image/}"; done ;\ - for file in $(VM_BUILD_FILES); do printf '%s\n%s\n' $$file $${file#build/}; done ;\ - printf 'build/empty\n%s\n' $(VM_DIRS) ;\ + for file in $(FILES) $(LINKS); do printf '%s\n%s\n' $$file "$${file#image/}"; done ;\ + for file in $(BUILD_FILES); do printf '%s\n%s\n' $$file $${file#build/}; done ;\ + printf 'build/empty\n%s\n' $(DIRS) ;\ ) | ../../../scripts/make-erofs.sh $@ -VM_S6_RC_FILES = \ - image/etc/s6-rc/connman/dependencies.d/dbus \ - image/etc/s6-rc/connman/run \ - image/etc/s6-rc/connman/type \ - image/etc/s6-rc/dbus/notification-fd \ - image/etc/s6-rc/dbus/run \ - image/etc/s6-rc/dbus/type \ - image/etc/s6-rc/mdevd-coldplug/dependencies.d/mdevd \ - image/etc/s6-rc/mdevd-coldplug/type \ - image/etc/s6-rc/mdevd-coldplug/up \ - image/etc/s6-rc/mdevd/notification-fd \ - image/etc/s6-rc/mdevd/run \ - image/etc/s6-rc/mdevd/type \ - image/etc/s6-rc/nftables/type \ - image/etc/s6-rc/nftables/up \ - image/etc/s6-rc/ok-all/contents \ - image/etc/s6-rc/ok-all/type \ - image/etc/s6-rc/sysctl/type \ - image/etc/s6-rc/sysctl/up - -build/etc/s6-rc: $(VM_S6_RC_FILES) +build/etc/s6-rc: $(S6_RC_FILES) file-list.mk mkdir -p $$(dirname $@) rm -rf $@ set -uo pipefail && dir=$$(mktemp -d) && \ diff --git a/vm/sys/net/file-list.mk b/vm/sys/net/file-list.mk new file mode 100644 index 0000000000000000000000000000000000000000..902ae9cb79a822c3e60ae48a71d0b0ed07ffe843 --- /dev/null +++ b/vm/sys/net/file-list.mk @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: EUPL-1.2+ +# SPDX-FileCopyrightText: 2021-2024 Alyssa Ross +# Generated by scripts/genfile.sh. Any changes will be overwritten. +FILES = \ + image/etc/dbus-1/system.conf \ + image/etc/fstab \ + image/etc/init \ + image/etc/mdev.conf \ + image/etc/mdev/iface \ + image/etc/nftables.conf \ + image/etc/passwd \ + image/etc/s6-linux-init/run-image/service/getty-hvc0/run \ + image/etc/s6-linux-init/scripts/rc.init \ + image/etc/sysctl.conf + +# These are separate because they need to be included, but putting +# them as make dependencies would confuse make. +LINKS = \ + image/bin \ + image/lib \ + image/sbin \ + image/var/run + +S6_RC_FILES = \ + image/etc/s6-rc/connman/dependencies.d/dbus \ + image/etc/s6-rc/connman/run \ + image/etc/s6-rc/connman/type \ + image/etc/s6-rc/dbus/notification-fd \ + image/etc/s6-rc/dbus/run \ + image/etc/s6-rc/dbus/type \ + image/etc/s6-rc/mdevd-coldplug/dependencies.d/mdevd \ + image/etc/s6-rc/mdevd-coldplug/type \ + image/etc/s6-rc/mdevd-coldplug/up \ + image/etc/s6-rc/mdevd/notification-fd \ + image/etc/s6-rc/mdevd/run \ + image/etc/s6-rc/mdevd/type \ + image/etc/s6-rc/nftables/type \ + image/etc/s6-rc/nftables/up \ + image/etc/s6-rc/ok-all/contents \ + image/etc/s6-rc/ok-all/type \ + image/etc/s6-rc/sysctl/type \ + image/etc/s6-rc/sysctl/upDONE --- base-commit: 2e9d63d3e213939615d3dcc44bcb3aa2e8dfa77f change-id: 20250831-genfiles-46787fc10869 -- Sincerely, Demi Marie Obenour (she/her/hers)