;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;; Core services.
;;;
-(define (system-derivation mentries mextensions)
+(define (system-derivation entries mextensions)
"Return as a monadic value the derivation of the 'system' directory
containing the given entries."
- (mlet %store-monad ((entries mentries)
- (extensions (sequence %store-monad mextensions)))
+ (mlet %store-monad ((extensions (mapm/accumulate-builds identity
+ mextensions)))
(lower-object
(file-union "system"
(append entries (concatenate extensions))))))
#~(begin
(setenv "LINUX_MODULE_DIRECTORY"
"/run/booted-system/kernel/lib/modules")
+ ;; FIXME: Remove this crutch when the patch #40422,
+ ;; updating to kmod 27 is merged.
+ (setenv "MODPROBE_OPTIONS"
+ "-C /etc/modprobe.d")
(apply execl #$modprobe
(cons #$modprobe (cdr (command-line))))))))
(files->etc-directory (service-value service)))
(define (files->etc-directory files)
+ (define (assert-no-duplicates files)
+ (let loop ((files files)
+ (seen (set)))
+ (match files
+ (() #t)
+ (((file _) rest ...)
+ (when (set-contains? seen file)
+ (raise (condition
+ (&message
+ (message (format #f (G_ "duplicate '~a' entry for /etc")
+ file))))))
+ (loop rest (set-insert file seen))))))
+
+ ;; Detect duplicates early instead of letting them through, eventually
+ ;; leading to a build failure of "etc.drv".
+ (assert-no-duplicates files)
+
(file-union "etc" files))
(define (etc-entry files)
(define (packages->profile-entry packages)
"Return a system entry for the profile containing PACKAGES."
- (mlet %store-monad ((profile (profile-derivation
- (packages->manifest
- (delete-duplicates packages eq?)))))
- (return `(("profile" ,profile)))))
+ (with-monad %store-monad
+ (return `(("profile" ,(profile
+ (content (packages->manifest
+ (delete-duplicates packages eq?)))))))))
(define profile-service-type
;; The service that populates the system's profile---i.e.,