* [bug#73660] [PATCH] gexp: Improve support of Unicode characters.
@ 2024-10-06 15:42 Tomas Volf
2024-10-23 0:13 ` Tomas Volf
2025-01-12 15:19 ` Ludovic Courtès
0 siblings, 2 replies; 7+ messages in thread
From: Tomas Volf @ 2024-10-06 15:42 UTC (permalink / raw)
To: 73660
Cc: Tomas Volf, Christopher Baines, Florian Pelz, Josselin Poiret,
Ludovic Courtès, Mathieu Othacehe, Maxim Cournoyer,
Simon Tournier, Tobias Geerinckx-Rice
Support for non-ASCII characters was mixed. Some gexp forms did support them,
while others did not. Combined with current value for
%default-port-conversion-strategy, that sometimes led to unpleasant surprises.
For example:
(scheme-file "utf8" #~(with-output-to-file #$output
(λ _ (display "猫"))))
Was written to the store as:
((? _ (display "\u732b")))
No, that is not font issue on your part, that is an actual #\? instead of the
lambda character. Which, surprisingly, does not do what it should when
executed.
The solution is to switch to C.UTF-8 locale where possible, since it is now
always available. Or to explicitly set the port encoding.
No tests are provided, since majority of tests/gexp.scm use guile in version
2, and it tends to work under it. The issues occur mostly with guile 3.
I did test it locally using:
#!/bin/sh
set -eu
set -x
[ -f guix.scm ] || { echo >&2 Run from root of Guix repo.; exit 1; }
[ -f gnu.scm ] || { echo >&2 Run from root of Guix repo.; exit 1; }
cat >猫.scm <<'EOF'
(define-module (猫)
#:export (say))
(define (say)
"nyaaaa~~~~!")
EOF
mkdir -p dir-with-utf8-file
cp 猫.scm dir-with-utf8-file/
cat >repro.scm <<'EOF'
(use-modules (guix build utils)
(guix derivations)
(guix gexp)
(guix store)
(ice-9 ftw)
(ice-9 textual-ports))
(define cat "猫")
(define (drv-content drv)
(call-with-input-file (derivation->output-path drv)
get-string-all))
(define (out-content out)
(call-with-input-file out
get-string-all))
(define (drv-listing drv)
(scandir (derivation->output-path drv)))
(define (dir-listing dir)
(scandir dir))
(define-macro (test exp lower? report)
(let ((type (car exp)))
`(false-if-exception
(let ((drv (with-store %store
(run-with-store %store
(,(if lower? lower-object identity) ,exp)))))
(format #t "~%~a:~%" ',type)
(when (with-store %store
(build-derivations %store (list drv)))
(format #t "~a~%" (,report drv)))))))
(test (computed-file "utf8"
#~(with-output-to-file #$output
(λ _ (display #$cat))))
#t drv-content)
(test (program-file "utf8"
#~((λ _ (display #$cat))))
#t drv-content)
(test (scheme-file "utf8"
#~((λ _ (display #$cat))))
#t drv-content)
(test (text-file* "utf8" cat cat cat)
#f drv-content)
(test (compiled-modules '((猫)))
#f drv-listing)
(test (file-union "utf8" `((,cat ,(plain-file "utf8" cat))))
#t drv-listing)
;;; No fix needed:
(test (imported-modules '((猫)))
#f dir-listing)
(test (local-file "dir-with-utf8-file" #:recursive? #t)
#t dir-listing)
(test (plain-file "utf8" cat)
#t out-content)
(test (mixed-text-file "utf8" cat cat cat)
#t drv-content)
(test (directory-union "utf8" (list (local-file "dir-with-utf8-file"
#:recursive? #t)))
#t dir-listing)
EOF
guix shell -CWN -D guix glibc-locales -- \
env LANG=C.UTF-8 ./pre-inst-env guix repl -- ./repro.scm
Before this commit, the output is:
+ '[' -f guix.scm ']'
+ '[' -f gnu.scm ']'
+ cat
+ mkdir -p dir-with-utf8-file
+ cp 猫.scm dir-with-utf8-file/
+ cat
+ guix shell -CWN -D guix glibc-locales -- env LANG=C.UTF-8 ./pre-inst-env guix repl -- ./repro.scm
computed-file:
?
program-file:
#!/gnu/store/mfkz7fvlfpv3ppwbkv0imb19nrf95akf-guile-3.0.9/bin/guile --no-auto-compile
!#
((? _ (display "\u732b")))
scheme-file:
((? _ (display "\u732b")))
text-file*:
???
compiled-modules:
building path(s) `/gnu/store/ay3jifyvliigfgnz67jf0kgngzpya5a5-module-import-compiled'
Backtrace:
5 (primitive-load "/gnu/store/rn7b0dq6iqfmmqyqzamix2mjmfy?")
In ice-9/eval.scm:
619:8 4 (_ #f)
In srfi/srfi-1.scm:
460:18 3 (fold #<procedure 7ffff79245e0 at ice-9/eval.scm:336:1?> ?)
In ice-9/eval.scm:
245:16 2 (_ #(#(#<directory (guix build utils) 7ffff779f320>) # ?))
In ice-9/boot-9.scm:
1982:24 1 (_ _)
In unknown file:
0 (stat "./???.scm" #<undefined>)
ERROR: In procedure stat:
In procedure stat: No such file or directory: "./???.scm"
builder for `/gnu/store/dxg87135zcd6a1c92dlrkyvxlbhfwfld-module-import-compiled.drv' failed with exit code 1
file-union:
(. .. ?)
imported-modules:
(. .. 猫.scm)
local-file:
(. .. 猫.scm)
plain-file:
猫
mixed-text-file:
猫猫猫
directory-union:
(. .. 猫.scm)
Which I think you will agree is far from optimal. After my fix the output
changes to:
+ '[' -f guix.scm ']'
+ '[' -f gnu.scm ']'
+ cat
+ mkdir -p dir-with-utf8-file
+ cp 猫.scm dir-with-utf8-file/
+ cat
+ guix shell -CWN -D guix glibc-locales -- env LANG=C.UTF-8 ./pre-inst-env guix repl -- ./repro.scm
computed-file:
猫
program-file:
#!/gnu/store/8kbmn359jqkgsbqgqxnmiryvd9ynz8w7-guile-3.0.9/bin/guile --no-auto-compile
!#
((λ _ (display "猫")))
scheme-file:
((λ _ (display "猫")))
text-file*:
猫猫猫
compiled-modules:
(. .. 猫.go)
file-union:
(. .. 猫)
imported-modules:
(. .. 猫.scm)
local-file:
(. .. 猫.scm)
plain-file:
猫
mixed-text-file:
猫猫猫
directory-union:
(. .. 猫.scm)
Which is actually what the user would expect.
I also added missing arguments to the documentation.
* guix/gexp.scm (computed-file): Set LANG to C.UTF-8 by default.
(compiled-modules): Try to `setlocale'.
(gexp->script), (gexp->file): New `locale' argument defaulting to C.UTF-8.
(text-file*): Set output port encoding to UTF-8.
* doc/guix.texi (G-Expressions)[computed-file]: Document the changes. Use
@var. Document #:guile.
[gexp->script]: Document #:locale. Fix default value for #:target.
[gexp->file]: Document #:locale, #:system and #:target.
Change-Id: Ib323b51af88a588b780ff48ddd04db8be7c729fb
---
doc/guix.texi | 11 +++++++----
guix/gexp.scm | 24 ++++++++++++++++++------
2 files changed, 25 insertions(+), 10 deletions(-)
diff --git a/doc/guix.texi b/doc/guix.texi
index 52e36e4354..683ba2f44b 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -12270,7 +12270,9 @@ G-Expressions
This is the declarative counterpart of @code{text-file}.
@end deffn
-@deffn {Procedure} computed-file name gexp [#:local-build? #t] [#:options '()]
+@deffn {Procedure} computed-file @var{name} @var{gexp} @
+ [#:local-build? #t] [#:guile] @
+ [#:options '(#:env-vars (("LANG" . "C.UTF-8")))]
Return an object representing the store item @var{name}, a file or
directory computed by @var{gexp}. When @var{local-build?} is true (the
default), the derivation is built locally. @var{options} is a list of
@@ -12281,7 +12283,7 @@ G-Expressions
@deffn {Monadic Procedure} gexp->script @var{name} @var{exp} @
[#:guile (default-guile)] [#:module-path %load-path] @
- [#:system (%current-system)] [#:target #f]
+ [#:system (%current-system)] [#:target 'current] [#:locale "C.UTF-8"]
Return an executable script @var{name} that runs @var{exp} using
@var{guile}, with @var{exp}'s imported modules in its search path.
Look up @var{exp}'s modules in @var{module-path}.
@@ -12318,8 +12320,9 @@ G-Expressions
@deffn {Monadic Procedure} gexp->file @var{name} @var{exp} @
[#:set-load-path? #t] [#:module-path %load-path] @
- [#:splice? #f] @
- [#:guile (default-guile)]
+ [#:splice? #f] [#:guile (default-guile)] @
+ [#:system (%current-system)] [#:target 'current] @
+ [#:locale "C.UTF-8"]
Return a derivation that builds a file @var{name} containing @var{exp}.
When @var{splice?} is true, @var{exp} is considered to be a list of
expressions that will be spliced in the resulting file.
diff --git a/guix/gexp.scm b/guix/gexp.scm
index e44aea6420..c8aba91779 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -597,7 +597,10 @@ (define-record-type <computed-file>
(options computed-file-options)) ;list of arguments
(define* (computed-file name gexp
- #:key guile (local-build? #t) (options '()))
+ #:key
+ guile
+ (local-build? #t)
+ (options '(#:env-vars (("LANG" . "C.UTF-8")))))
"Return an object representing the store item NAME, a file or directory
computed by GEXP. When LOCAL-BUILD? is #t (the default), it ensures the
corresponding derivation is built locally. OPTIONS may be used to pass
@@ -1700,6 +1703,9 @@ (define* (compiled-modules modules
(system base target)
(system base compile))
+ ;; Best effort. The locale is not installed in all contexts.
+ (false-if-exception (setlocale LC_ALL "C.UTF-8"))
+
(define modules
(getenv "modules"))
@@ -1990,7 +1996,8 @@ (define* (gexp->script name exp
#:key (guile (default-guile))
(module-path %load-path)
(system (%current-system))
- (target 'current))
+ (target 'current)
+ (locale "C.UTF-8"))
"Return an executable script NAME that runs EXP using GUILE, with EXP's
imported modules in its search path. Look up EXP's modules in MODULE-PATH."
(mlet* %store-monad ((target (if (eq? target 'current)
@@ -2033,7 +2040,8 @@ (define* (gexp->script name exp
;; These derivations are not worth offloading or
;; substituting.
#:local-build? #t
- #:substitutable? #f)))
+ #:substitutable? #f
+ #:env-vars `(("LANG" . ,locale)))))
(define* (gexp->file name exp #:key
(guile (default-guile))
@@ -2041,7 +2049,8 @@ (define* (gexp->file name exp #:key
(module-path %load-path)
(splice? #f)
(system (%current-system))
- (target 'current))
+ (target 'current)
+ (locale "C.UTF-8"))
"Return a derivation that builds a file NAME containing EXP. When SPLICE?
is true, EXP is considered to be a list of expressions that will be spliced in
the resulting file.
@@ -2081,7 +2090,8 @@ (define* (gexp->file name exp #:key
#:local-build? #t
#:substitutable? #f
#:system system
- #:target target)
+ #:target target
+ #:env-vars `(("LANG" . ,locale)))
(gexp->derivation name
(gexp
(call-with-output-file (ungexp output)
@@ -2098,7 +2108,8 @@ (define* (gexp->file name exp #:key
#:local-build? #t
#:substitutable? #f
#:system system
- #:target target))))
+ #:target target
+ #:env-vars `(("LANG" . ,locale))))))
(define* (text-file* name #:rest text)
"Return as a monadic value a derivation that builds a text file containing
@@ -2108,6 +2119,7 @@ (define* (text-file* name #:rest text)
(define builder
(gexp (call-with-output-file (ungexp output "out")
(lambda (port)
+ (set-port-encoding! port "UTF-8")
(display (string-append (ungexp-splicing text)) port)))))
(gexp->derivation name builder
--
2.46.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [bug#73660] [PATCH] gexp: Improve support of Unicode characters.
2024-10-06 15:42 [bug#73660] [PATCH] gexp: Improve support of Unicode characters Tomas Volf
@ 2024-10-23 0:13 ` Tomas Volf
2025-01-10 16:00 ` Janneke Nieuwenhuizen
2025-01-12 15:19 ` Ludovic Courtès
1 sibling, 1 reply; 7+ messages in thread
From: Tomas Volf @ 2024-10-23 0:13 UTC (permalink / raw)
To: 73660
Hello,
any opinion regarding this patch? I think it prevents whole class of
annoying bugs, and some forms already had support for it, this just
extend it to all forms.
Have a nice day,
Tomas
^ permalink raw reply [flat|nested] 7+ messages in thread
* [bug#73660] [PATCH] gexp: Improve support of Unicode characters.
2024-10-23 0:13 ` Tomas Volf
@ 2025-01-10 16:00 ` Janneke Nieuwenhuizen
2025-01-11 0:42 ` Tomas Volf
2025-01-11 17:07 ` Tomas Volf
0 siblings, 2 replies; 7+ messages in thread
From: Janneke Nieuwenhuizen @ 2025-01-10 16:00 UTC (permalink / raw)
To: Tomas Volf; +Cc: 73660
Tomas Volf writes:
Hi,
> any opinion regarding this patch? I think it prevents whole class of
> annoying bugs, and some forms already had support for it, this just
> extend it to all forms.
While I don't feel qualified to LGTM this patch, it makes sense to me.
As discussed on IRC <https://logs.guix.gnu.org/guix/2025-01-05.log#134213>
I added the patch to core-packages-team, but also reverted it to avoid a
world rebuild.
Just now I pushed a newlyrebased core-packages-team with the patch
in action, see <https://ci.guix.gnu.org/jobset/core-packages-team>.
Would you like to also keep an eye out for how that works?
Greetings,
Janneke
--
Janneke Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond https://LilyPond.org
Freelance IT https://www.JoyOfSource.com | Avatar® https://AvatarAcademy.com
^ permalink raw reply [flat|nested] 7+ messages in thread
* [bug#73660] [PATCH] gexp: Improve support of Unicode characters.
2025-01-10 16:00 ` Janneke Nieuwenhuizen
@ 2025-01-11 0:42 ` Tomas Volf
2025-01-11 17:07 ` Tomas Volf
1 sibling, 0 replies; 7+ messages in thread
From: Tomas Volf @ 2025-01-11 0:42 UTC (permalink / raw)
To: Janneke Nieuwenhuizen; +Cc: 73660
[-- Attachment #1: Type: text/plain, Size: 1172 bytes --]
Janneke Nieuwenhuizen <janneke@gnu.org> writes:
> Tomas Volf writes:
>
> Hi,
>
>> any opinion regarding this patch? I think it prevents whole class of
>> annoying bugs, and some forms already had support for it, this just
>> extend it to all forms.
>
> While I don't feel qualified to LGTM this patch, it makes sense to me.
>
> As discussed on IRC <https://logs.guix.gnu.org/guix/2025-01-05.log#134213>
> I added the patch to core-packages-team, but also reverted it to avoid a
> world rebuild.
Re-reading the IRC log I have noticed I forgot to say my thanks, so,
thank you :)
>
> Just now I pushed a newlyrebased core-packages-team with the patch
> in action, see <https://ci.guix.gnu.org/jobset/core-packages-team>.
>
> Would you like to also keep an eye out for how that works?
I can take a look from time to time (seems to still be building). Let
us hope nothing burns down. I *think* it should not really break
anything, but who knows, Guix is complex beast and I am not that smart.
Have a nice weekend,
Tomas
--
There are only two hard things in Computer Science:
cache invalidation, naming things and off-by-one errors.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 853 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* [bug#73660] [PATCH] gexp: Improve support of Unicode characters.
2025-01-10 16:00 ` Janneke Nieuwenhuizen
2025-01-11 0:42 ` Tomas Volf
@ 2025-01-11 17:07 ` Tomas Volf
2025-01-11 18:09 ` Janneke Nieuwenhuizen
1 sibling, 1 reply; 7+ messages in thread
From: Tomas Volf @ 2025-01-11 17:07 UTC (permalink / raw)
To: Janneke Nieuwenhuizen; +Cc: 73660
[-- Attachment #1: Type: text/plain, Size: 2260 bytes --]
Janneke Nieuwenhuizen <janneke@gnu.org> writes:
> Would you like to also keep an eye out for how that works?
It seems the evaluation failed, however I have no idea if that is due to
my changes or not. The first issue I see in the log seems to be:
--8<---------------cut here---------------start------------->8---
building of `/gnu/store/5qizz7ba86rd979xspsw3vi2xpg6gq7b-glibc-headers-mesboot-2.16.0.drv' timed out after 3600 seconds of silence
--8<---------------cut here---------------end--------------->8---
For what it is worth, it fails to me locally as well, but with a
different error:
--8<---------------cut here---------------start------------->8---
build of /gnu/store/n45z6cfa9i3jdh07q1ib6pcbll8j6jn7-libstdc++-boot0-4.9.4.drv failed
View build log at '/var/log/guix/drvs/n4/5z6cfa9i3jdh07q1ib6pcbll8j6jn7-libstdc++-boot0-4.9.4.drv.gz'.
cannot build derivation `/gnu/store/gai3hg9c8qb89qlz8fwrgpscmf74g6c8-gcc-cross-boot0-14.2.0.drv': 1 dependencies couldn't be built
cannot build derivation `/gnu/store/f2di3rzlyqa2xsby7z197wsldvqixq0l-gcc-cross-boot0-wrapped-14.2.0.drv': 1 dependencies couldn't be built
--8<---------------cut here---------------end--------------->8---
Which, looking into the log leads to:
--8<---------------cut here---------------start------------->8---
starting phase `patch-tzdb.cc'
error: in phase 'patch-tzdb.cc': uncaught exception:
system-error "mkstemp!" "~A" ("No such file or directory") (2)
phase `patch-tzdb.cc' failed after 0.0 seconds
--8<---------------cut here---------------end--------------->8---
I am not sure this is caused by my changes. When I revert the commit:
--8<---------------cut here---------------start------------->8---
$ git -C guix-proper log -1
commit 178c8707fc795b7612ed493523a2f4ef5a71966d (HEAD -> xx)
Author: Linux User
Date: Sat Jan 11 16:56:00 2025 +0000
Revert "gexp: Improve support of Unicode characters."
This reverts commit 3532efb0167dae540d9b968b191aa76c4ec79212.
--8<---------------cut here---------------end--------------->8---
It still fails with the same error.
Any ideas?
Tomas
--
There are only two hard things in Computer Science:
cache invalidation, naming things and off-by-one errors.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 853 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* [bug#73660] [PATCH] gexp: Improve support of Unicode characters.
2025-01-11 17:07 ` Tomas Volf
@ 2025-01-11 18:09 ` Janneke Nieuwenhuizen
0 siblings, 0 replies; 7+ messages in thread
From: Janneke Nieuwenhuizen @ 2025-01-11 18:09 UTC (permalink / raw)
To: Tomas Volf; +Cc: 73660
Tomas Volf writes:
Hello Tomas,
> Janneke Nieuwenhuizen <janneke@gnu.org> writes:
>
>> Would you like to also keep an eye out for how that works?
>
> It seems the evaluation failed, however I have no idea if that is due to
> my changes or not. The first issue I see in the log seems to be:
>
> building of
> `/gnu/store/5qizz7ba86rd979xspsw3vi2xpg6gq7b-glibc-headers-mesboot-2.16.0.drv'
> timed out after 3600 seconds of silence
Ah. I wondered why there was a big red cross instead of a lot of nice
green builds...
> For what it is worth, it fails to me locally as well, but with a
> different error:
>
> build of /gnu/store/n45z6cfa9i3jdh07q1ib6pcbll8j6jn7-libstdc++-boot0-4.9.4.drv failed
> View build log at '/var/log/guix/drvs/n4/5z6cfa9i3jdh07q1ib6pcbll8j6jn7-libstdc++-boot0-4.9.4.drv.gz'.
> cannot build derivation `/gnu/store/gai3hg9c8qb89qlz8fwrgpscmf74g6c8-gcc-cross-boot0-14.2.0.drv': 1 dependencies couldn't be built
> cannot build derivation `/gnu/store/f2di3rzlyqa2xsby7z197wsldvqixq0l-gcc-cross-boot0-wrapped-14.2.0.drv': 1 dependencies couldn't be built
>
>
> Which, looking into the log leads to:
>
> starting phase `patch-tzdb.cc'
> error: in phase 'patch-tzdb.cc': uncaught exception:
> system-error "mkstemp!" "~A" ("No such file or directory") (2)
> phase `patch-tzdb.cc' failed after 0.0 seconds
Weird! Oh wait, I removed guards around that stage.
core-packages-team-old has
--8<---------------cut here---------------start------------->8---
#$@(if (target-hurd64?)
#~((add-after 'unpack 'patch-hurd64
(lambda _
(substitute* "libstdc++-v3/src/c++20/tzdb.cc"
(("#if ! defined _GLIBCXX_ZONEINFO_DIR")
"#if __GNU__ || ! defined _GLIBCXX_ZONEINFO_DIR")))))
'())
#$@(if (and (target-x86-64?) (target-linux?)
(version>=? (package-version gcc) "14"))
#~((add-after 'unpack 'patch-x86_64-linux
(lambda _
(substitute* "libstdc++-v3/src/c++20/tzdb.cc"
(("#if ! defined _GLIBCXX_ZONEINFO_DIR")
"#if __x86_64__ || ! defined _GLIBCXX_ZONEINFO_DIR")))))
'())
#$@(if (and (target-x86-32?) (target-linux?)
(version>=? (package-version gcc) "14"))
#~((add-after 'unpack 'patch-x86_64-linux
(lambda _
(substitute* "libstdc++-v3/src/c++20/tzdb.cc"
(("#if ! defined _GLIBCXX_ZONEINFO_DIR")
"#if __i386__ || __x86_64__ || ! defined _GLIBCXX_ZONEINFO_DIR")))))
'())
#$@(if (and (target-linux?)
(not (target-x86-64?))
(not (target-x86-32?))
(version>=? (package-version gcc) "14"))
#~((add-after 'unpack 'patch-tzdb.cc
(lambda _
(substitute* "libstdc++-v3/src/c++20/tzdb.cc"
(("#if ! defined _GLIBCXX_ZONEINFO_DIR")
"#if 1 // ! defined _GLIBCXX_ZONEINFO_DIR")))))
'()))
--8<---------------cut here---------------end--------------->8---
and the new core-packages-team has
--8<---------------cut here---------------start------------->8---
(add-after 'unpack 'patch-tzdb.cc
(lambda _
(substitute* "libstdc++-v3/src/c++20/tzdb.cc"
(("#if ! defined _GLIBCXX_ZONEINFO_DIR")
"#if 1 // ! defined _GLIBCXX_ZONEINFO_DIR")))))
--8<---------------cut here---------------end--------------->8---
ow, there it already is. Silly me, we need the gcc-14 guard. I was so
happy all systems seemed to need the same code that I also removed the
check for gcc-14.
> I am not sure this is caused by my changes. When I revert the commit:
Certainly not! But thanks for trying!
[..]
> Any ideas?
Meanwhile, because it seemed the build farm stopped working for me, I
started to build myself again and currently have
--8<---------------cut here---------------start------------->8---
successfully built /gnu/store/5qizz7ba86rd979xspsw3vi2xpg6gq7b-glibc-headers-mesboot-2.16.0.drv
successfully built /gnu/store/91212rdl4cn4rr8aqfrbilxagmx9fwj3-glibc-mesboot-2.16.0.drv
successfully built /gnu/store/5a0bd35brzf1sgnw10slaxipmxa3cafn-gcc-mesboot1-wrapper-4.6.4.drv
--8<---------------cut here---------------end--------------->8---
so I didn't see this problem yet. I've pushed a squash! commit that
should fix this. Thanks!
Greetings,
Janneke
--
Janneke Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond https://LilyPond.org
Freelance IT https://www.JoyOfSource.com | Avatar® https://AvatarAcademy.com
^ permalink raw reply [flat|nested] 7+ messages in thread
* [bug#73660] [PATCH] gexp: Improve support of Unicode characters.
2024-10-06 15:42 [bug#73660] [PATCH] gexp: Improve support of Unicode characters Tomas Volf
2024-10-23 0:13 ` Tomas Volf
@ 2025-01-12 15:19 ` Ludovic Courtès
1 sibling, 0 replies; 7+ messages in thread
From: Ludovic Courtès @ 2025-01-12 15:19 UTC (permalink / raw)
To: Tomas Volf
Cc: Josselin Poiret, Maxim Cournoyer, Simon Tournier,
Mathieu Othacehe, Tobias Geerinckx-Rice, Florian Pelz, 73660,
Christopher Baines
Hello,
Tomas Volf <~@wolfsden.cz> skribis:
> * guix/gexp.scm (computed-file): Set LANG to C.UTF-8 by default.
> (compiled-modules): Try to `setlocale'.
> (gexp->script), (gexp->file): New `locale' argument defaulting to C.UTF-8.
> (text-file*): Set output port encoding to UTF-8.
> * doc/guix.texi (G-Expressions)[computed-file]: Document the changes. Use
> @var. Document #:guile.
> [gexp->script]: Document #:locale. Fix default value for #:target.
> [gexp->file]: Document #:locale, #:system and #:target.
>
> Change-Id: Ib323b51af88a588b780ff48ddd04db8be7c729fb
[...]
> (define* (computed-file name gexp
> - #:key guile (local-build? #t) (options '()))
> + #:key
> + guile
> + (local-build? #t)
> + (options '(#:env-vars (("LANG" . "C.UTF-8")))))
I’d suggest LC_CTYPE (or LC_ALL?) rather than LANG.
Also, what about making it the default for the #:env-vars of
‘gexp->derivation’? That way it wouldn’t need to be repeated in several
places.
> @@ -1700,6 +1703,9 @@ (define* (compiled-modules modules
> (system base target)
> (system base compile))
>
> + ;; Best effort. The locale is not installed in all contexts.
> + (false-if-exception (setlocale LC_ALL "C.UTF-8"))
Sounds good. I would make it a separate patch.
s/in all contexts/when cross-compiling/
> @@ -1990,7 +1996,8 @@ (define* (gexp->script name exp
> #:key (guile (default-guile))
> (module-path %load-path)
> (system (%current-system))
> - (target 'current))
> + (target 'current)
> + (locale "C.UTF-8"))
I would remove this argument and instead add an explicit, hard-coded:
(set-port-encoding! port "UTF-8")
in the body of ‘call-with-output-file’ here, just like you did below.
> (define* (text-file* name #:rest text)
> "Return as a monadic value a derivation that builds a text file containing
> @@ -2108,6 +2119,7 @@ (define* (text-file* name #:rest text)
> (define builder
> (gexp (call-with-output-file (ungexp output "out")
> (lambda (port)
> + (set-port-encoding! port "UTF-8")
> (display (string-append (ungexp-splicing text)) port)))))
LGTM. This can be moved to a separate file.
How does that sound?
Apologies for not replying earlier!
Ludo’.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-01-12 15:20 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-06 15:42 [bug#73660] [PATCH] gexp: Improve support of Unicode characters Tomas Volf
2024-10-23 0:13 ` Tomas Volf
2025-01-10 16:00 ` Janneke Nieuwenhuizen
2025-01-11 0:42 ` Tomas Volf
2025-01-11 17:07 ` Tomas Volf
2025-01-11 18:09 ` Janneke Nieuwenhuizen
2025-01-12 15:19 ` Ludovic Courtès
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).