Subject: bug#12887: Broken pipe while generating guile-procedures.texi

From: [email-masked] (Ludovic Courtès)
Date: Fri, 07 Dec 2012 22:59:55 +0100

Hi,

Thanks for your feedback!

DNS <[email-masked]> skribis:

> sorry for my late reply, and thx a lot for your help.
> i was compiling 2.0.7 and had the same issue, then i was finally lookin
> at the log and figured out that it is because of a "umlaut" char in the
> parent directory-name where i tried to build guile.
> The directory was called "Arbeitsfläche" ("desktop" in german) and in
> the log i saw the files could not be found because the dir-name was not
> correctly converted (into UTF-8 i guess). The dir name was shown as
> "Arbeitsf??che"...

Ooh, I see.  This is related to commit ed4c3739 (see
<http://lists.gnu.org/archive/html/guile-devel/2011-12/msg00160.html>).

What happens is that the directory name may be correctly decoded when
passed as an argument:

--8<---------------cut here---------------start------------->8---
[ludo@pluto:~/tmp/Courtès]$ strace -f -o ,,s ~/src/guile/meta/guile -L $PWD -c '(set-port-encoding! (current-output-port) "UTF-8")(pk %load-path)'

;;; (("/home/ludo/tmp/Courtès" ...))
--8<---------------cut here---------------end--------------->8---

But then ‘scm_stat’ calls ‘scm_to_locale_string’, which uses the wrong
encoding at this point, leading to this:

--8<---------------cut here---------------start------------->8---
[ludo@pluto:~/tmp/Courtès]$ strace -f -o ,,s ~/src/guile/meta/guile -L $PWD -c '(use-modules (t))'

[...]

ERROR: In procedure scm-error:
ERROR: no code for module (t)

[ludo@pluto:~/tmp/Courtès]$ grep Court ,,s | head -10
24237 execve("/home/ludo/src/guile/meta/guile", ["/home/ludo/src/guile/meta/guile", "-L", "/home/ludo/tmp/Court\303\250s", "-c", "(use-modules (t))"], [/* 74 vars */]) = 0
24237 stat("/home/ludo/tmp/Court\303\250s", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
24237 execve("/home/ludo/src/guile/meta/uninstalled-env", ["/home/ludo/src/guile/meta/uninst"..., "/home/ludo/src/guile/libguile/gu"..., "-L", "/home/ludo/tmp/Court\303\250s", "-c", "(use-modules (t))"], [/* 73 vars */]) = 0
24237 stat("/home/ludo/tmp/Court\303\250s", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
24237 execve("/home/ludo/src/guile/libguile/guile", ["/home/ludo/src/guile/libguile/gu"..., "-L", "/home/ludo/tmp/Court\303\250s", "-c", "(use-modules (t))"], [/* 78 vars */]) = 0
24237 stat("/home/ludo/tmp/Court\303\250s", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
24256 read(3, "ludo\0x\0Ludovic Courtes\0/home/lud"..., 70) = 70
24237 execve("/home/ludo/src/guile/libguile/.libs/guile", ["/home/ludo/src/guile/libguile/.l"..., "-L", "/home/ludo/tmp/Court\303\250s", "-c", "(use-modules (t))"], [/* 80 vars */]) = 0
24237 stat("/home/ludo/tmp/Court?s/t.scm", 0x7fff16fda150) = -1 ENOENT (No such file or directory)
24237 stat("/home/ludo/tmp/Court?s/t", 0x7fff16fda150) = -1 ENOENT (No such file or directory)
--8<---------------cut here---------------end--------------->8---

The problem is even worse when the directory is passed through an
environment variable, because in that case even the input decoding is
broken:

--8<---------------cut here---------------start------------->8---
[ludo@pluto:~/tmp/Courtès]$ GUILE_LOAD_PATH=$PWD:... ~/src/guile/meta/guile -c '(set-port-encoding! (current-output-port) "UTF-8")(pk %load-path)'

;;; (("/home/ludo/src/guile/guile-readline" "/home/ludo/src/guile/module" "/home/ludo/tmp/Court??s"))
--8<---------------cut here---------------end--------------->8---

Ouch!

So, as mentioned in the thread above, 2.2 will not have this problem.
But for 2.0, I can’t even imagine an ugly hack that would help.

Thoughts?

Ludo’.