mirror of
https://git.savannah.gnu.org/git/guix.git
synced 2026-04-06 21:20:33 +02:00
This adds a mechanism for manipulating and running "spawn phases" similarly to
how builder-side code manipulates "build phases". The main difference is that
spawn phases take a (reference to a) single structure that they can both read
from and write to, with their writes being visible to subsequent phases. The
base structure type for this is SpawnContext.
It also adds some predefined phase sequences, namely basicSpawnPhases and
cloneSpawnPhases, and exposes each of the actions performed by these phases.
Finally, it modifies build.cc to replace runChild() with use of this new code.
* nix/libutil/util.cc (keepOnExec, waitForMessage): new functions.
* nix/libutil.util.hh (keepOnExec, waitForMessage): add prototypes.
* nix/libutil/spawn.cc, nix/libutil/spawn.hh: new files.
(addPhaseAfter, addPhaseBefore, prependPhase, appendPhase, deletePhase,
replacePhase, reset_writeToStderrAction, restoreAffinityAction,
setsidAction, earlyIOSetupAction, dropAmbientCapabilitiesAction,
chrootAction, chdirAction, closeMostFDsAction, setPersonalityAction,
oomSacrificeAction, setIDsAction, restoreSIGPIPEAction, setupSuccessAction,
execAction, getBasicSpawnPhases, usernsInitSyncAction, usernsSetIDsAction,
initLoopbackAction, setHostAndDomainAction, makeFilesystemsPrivateAction,
makeChrootSeparateFilesystemAction, statfsToMountFlags, bindMount,
mountIntoChroot, mountIntoChrootAction, mountProcAction, mountDevshmAction,
mountDevptsAction, pivotRootAction, lockMountsAction, getCloneSpawnPhases,
runChildSetup, runChildSetupEntry, cloneChild, idMapToIdentityMap,
unshareAndInitUserns): new procedures.
* nix/local.mk (libutil_a_SOURCES): add spawn.cc.
(libutil_headers): add spawn.hh.
* nix/libstore/build.cc (restoreSIGPIPE, DerivationGoal::runChild,
childEntry): removed procedures.
(DerivationGoal::{dirsInChroot,env,readiness}): removed.
(execBuilderOrBuiltin, execBuilderOrBuiltinAction,
clearRootWritePermsAction): new procedures.
(DerivationGoal::startBuilder): modified to use a CloneSpawnContext if
chroot builds are available, otherwise a SpawnContext.
Change-Id: Ifd50110de077378ee151502eda62b99973d083bf
Change-Id: I76e10d3f928cc30566e1e6ca79077196972349f8
spawn.cc, util.cc, util.hh changes
Change-Id: I287320e63197cb4f65665ee5b3fdb3a0e125ebac
Signed-off-by: John Kehayias <john.kehayias@protonmail.com>
256 lines
7.3 KiB
Makefile
256 lines
7.3 KiB
Makefile
# GNU Guix --- Functional package management for GNU
|
|
# Copyright © 2012-2016, 2018-2020, 2024-2025 Ludovic Courtès <ludo@gnu.org>
|
|
# Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
|
|
# Copyright © 2020 Tobias Geerinckx-Rice <me@tobias.gr>
|
|
#
|
|
# This file is part of GNU Guix.
|
|
#
|
|
# GNU Guix is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or (at
|
|
# your option) any later version.
|
|
#
|
|
# GNU Guix is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#
|
|
# Integration of the `guix-daemon' code taken from upstream Nix.
|
|
#
|
|
|
|
BUILT_SOURCES += %D%/libstore/schema.sql.hh
|
|
CLEANFILES += %D%/libstore/schema.sql.hh
|
|
|
|
noinst_LIBRARIES = libformat.a libutil.a libstore.a
|
|
|
|
# Use '-std=c++11' for 'std::shared_ptr', 'auto', lambdas, and more.
|
|
AM_CXXFLAGS = -Wall -std=c++11
|
|
|
|
libformat_a_SOURCES = \
|
|
%D%/boost/format/free_funcs.cc \
|
|
%D%/boost/format/parsing.cc \
|
|
%D%/boost/format/format_implementation.cc
|
|
|
|
libformat_headers = \
|
|
%D%/boost/throw_exception.hpp \
|
|
%D%/boost/format.hpp \
|
|
%D%/boost/assert.hpp \
|
|
%D%/boost/format/macros_default.hpp \
|
|
%D%/boost/format/format_fwd.hpp \
|
|
%D%/boost/format/format_class.hpp \
|
|
%D%/boost/format/exceptions.hpp \
|
|
%D%/boost/format/group.hpp \
|
|
%D%/boost/format/feed_args.hpp \
|
|
%D%/boost/format/internals_fwd.hpp \
|
|
%D%/boost/format/internals.hpp
|
|
|
|
libformat_a_CPPFLAGS = \
|
|
-I$(top_srcdir)/nix
|
|
|
|
libutil_a_SOURCES = \
|
|
%D%/libutil/archive.cc \
|
|
%D%/libutil/affinity.cc \
|
|
%D%/libutil/serialise.cc \
|
|
%D%/libutil/util.cc \
|
|
%D%/libutil/hash.cc \
|
|
%D%/libutil/spawn.cc
|
|
|
|
libutil_headers = \
|
|
%D%/libutil/affinity.hh \
|
|
%D%/libutil/hash.hh \
|
|
%D%/libutil/serialise.hh \
|
|
%D%/libutil/util.hh \
|
|
%D%/libutil/archive.hh \
|
|
%D%/libutil/types.hh \
|
|
%D%/libutil/spawn.hh
|
|
|
|
libutil_a_CPPFLAGS = \
|
|
-I$(top_builddir)/nix \
|
|
-I$(top_srcdir)/%D%/libutil \
|
|
$(libformat_a_CPPFLAGS) \
|
|
$(LIBGCRYPT_CPPFLAGS)
|
|
|
|
libstore_a_SOURCES = \
|
|
%D%/libstore/gc.cc \
|
|
%D%/libstore/globals.cc \
|
|
%D%/libstore/misc.cc \
|
|
%D%/libstore/references.cc \
|
|
%D%/libstore/store-api.cc \
|
|
%D%/libstore/optimise-store.cc \
|
|
%D%/libstore/local-store.cc \
|
|
%D%/libstore/build.cc \
|
|
%D%/libstore/pathlocks.cc \
|
|
%D%/libstore/derivations.cc \
|
|
%D%/libstore/builtins.cc \
|
|
%D%/libstore/sqlite.cc
|
|
|
|
libstore_headers = \
|
|
%D%/libstore/references.hh \
|
|
%D%/libstore/pathlocks.hh \
|
|
%D%/libstore/globals.hh \
|
|
%D%/libstore/worker-protocol.hh \
|
|
%D%/libstore/derivations.hh \
|
|
%D%/libstore/misc.hh \
|
|
%D%/libstore/local-store.hh \
|
|
%D%/libstore/sqlite.hh \
|
|
%D%/libstore/builtins.hh \
|
|
%D%/libstore/store-api.hh
|
|
|
|
libstore_a_CPPFLAGS = \
|
|
$(libutil_a_CPPFLAGS) \
|
|
-I$(top_srcdir)/%D%/libstore \
|
|
-I$(top_builddir)/%D%/libstore \
|
|
-DNIX_STORE_DIR=\"$(storedir)\" \
|
|
-DNIX_STATE_DIR=\"$(localstatedir)/guix\" \
|
|
-DNIX_LOG_DIR=\"$(localstatedir)/log/guix\" \
|
|
-DGUIX_CONFIGURATION_DIRECTORY=\"$(sysconfdir)/guix\" \
|
|
-DNIX_BIN_DIR=\"$(bindir)\" \
|
|
-DDEFAULT_CHROOT_DIRS="\"\""
|
|
|
|
libstore_a_CXXFLAGS = $(AM_CXXFLAGS) \
|
|
$(SQLITE3_CFLAGS)
|
|
|
|
bin_PROGRAMS = guix-daemon
|
|
|
|
guix_daemon_SOURCES = \
|
|
%D%/nix-daemon/nix-daemon.cc \
|
|
%D%/nix-daemon/guix-daemon.cc
|
|
|
|
guix_daemon_CPPFLAGS = \
|
|
-DLOCALEDIR=\"$(localedir)\" \
|
|
$(libutil_a_CPPFLAGS) \
|
|
-I$(top_srcdir)/%D%/libstore
|
|
|
|
guix_daemon_LDFLAGS = \
|
|
$(LIBGCRYPT_LDFLAGS)
|
|
|
|
guix_daemon_LDADD = \
|
|
libstore.a libutil.a libformat.a -lz \
|
|
$(SQLITE3_LIBS) $(LIBGCRYPT_LIBS)
|
|
|
|
guix_daemon_headers = \
|
|
%D%/nix-daemon/shared.hh
|
|
|
|
if HAVE_LIBBZ2
|
|
|
|
guix_daemon_LDADD += -lbz2
|
|
|
|
endif HAVE_LIBBZ2
|
|
|
|
noinst_HEADERS = \
|
|
$(libformat_headers) $(libutil_headers) $(libstore_headers) \
|
|
$(guix_daemon_headers)
|
|
|
|
%D%/libstore/schema.sql.hh: guix/store/schema.sql
|
|
$(AM_V_GEN)$(GUILE) --no-auto-compile -c \
|
|
"(use-modules (rnrs io ports)) \
|
|
(call-with-output-file \"$@\" \
|
|
(lambda (out) \
|
|
(call-with-input-file \"$^\" \
|
|
(lambda (in) \
|
|
(write (get-string-all in) out)))))"
|
|
|
|
# The '.service' and other files for systemd.
|
|
systemdservicedir = $(libdir)/systemd/system
|
|
nodist_systemdservice_DATA = \
|
|
etc/gnu-store.mount \
|
|
etc/guix-daemon.service \
|
|
etc/guix-publish.service \
|
|
etc/guix-gc.service \
|
|
etc/guix-gc.timer
|
|
|
|
etc/%.mount: etc/%.mount.in \
|
|
$(top_builddir)/config.status
|
|
$(AM_V_GEN)$(MKDIR_P) "`dirname $@`"; \
|
|
$(SED) -e 's|@''storedir''@|$(storedir)|' < \
|
|
"$<" > "$@.tmp"; \
|
|
mv "$@.tmp" "$@"
|
|
|
|
etc/guix-%.service: etc/guix-%.service.in \
|
|
$(top_builddir)/config.status
|
|
$(AM_V_GEN)$(MKDIR_P) "`dirname $@`"; \
|
|
$(SED) -e 's|@''localstatedir''@|$(localstatedir)|g' \
|
|
-e 's|@''storedir''@|$(storedir)|g' \
|
|
-e 's|@''GUIX_SUBSTITUTE_URLS''@|$(GUIX_SUBSTITUTE_URLS)|' \
|
|
< "$<" > "$@.tmp"; \
|
|
mv "$@.tmp" "$@"
|
|
|
|
etc/guix-gc.timer: etc/guix-gc.timer.in \
|
|
$(top_builddir)/config.status
|
|
$(AM_V_GEN)$(MKDIR_P) "`dirname $@`"; \
|
|
cp "$@.in" "$@"
|
|
|
|
# The service script for sysvinit.
|
|
sysvinitservicedir = $(sysconfdir)/init.d
|
|
nodist_sysvinitservice_DATA = etc/init.d/guix-daemon
|
|
|
|
etc/init.d/guix-daemon: etc/init.d/guix-daemon.in \
|
|
$(top_builddir)/config.status
|
|
$(AM_V_GEN)$(MKDIR_P) "`dirname $@`"; \
|
|
$(SED) -e 's|@''localstatedir''@|$(localstatedir)|' \
|
|
-e 's|@''GUIX_SUBSTITUTE_URLS''@|$(GUIX_SUBSTITUTE_URLS)|' \
|
|
< "$<" > "$@.tmp"; \
|
|
mv "$@.tmp" "$@"
|
|
|
|
# The service script for openrc.
|
|
openrcservicedir = $(sysconfdir)/openrc
|
|
nodist_openrcservice_DATA = etc/openrc/guix-daemon
|
|
|
|
etc/openrc/guix-daemon: etc/openrc/guix-daemon.in \
|
|
$(top_builddir)/config.status
|
|
$(AM_V_GEN)$(MKDIR_P) "`dirname $@`"; \
|
|
$(SED) -e 's|@''localstatedir''@|$(localstatedir)|' < \
|
|
"$<" > "$@.tmp"; \
|
|
mv "$@.tmp" "$@"
|
|
|
|
# The '.conf' jobs for Upstart.
|
|
upstartjobdir = $(libdir)/upstart/system
|
|
nodist_upstartjob_DATA = etc/guix-daemon.conf etc/guix-publish.conf
|
|
|
|
etc/guix-%.conf: etc/guix-%.conf.in \
|
|
$(top_builddir)/config.status
|
|
$(AM_V_GEN)$(MKDIR_P) "`dirname $@`"; \
|
|
$(SED) -e 's|@''localstatedir''@|$(localstatedir)|' \
|
|
-e 's|@''GUIX_SUBSTITUTE_URLS''@|$(GUIX_SUBSTITUTE_URLS)|' \
|
|
< "$<" > "$@.tmp"; \
|
|
mv "$@.tmp" "$@"
|
|
|
|
CLEANFILES += \
|
|
$(nodist_systemdservice_DATA) \
|
|
$(nodist_upstartjob_DATA) \
|
|
$(nodist_sysvinitservice_DATA) \
|
|
$(nodist_openrcservice_DATA)
|
|
|
|
EXTRA_DIST += \
|
|
%D%/AUTHORS \
|
|
%D%/COPYING \
|
|
etc/gnu-store.mount.in \
|
|
etc/guix-daemon.service.in \
|
|
etc/guix-daemon.conf.in \
|
|
etc/guix-publish.service.in \
|
|
etc/guix-publish.conf.in \
|
|
etc/guix-gc.service.in \
|
|
etc/guix-gc.timer.in \
|
|
etc/init.d/guix-daemon.in \
|
|
etc/openrc/guix-daemon.in
|
|
|
|
if CAN_RUN_TESTS
|
|
|
|
AM_TESTS_ENVIRONMENT += \
|
|
top_builddir="$(abs_top_builddir)"
|
|
|
|
TESTS += \
|
|
tests/guix-daemon.sh
|
|
|
|
endif CAN_RUN_TESTS
|
|
|
|
clean-local:
|
|
-if test -d "$(GUIX_TEST_ROOT)"; then \
|
|
find "$(GUIX_TEST_ROOT)" | xargs chmod +w; \
|
|
fi
|
|
-rm -rf "$(GUIX_TEST_ROOT)"
|