Skip to content

Latest commit

 

History

History
113 lines (101 loc) · 4.8 KB

i18n.md

File metadata and controls

113 lines (101 loc) · 4.8 KB

Implementación de locale y xlocale sobre libc de OpenBSD

Objetivos:

  • Modificar la librería del OpenBSD estable más reciente o de current
  • Cumplir la implementación más reciente de POSIX lo mejor posible http://pubs.opengroup.org/onlinepubs/9699919799/
  • Como fuente prioritaria en localización de cada país utilizar versión reciente de CLDR http://cldr.unicode.org/index/downloads
  • En los locales dar prioridad a español y los paises donde se habla.
  • Soportar sólo las codificaciones US-ASCII y UTF-8 (únicas soportadas por OpenBSD).
  • 3 mecanismos para ubicar un locale (digamos LC_TIME de es_CO.UTF-8):
    • que sea un archivo regular en el formato correcto en /usr/share/locale/es_CO.UTF-8/LC_TIME
    • que la ubicación anterior sea un enlace a otro correcto
    • Emplear una heurística para sustituir:
      1. Intentar con /usr/share/locale/es.UTF-8/LC_TIME
      2. Si el anterior falla intentar con /usr/share/locale/UTF-8/LC_TIME
  • El locale C o POSIX se soporta en fuentes de libc con codificación ASCII, se soporta con codificación UTF-8 en /usr/share/locale/UTF-8/ para operar por omisión cuando no se encuentra uno mejor con codificación UTF-8.
  • Documentar cada función y programa en páginas man
  • Pruebas de regresión para la funcionalidad añadida

Estado actual:

  • Versión de OpenBSD: actualizando
  • POSIX: Se cumple hasta 2008 con extensiones de FreeBSD
  • CLDR: Sólo se usa una versión de 2015 para LC_TIME, para las otras categorias (y el país faltante en CLDR: Cuba) se importaron, mezclaron y mejoraron locales de FreeBSD y NetBSD de 2015.
  • Prioridad español: completa
  • Codificaciones US-ASCII y UTF-8. Bien en todas las categorias excepto UTF-8 en LC_COLLATE pues sólo se soportan primeros 254 puntos de Unicode (los equivalentes a ISO8859-1 que es suficiente para lenguas basadas en alfabateo latino como español, italiano, frances y alemán, ver http://www.utf8-chartable.de/).
  • Mecanismos para ubicar locale: implementado para todas las categorias, puede mejorarse (ver prueba de regresión check_monetary función test_switch parte comentada de locale algo_loco.UTF-8).
  • POSIX en /usr/share/locale/UTF-8/: implementado
  • Páginas man: realizado falta manual para utilidades localedef y colldef
  • Pruebas de regresión: completas para libc

Estrategia para actualizar:

  • Se parchan fuentes de OpenBSD en un orden lógico-histórico:
    • locale global:
      • LC_CTYPE solo reorganizar
      • LC_TIME emplea formato tipo texto
      • LC_COLLATE emplea formato binario
      • LC_MONETARY emplea formato tipo texto (reusando detalles de LC_TIME)
      • LC_NUMERIC emplea formato tipo texto.
      • perl: requerido tras soportar LC_NUMERIC
    • xlocale
      • ctype 1: conversión single byte, multi-byte y wide character.
      • ctype 2: tradución de minúscula a mayúscula y funciones para verificar tipo de caracteres.
      • cotejación
      • localeconv_l
      • númerico y monetario
      • tiempo
      • extensiones de Darwin

Ayudas para actualizar

  • Primero actualizar libc
  • Verificar que pasan pruebas de regresión nuevas de regress/lib/libc/locale
  • Después de pasar por locale de LC_NUMERIC es necesario recompilar perl:
  cd /usr/src/gnu/usr.bin/perl
  doas make -f Makefile.bsd-wrapper
  doas make -f Makefile.bsd-wrapper install

si no se hace, hasta lo más simple con perl fallará, por ejemplo:

$ pkg_info
Invalid version format (non-numeric data) at /usr/libdata/perl5/Carp.pm line 3
BEGIN failed--compilation aborted at /usr/libdata/perl5/Carp.pm line 3.
Compilation failed in require at /usr/libdata/perl5/OpenBSD/State.pm line 86.
BEGIN failed--compilation aborted at /usr/libdata/perl5/OpenBSD/State.pm line 86.
Compilation failed in require at /usr/libdata/perl5/OpenBSD/PkgInfo.pm line 22.
BEGIN failed--compilation aborted at /usr/libdata/perl5/OpenBSD/PkgInfo.pm line 22.
Compilation failed in require at (eval 1) line 2.
  • Los paquetes de perl deben recompilarse. Si al recompilar aparece un error como:

    XS.c: loadable library and perl binaries are mismatched (got handshake key 0xec00000, needed 0xf080000)
    

    Buscar:

    find /usr/local/libdata/perl5 -name XS.so | xargs ls -l
    

    y los que tengan fecha antigua recompilarlos, por ejemplo si aparece:

    -r-xr-xr-x  1 root  bin   95152 Mar 15 04:51 /usr/local/libdata/perl5/site_perl/amd64-openbsd/auto/Cpanel/JSON/XS/XS.so
    

    Desinstalar el paquete p5-Cpanel-JSON-XS y los que de el dependan, recompilar ese, instalarlo y volver a compilar el paquete que presentó el error.

  • Para depurar libc con gdb:

    • En lib/libc/Makefile añadir -g -O0 a CFLAGS, eliminar código objeto y volver a compilar