Debian 13 installe ERPLibre de bout en bout ; Debian 12 s'arrete sur pyproj : ERROR: Minimum supported PROJ version is 9.4.0, installed version is 9.1.1 bookworm livre 9.1.1, trixie 9.6 — d'ou l'ecart entre les deux. La portee est etroite : sur amd64 et arm64, pyproj pose une roue manylinux qui EMBARQUE sa propre PROJ, et la version du systeme n'entre pas en jeu. s390x n'a pas de roue et compile contre celle du systeme. lib_proj.sh est le calque de lib_qpdf.sh, meme motif et memes garde-fous : seuil, comparaison qui complete les composantes manquantes — « sort -V » classe 9.4 avant 9.4.0 — installation dans /usr/local, declaration a ld.so, et jamais de code non nul pour ne pas masquer ce que pyproj dira lui-meme. L'appel reste sous la garde s390x, verifie. --- EN --- Debian 13 installs ERPLibre end to end; Debian 12 stops on pyproj: ERROR: Minimum supported PROJ version is 9.4.0, installed version is 9.1.1 bookworm ships 9.1.1, trixie 9.6 — hence the gap between the two. The scope is narrow: on amd64 and arm64 pyproj lays down a manylinux wheel that BUNDLES its own PROJ, and the system version never comes into play. s390x has no wheel and builds against the system one. lib_proj.sh mirrors lib_qpdf.sh, same pattern and same guards: a threshold, a comparison that pads missing components — "sort -V" ranks 9.4 before 9.4.0 — installation into /usr/local, an ld.so declaration, and never a non-zero exit so as not to mask what pyproj itself will say. The call stays under the s390x guard, verified. Assisted-by: Claude Opus 5 (cherry picked from commit f779702b61ff6405bdd7efabaa1f5bac09e1166b)
89 lines
3.9 KiB
Bash
89 lines
3.9 KiB
Bash
#!/usr/bin/env bash
|
|
# © 2021-2026 TechnoLibre (http://www.technolibre.ca)
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
#
|
|
# PROJ assez récent pour pyproj, compilé depuis les sources quand la
|
|
# distribution est en retard. Calque de lib_qpdf.sh, pour la même raison et
|
|
# avec les mêmes garde-fous.
|
|
#
|
|
# QUI est concerné, et qui ne l'est pas : sur amd64 et arm64, pyproj publie
|
|
# des roues manylinux qui EMBARQUENT leur propre PROJ — rien n'est compilé et
|
|
# la version du système n'a aucune importance. s390x n'a pas de roue : pyproj
|
|
# se construit contre la PROJ du système, et refuse net si elle est trop
|
|
# vieille.
|
|
#
|
|
# ERROR: Minimum supported PROJ version is 9.4.0, installed version is 9.1.1
|
|
#
|
|
# Mesuré sur Debian 12 (bookworm) s390x. Debian 13 livre 9.6 et passe sans
|
|
# rien faire ; ce fichier ne s'y déclenche donc pas.
|
|
|
|
# Seuil réclamé par pyproj 3.7.x. Le monter suppose de vérifier ce qu'exige la
|
|
# version de pyproj réellement verrouillée dans poetry.lock.
|
|
EL_PROJ_MIN=9.4.0
|
|
# Version bâtie quand le seuil n'est pas atteint. 9.6.x est la branche stable
|
|
# la plus récente à ce jour et couvre largement le seuil.
|
|
EL_PROJ_VER=9.6.2
|
|
|
|
# Vrai si la version passée en argument atteint le seuil. Même précaution que
|
|
# pour qpdf : « sort -V » classe « 9.4 » AVANT « 9.4.0 », donc une version
|
|
# numérotée sur deux composantes déclencherait une compilation inutile — et
|
|
# celle de PROJ se compte en dizaines de minutes sous émulation.
|
|
el_proj_ge_min() {
|
|
local v="$1" dots
|
|
[ -n "${v}" ] || return 1
|
|
dots="${v//[^.]/}"
|
|
while [ "${#dots}" -lt 2 ]; do
|
|
v="${v}.0"
|
|
dots="${dots}."
|
|
done
|
|
[ "$(printf '%s\n%s\n' "${EL_PROJ_MIN}" "${v}" | sort -V | head -1)" = "${EL_PROJ_MIN}" ]
|
|
}
|
|
|
|
# Version actuellement visible, ou « 0 ». /usr/local n'est pas dans le chemin
|
|
# par défaut de pkg-config partout : sans ces entrées, une PROJ déjà compilée
|
|
# passerait inaperçue et serait rebâtie à chaque passage.
|
|
el_proj_version() {
|
|
PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:${PKG_CONFIG_PATH}" \
|
|
pkg-config --modversion proj 2> /dev/null || echo 0
|
|
}
|
|
|
|
# Compile et installe PROJ dans /usr/local si, et seulement si, ce qui est
|
|
# présent ne suffit pas. Ne rend jamais un code non nul : l'échec est signalé
|
|
# et l'installation continue, pyproj dira lui-même ce qui manque.
|
|
el_proj_ensure() {
|
|
local have build dir
|
|
have="$(el_proj_version)"
|
|
if el_proj_ge_min "${have}"; then
|
|
echo "PROJ ${have} >= ${EL_PROJ_MIN} : rien a compiler pour pyproj."
|
|
return 0
|
|
fi
|
|
|
|
echo "PROJ ${have} < ${EL_PROJ_MIN} requis par pyproj : compilation de PROJ ${EL_PROJ_VER} (long en emulation)."
|
|
build="$(mktemp -d)"
|
|
# TESTING=OFF et les outils en moins : seule la bibliothèque intéresse
|
|
# pyproj, et la suite de tests de PROJ double le temps de compilation.
|
|
if curl -fsSL --max-time 900 -o "${build}/proj.tar.gz" \
|
|
"https://download.osgeo.org/proj/proj-${EL_PROJ_VER}.tar.gz" \
|
|
&& tar -xzf "${build}/proj.tar.gz" -C "${build}" \
|
|
&& cmake -S "${build}/proj-${EL_PROJ_VER}" -B "${build}/build" \
|
|
-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local \
|
|
-DBUILD_TESTING=OFF -DBUILD_APPS=ON -DBUILD_SHARED_LIBS=ON \
|
|
&& cmake --build "${build}/build" -j"$(nproc)" \
|
|
&& sudo cmake --install "${build}/build"; then
|
|
# CMake choisit « lib » ou « lib64 » selon la famille, et /usr/local/lib64
|
|
# n'est pas dans le chemin de ld.so partout : sans cette déclaration,
|
|
# pyproj se construirait pour échouer au CHARGEMENT, plus loin de la cause.
|
|
for dir in /usr/local/lib64 /usr/local/lib; do
|
|
if [ -e "${dir}/libproj.so" ]; then
|
|
echo "${dir}" | sudo tee /etc/ld.so.conf.d/proj-local.conf > /dev/null
|
|
break
|
|
fi
|
|
done
|
|
sudo ldconfig
|
|
echo "PROJ $(el_proj_version) installe dans /usr/local."
|
|
else
|
|
echo "Attention : compilation de PROJ echouee, pyproj ne pourra pas se construire."
|
|
fi
|
|
rm -rf "${build}"
|
|
return 0
|
|
}
|