Subject: error message when referencing non-existing output not helpful

From: Ricardo Wurmus <[email-masked]>
Date: Mon, 19 Jan 2015 12:51:20 +0100

When a package recipe specifies as input a non-existing output of a
package, the build process fails with a rather unhelpful late error
message.

The following is the output of building a package that depends on the
"bin" output of libtool, which has since been removed.

~~~~~
[rwurmus@workstation:~/code/guix] (599) $ ./pre-inst-env guix build ijs
Backtrace:
In ice-9/boot-9.scm:
 157: 18 [catch #t #<catch-closure 10e4d60> ...]
In unknown file:
   ?: 17 [apply-smob/1 #<catch-closure 10e4d60>]
In ice-9/boot-9.scm:
  63: 16 [call-with-prompt prompt0 ...]
In ice-9/eval.scm:
 432: 15 [eval # #]
In ice-9/boot-9.scm:
2401: 14 [save-module-excursion #<procedure 1100940 at ice-9/boot-9.scm:4045:3 ()>]
4050: 13 [#<procedure 1100940 at ice-9/boot-9.scm:4045:3 ()>]
1724: 12 [%start-stack load-stack ...]
1729: 11 [#<procedure 1118ea0 ()>]
In unknown file:
   ?: 10 [primitive-load "/home/rwurmus/code/guix/scripts/guix"]
In guix/ui.scm:
 787: 9 [run-guix-command build "ijs"]
In ice-9/boot-9.scm:
 157: 8 [catch srfi-34 #<procedure 1872840 at guix/ui.scm:218:2 ()> ...]
 157: 7 [catch system-error ...]
In guix/scripts/build.scm:
 436: 6 [#<procedure 1872860 at guix/scripts/build.scm:422:2 ()>]
In guix/ui.scm:
 307: 5 [show-what-to-build #<build-daemon 256.14 17d7200> (#) #:dry-run? ...]
In guix/derivations.scm:
 226: 4 [substitution-oracle #<build-daemon 256.14 17d7200> (#)]
In guix/store.scm:
 705: 3 [substitutable-paths # #]
In srfi/srfi-1.scm:
 619: 2 [for-each #<procedure 383ed80 at guix/serialization.scm:118:12 (t-3793)> #]
In guix/serialization.scm:
  85: 1 [write-string #f #<input-output: socket 10>]
In unknown file:
   ?: 0 [string->utf8 #f]

ERROR: In procedure string->utf8:
ERROR: In procedure string->utf8: Wrong type argument in position 1 (expecting string): #f
~~~~~

The error message is triggered by an unexpected #f in a long list of
paths.  It would be more helpful if an earlier error was produced that
indicates that the cause is a non-existing package output.