La transición a GCC5 llega a Debian Testing

Tras casi dos meses cocinándose en unstable la temida transición a GCC5 y la nueva libstdc++6 ha llegado a Debian Testing (Stretch):

we are ready to migrate the bulk of the GCC-5 transition and related sub-transitions to testing tonight. Apologise for the short notice.

We expect this to be mostly a smooth ride, but there are some caveats:

  • We will have to remove some packages from testing temporarily

  • A total of 36 (amd64) / 31 (i386) binary packages will become uninstallable in testing.

La actualización me ha resultado poco problemática, gracias a que he seguido unas cuantas buenas prácticas:

  • Los paquetes que han quedado temporalmente obsoletos en testing lo son por buenos motivos (dependencias que no se van a poder cumplir tras la transición) y por lo tanto lo mejor es desinstalarlos hasta que vuelvan a reintroducirse en el archivo (ya con dependencias actualizadas). Dejarlos instalados sólo va a llevar a conflictos irresolubles por el package resolver.

  • Evitar utilizar sources que no sean las oficiales de Debian (los mantenedores que hacen la transición no los tienen en cuenta).

  • Otra cosa que se le atraganta al package resolver son los paquetes que pierden su indicador de "instalado automáticamente", ya que el resolver en modo upgrade (safe-upgrade) no toca los paquetes que el usuario ha instalado manualmente. Estos paquetes, que por dependencias deberían haberse borrado no lo hacen, y eso provoca que upgrade simplemente los retenga. Los usuarios pueden intentar forzar la situación con un dist-upgrade (full-upgrade), y es entonces cuando el resolver se ve obligado a preguntar al usuario sobre qué paquetes eliminar y cuáles mantener. Lo mejor para evitarlo es mantener los paquetes con sus indicadores correctos de "instalado automáticamente".

Este problema se ve acentuado porque los mantenedores han decidido que, en vez de actualizar directamente el paquete, existan 2 versiones de ciertos paquetes (fundamentalmente de bibliotecas escritas en C++): la antigua y la nueva, que es la versión compilada con GCC5 y contra la nueva libstdc++6. El paquete con la versión antigua conserva el nombre mientras que el de la nueva se le añade al nombre un sufijo "v5". De esta forma, la transición de ciertos paquetes puede hacerse independiente de la de otros, y se evita tener que hacer la transición de todo a la vez.

El problema de este enfoque es que ciertos bugs en aptitude/libapt-pkg que hacen que se pierda el indicador de "instalado automáticamente" se disparan cuando se hace este tipo de transiciones de cambios de nombres1. En mi caso, tras hacer el aptitude upgrade 20 bibliotecas y otros 7 paquetes perdieron el indicador. Tuve que hacer un markauto de todos ellos para poder seguir.

Una cosa que hice es seguir el principio divide et impera. Sabiendo que el paquete más problemático probablemente iba a ser libstdc++6, lo primero que hice fue asegurarme que se actualizaba con un aptitude install libstdc++6. Después, volví a revisar si más paquetes habían perdido el indicador "Auto" y a volvérselo a poner. Y finalmente, un nuevo aptitude upgrade me hizo la actualización de la mayoría de los paquetes que faltaban. Unos detalles más, y actualmente sólo tengo retenidos 10 paquetes por dependencias no resolubles, que espero que en los próximos días se solucionen.

Seguiré informando.

:wq


  1. Este bug espero desarrollarlo más ampliamente en un próximo artículo. 

blogroll

social