| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
| 16 | |
| 17 | |
| 18 |
|
| 19 | |
| 20 | |
| 21 | |
| 22 |
|
| 23 | set -e
|
| 24 |
|
| 25 | guix-daemon --version
|
| 26 | guix build --version
|
| 27 |
|
| 28 | drv="`guix build emacs -d`"
|
| 29 | out="`guile -c ' \
|
| 30 | (use-modules (guix) (gnu packages emacs)) \
|
| 31 | (define store (open-connection)) \
|
| 32 | (%graft? #f)
|
| 33 | (display (derivation->output-path (package-derivation store emacs)))'`"
|
| 34 |
|
| 35 | hash_part="`basename $out | cut -c 1-32`"
|
| 36 | narinfo="$hash_part.narinfo"
|
| 37 | substitute_dir="`echo $GUIX_BINARY_SUBSTITUTE_URL | sed -'es,file://,,g'`"
|
| 38 |
|
| 39 | cat > "$substitute_dir/nix-cache-info"<<EOF
|
| 40 | StoreDir: `dirname $drv`
|
| 41 | WantMassQuery: 0
|
| 42 | EOF
|
| 43 |
|
| 44 | cat > "$substitute_dir/$narinfo"<<EOF
|
| 45 | StorePath: $out
|
| 46 | URL: /nowhere/example.nar
|
| 47 | Compression: none
|
| 48 | NarSize: 1234
|
| 49 | References:
|
| 50 | System: `guile -c '(use-modules (guix)) (display (%current-system))'`
|
| 51 | Deriver: $(basename $drv)
|
| 52 | EOF
|
| 53 |
|
| 54 | |
| 55 | rm -f "$XDG_CACHE_HOME/guix/substitute/$hash_part"
|
| 56 |
|
| 57 | |
| 58 | guile -c "
|
| 59 | (use-modules (guix))
|
| 60 | (define store (open-connection))
|
| 61 | (set-build-options store #:use-substitutes? #t
|
| 62 | #:substitute-urls (list \"$GUIX_BINARY_SUBSTITUTE_URL\"))
|
| 63 | (exit (has-substitutes? store \"$out\"))"
|
| 64 |
|
| 65 | |
| 66 | socket="$GUIX_STATE_DIRECTORY/alternate-socket"
|
| 67 | guix-daemon --no-substitutes --listen="$socket" --disable-chroot &
|
| 68 | daemon_pid=$!
|
| 69 | trap 'kill $daemon_pid' EXIT
|
| 70 |
|
| 71 | |
| 72 | guile -c "
|
| 73 | (use-modules (guix))
|
| 74 | (define store (open-connection \"$socket\"))
|
| 75 |
|
| 76 | ;; This setting MUST NOT override the daemon's --no-substitutes.
|
| 77 | (set-build-options store #:use-substitutes? #t
|
| 78 | #:substitute-urls (list \"$GUIX_BINARY_SUBSTITUTE_URL\"))
|
| 79 |
|
| 80 | (exit (not (has-substitutes? store \"$out\")))"
|
| 81 |
|
| 82 | kill "$daemon_pid"
|
| 83 |
|
| 84 | |
| 85 | guix-daemon --disable-chroot --listen="$socket" --listen="$socket-second" \
|
| 86 | --listen="localhost" --listen="localhost:9876" &
|
| 87 | daemon_pid=$!
|
| 88 |
|
| 89 | for uri in "$socket" "$socket-second" \
|
| 90 | "guix://localhost" "guix://localhost:9876"
|
| 91 | do
|
| 92 | GUIX_DAEMON_SOCKET="$uri" guix build guile-bootstrap
|
| 93 | done
|
| 94 |
|
| 95 | kill "$daemon_pid"
|
| 96 |
|
| 97 | |
| 98 |
|
| 99 | orig_GUIX_STATE_DIRECTORY="$GUIX_STATE_DIRECTORY"
|
| 100 | GUIX_STATE_DIRECTORY="$GUIX_STATE_DIRECTORY-2"
|
| 101 |
|
| 102 | guix-daemon --disable-chroot --listen="localhost:9877" &
|
| 103 | daemon_pid=$!
|
| 104 |
|
| 105 | GUIX_DAEMON_SOCKET="guix://localhost:9877"
|
| 106 | export GUIX_DAEMON_SOCKET
|
| 107 |
|
| 108 | test ! -d "$GUIX_STATE_DIRECTORY/profiles/per-user"
|
| 109 |
|
| 110 | guix build guile-bootstrap -d
|
| 111 |
|
| 112 | test -d "$GUIX_STATE_DIRECTORY/profiles/per-user/$USER"
|
| 113 |
|
| 114 | kill "$daemon_pid"
|
| 115 | unset GUIX_DAEMON_SOCKET
|
| 116 | GUIX_STATE_DIRECTORY="$orig_GUIX_STATE_DIRECTORY"
|
| 117 |
|
| 118 | |
| 119 |
|
| 120 | guix-daemon --no-substitutes --listen="$socket" --disable-chroot \
|
| 121 | --cache-failures &
|
| 122 | daemon_pid=$!
|
| 123 |
|
| 124 | guile -c "
|
| 125 | (use-modules (guix) (guix tests) (srfi srfi-34))
|
| 126 | (define store (open-connection-for-tests \"$socket\"))
|
| 127 |
|
| 128 | ;; Disable grafts to avoid building more than needed.
|
| 129 | (%graft? #f)
|
| 130 |
|
| 131 | (define (build-without-failing drv)
|
| 132 | (lambda (store)
|
| 133 | (guard (c ((store-protocol-error? c) (values #t store)))
|
| 134 | (build-derivations store (list drv))
|
| 135 | (values #f store))))
|
| 136 |
|
| 137 | ;; Make sure failed builds are cached and can be removed from
|
| 138 | ;; the cache.
|
| 139 | (run-with-store store
|
| 140 | (mlet* %store-monad ((drv (gexp->derivation \"failure\"
|
| 141 | #~(begin
|
| 142 | (ungexp output)
|
| 143 | #f)))
|
| 144 | (out -> (derivation->output-path drv))
|
| 145 | (ok? (build-without-failing drv)))
|
| 146 | ;; Note the mixture of monadic and direct style. Don't try
|
| 147 | ;; this at home!
|
| 148 | (return (exit (and ok?
|
| 149 | (equal? (query-failed-paths store) (list out))
|
| 150 | (begin
|
| 151 | (clear-failed-paths store (list out))
|
| 152 | (null? (query-failed-paths store)))))))
|
| 153 | #:guile-for-build (%guile-for-build)) "
|
| 154 |
|
| 155 | kill "$daemon_pid"
|
| 156 |
|
| 157 |
|
| 158 | |
| 159 |
|
| 160 | guix-daemon --listen="$socket" --disable-chroot --cores=42 &
|
| 161 | daemon_pid=$!
|
| 162 |
|
| 163 | GUIX_DAEMON_SOCKET="$socket" \
|
| 164 | guile -c '
|
| 165 | (use-modules (guix) (guix tests))
|
| 166 |
|
| 167 | (with-store store
|
| 168 | (let* ((build (add-text-to-store store "build.sh"
|
| 169 | "echo $NIX_BUILD_CORES > $out"))
|
| 170 | (bash (add-to-store store "bash" #t "sha256"
|
| 171 | (search-bootstrap-binary "bash"
|
| 172 | (%current-system))))
|
| 173 | (drv (derivation store "the-thing" bash
|
| 174 | `("-e" ,build)
|
| 175 | #:inputs `((,bash) (,build))
|
| 176 | #:env-vars `(("x" . ,(random-text))))))
|
| 177 | (and (build-derivations store (list drv))
|
| 178 | (exit
|
| 179 | (= 42 (pk (call-with-input-file (derivation->output-path drv)
|
| 180 | read)))))))'
|
| 181 |
|
| 182 |
|
| 183 | kill "$daemon_pid"
|
| 184 |
|
| 185 | |
| 186 | |
| 187 |
|
| 188 | client_code='
|
| 189 | (use-modules (guix) (guix tests) (srfi srfi-34))
|
| 190 |
|
| 191 | (with-store store
|
| 192 | (let* ((build (add-text-to-store store "build.sh"
|
| 193 | "while true ; do : ; done"))
|
| 194 | (bash (add-to-store store "bash" #t "sha256"
|
| 195 | (search-bootstrap-binary "bash"
|
| 196 | (%current-system))))
|
| 197 | (drv (derivation store "the-thing" bash
|
| 198 | `("-e" ,build)
|
| 199 | #:inputs `((,bash) (,build))
|
| 200 | #:env-vars `(("x" . ,(random-text))))))
|
| 201 | (exit (guard (c ((store-protocol-error? c)
|
| 202 | (->bool
|
| 203 | (string-contains (pk (store-protocol-error-message c))
|
| 204 | "failed"))))
|
| 205 | (build-derivations store (list drv))
|
| 206 | #f))))'
|
| 207 |
|
| 208 |
|
| 209 | for option in --max-silent-time=1 --timeout=1
|
| 210 | do
|
| 211 | guix-daemon --listen="$socket" --disable-chroot "$option" &
|
| 212 | daemon_pid=$!
|
| 213 |
|
| 214 | GUIX_DAEMON_SOCKET="$socket" guile -c "$client_code"
|
| 215 | kill "$daemon_pid"
|
| 216 | done
|
| 217 |
|
| 218 | |
| 219 |
|
| 220 | tcp_socket="127.0.0.1:9998"
|
| 221 | guix-daemon --listen="$tcp_socket" &
|
| 222 | daemon_pid=$!
|
| 223 |
|
| 224 | GUIX_DAEMON_SOCKET="guix://$tcp_socket"
|
| 225 | export GUIX_DAEMON_SOCKET
|
| 226 |
|
| 227 | guix gc && false
|
| 228 |
|
| 229 | unset GUIX_DAEMON_SOCKET
|
| 230 | kill "$daemon_pid"
|
| 231 |
|
| 232 | |
| 233 |
|
| 234 | guix-daemon --listen="$socket" --disable-chroot --debug --log-compression=gzip &
|
| 235 | daemon_pid=$!
|
| 236 |
|
| 237 | stamp="compressed-build-log-test-$$-`date +%H%M%S`"
|
| 238 | client_code="
|
| 239 | (use-modules (guix) (gnu packages bootstrap))
|
| 240 |
|
| 241 | (with-store store
|
| 242 | (run-with-store store
|
| 243 | (mlet %store-monad ((drv (lower-object
|
| 244 | (computed-file \"compressed-log-test\"
|
| 245 | #~(begin
|
| 246 | (display \"$stamp\")
|
| 247 | (newline)
|
| 248 | (mkdir #\$output))
|
| 249 | #:guile %bootstrap-guile))))
|
| 250 | (display (derivation-file-name drv))
|
| 251 | (newline)
|
| 252 | (return #t))))
|
| 253 | "
|
| 254 |
|
| 255 | GUIX_DAEMON_SOCKET="$socket"
|
| 256 | export GUIX_DAEMON_SOCKET
|
| 257 |
|
| 258 | drv=`guile -c "$client_code"`
|
| 259 | guix build "$drv"
|
| 260 |
|
| 261 | log=`guix build "$drv" --log-file`
|
| 262 | test -f "$log"
|
| 263 | case "$log" in
|
| 264 | *.gz) test "`gunzip -c < "$log" | grep -v 'guile: warning.*locale'`" = "$stamp" ;;
|
| 265 | *) false ;;
|
| 266 | esac
|