Bug#734009: auto-compile noise can't be avoided by script

2014-01-05 Thread Zefram
Upstream:
http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16364

-zefram


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org



Bug#734009: auto-compile noise can't be avoided by script

2014-01-02 Thread Zefram
Package: guile-2.0
Version: 2.0.9+1-1
Severity: important

Guile 2.0 has a facility to automatically cache a compiled version of any
Scheme source file that it loads, and it wants the world to know about it!
If auto-compilation is enabled, which it is by default, then when guile
loads a file (that was not already compiled) it emits a banner describing
the auto-compilation.  This interferes with the proper functionality
of any program written as a guile script, by producing output that the
program did not intend.  I have tried to work around this, and although
a command-line switch can turn off the auto-compilation, it's a switch
that isn't recognised by earlier versions of guile, so there's no way for
a script to avoid the noise while being portable between guile versions
1.8 and 2.0.  There's also no way to avoid the noise and actually get
the auto-compilation behaviour.

I am mainly concerned about being portable between versions while
avoiding the noise.  In my particular case, my script uses the
read-eval (#.) feature, which means that the compilation process
actually can't work.  (I have good reason for this, and for related
reasons the auto-compilation is also of essentially no value for
this script.)  This means that *every* time the script is run, not
just the first time, guile emits the banner about auto-compilation,
followed by a rather misleading warning/error about compilation failure.
It's misleading because it then goes on to execute the script just fine.
I can demonstrate this with a minimal test case:

$ cat t0
#!/usr/bin/guile -s
!#
(fluid-set! read-eval? #t)
(display #."hello world")
(newline)
$ guile-1.8 -s t0
hello world
$ guile-2.0 -s t0
;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0
;;;   or pass the --no-auto-compile argument to disable.
;;; compiling /home/zefram/usr/lucifex/on_guile/t0
;;; WARNING: compilation of /home/zefram/usr/lucifex/on_guile/t0 failed:
;;; ERROR: #. read expansion found and read-eval? is #f.
hello world
$

I can turn off the auto-compilation from within the script by using the
--no-auto-compile option, but that breaks compatibility to 1.8:

$ cat t1
#!/usr/bin/guile \
--no-auto-compile -s
!#
(fluid-set! read-eval? #t)
(display #."hello world")
(newline)
$ guile-2.0 '\' t1
hello world
$ guile-1.8 '\' t1
guile-1.8: Unrecognized switch `--no-auto-compile'
Usage: guile-1.8 OPTION ...
Evaluate Scheme code, interactively or from a script.
...

guile should not be emitting this banner by default.  It's really not
acceptable to damage the visible behaviour of a program that worked
fine on older guile versions.  It also, for this auto-compilation to
serve as the invisible optimising cache as which it's intended, ought to
keep quiet about compilation failure: the fallback to interpreting the
script should be silent.  But if such sensible behaviour is somehow not
possible, it absolutely needs to be possible for a script to turn off the
auto-compilation in a way that's compatible with guile-1.8 and earlier.
I have rated this bug "important" because of this lack of workaround.

-zefram


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org



Bug#734009: auto-compile noise can't be avoided by script

2014-01-04 Thread Zefram
I wrote:
>a command-line switch can turn off the auto-compilation,

On closer examination, it turns out that aside from the portability
concern that I described, turning off auto-compilation doesn't actually
fix the problem.  If a compiled version has previously been cached for
the filename of a script being run, guile will consider using the cached
version even if --no-auto-compile was supplied: the switch only controls
the attempt to compile for the cache.  If the cached compilation is up
to date then it is used silently, which is OK.  But if it's out of date,
because the cache was for a different script that previously existed
under the same name, then guile emits a banner saying that it's out of
date (implying that the cached compilation is therefore not being used).
So the script's visible behaviour is defiled even if it applies the
option.

Observe what happens to the second script in this sequence:

$ echo '(display "hello world\n")' >t10
$ guile-2.0 t10
;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0
;;;   or pass the --no-auto-compile argument to disable.
;;; compiling /home/zefram/usr/guile/t10
;;; compiled 
/home/zefram/.cache/guile/ccache/2.0-LE-8-2.0/home/zefram/usr/guile/t10.go
hello world
$ echo '(display "goodbye world\n")' >t10
$ guile-2.0 --no-auto-compile t10
;;; note: source file /home/zefram/usr/guile/t10
;;;   newer than compiled 
/home/zefram/.cache/guile/ccache/2.0-LE-8-2.0/home/zefram/usr/guile/t10.go
goodbye world

-zefram


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org



Bug#734009: auto-compile noise can't be avoided by script

2014-01-04 Thread Zefram
I wrote:
>I have rated this bug "important" because of this lack of workaround.

I have come up with a truly ugly workaround.  The meta option system
can be used to introduce a -c option that explicitly loads the script
file via primitive-eval, which does not attempt compilation.  (Nor does
it look at the compilation cache, so this even avoids the problem that
--no-auto-compile runs into.)  Running the script this way yields a
different command line (visible through (program-arguments)) from that
which arrives when the script is run via -s, so if the script is to
process its command line, for robustness it must pay attention to which
way it was invoked.  All together, this looks like:

$ cat t11
#!/usr/bin/guile \
-c (begin\
\ \ \ (define\ arg-hack\ #t)\
\ \ \ (primitive-load\ (cadr\ (program-arguments
!#
(define argv
  (if (false-if-exception arg-hack)
(cdr (program-arguments))
(program-arguments)))
(write argv)
(newline)
$ guile-1.6 '\' t11 a b c
("t11" "a" "b" "c")
$ guile-1.6 -s t11 a b c 
("t11" "a" "b" "c")
$ guile-1.8 '\' t11 a b c
("t11" "a" "b" "c")
$ guile-1.8 -s t11 a b c 
("t11" "a" "b" "c")
$ guile-2.0 '\' t11 a b c
("t11" "a" "b" "c")
$ guile-2.0 -s t11 a b c 
;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0
;;;   or pass the --no-auto-compile argument to disable.
;;; compiling /home/zefram/usr/guile/t11
;;; /home/zefram/usr/guile/t11:7:6: warning: possibly unbound variable 
`arg-hack'
;;; compiled 
/home/zefram/.cache/guile/ccache/2.0-LE-8-2.0/home/zefram/usr/guile/t11.go
("t11" "a" "b" "c")
$ guile-2.0 -s t11 a b c
("t11" "a" "b" "c")

I'm not comfortable with this as a workaround.  It smells fragile.
So for the time being I'm leaving the "important" severity tag, but I'm
open to being convinced that it's better than I think.

Note that though this does avoid the banner appearing for #!-based
executions, it's not muffling the banner per se but actually preventing
compilation.  While for some programs it's desirable to prevent
compilation per se (because of the compiler's limitations), there are
plenty of programs that would like to be compiled and only want to muffle
the banner.  Losing the efficiency of compilation is potentially a high
price to pay for clean output.

-zefram


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org