Skip to content

Point N : package_source reconfigure, cpack_stale_configure avec ccache, Ninja hors du PATH - #94

Merged
Jordan08 merged 11 commits into
configure-cleanfrom
todo-n-cpack-stale-configure
Oct 6, 2026
Merged

Jordan08 merged 11 commits into
configure-cleanfrom
todo-n-cpack-stale-configure

Conversation

@Jordan08

@Jordan08 Jordan08 commented Oct 6, 2026 •

Copy link
Copy Markdown
Owner

Point N de TODO.md : les suites du test cpack_stale_configure et de package_source après un changement de VERSION.txt (anciens 44 et 63).

44. Le test cpack_stale_configure avec un lanceur dans CC et un Ninja hors du PATH

Problème. Le test configure des copies de l'arbre avec les compilateurs du build parent, passés par -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}. Avec CC="ccache gcc", CMake range ccache dans CMAKE_C_COMPILER et gcc dans CMAKE_C_COMPILER_ARG1 : la copie était configurée avec ccache seul comme compilateur, et le test échouait (« The C compiler … ccache is not able to compile a simple test program »). Avec -G Ninja -DCMAKE_MAKE_PROGRAM=<ninja hors du PATH>, la copie ne trouvait pas Ninja (« CMake was unable to find a build program corresponding to "Ninja" »).

Correction (décidée le 3 octobre : passer les compilateurs par cmake -E env). tests/CMakeLists.txt passe au script chaque compilateur suivi de ses arguments (CMAKE_<LANG>_COMPILER et CMAKE_<LANG>_COMPILER_ARG1, qui vaut gcc depuis CC et gcc depuis une liste -DCMAKE_C_COMPILER=ccache;gcc), et le programme du générateur (CMAKE_MAKE_PROGRAM). Le script configure chaque copie par cmake -E env "CC=…" "CXX=…" cmake … -DCMAKE_MAKE_PROGRAM=… : la copie relit CC et CXX comme le parent les a lus.

Sans sh ou sans liens symboliques, le script s'arrêtait sur FATAL_ERROR. Il dit maintenant « cpack_stale_configure: skipped, … » et rend la main, et SKIP_REGULAR_EXPRESSION en fait un test ignoré (CTest 3.16 et après ; avec CMake 3.14 et 3.15, il passe avec ce message). sh absent se voit au statut d'execute_process (« no such file or directory », un sh tué restant un échec) ; les liens, à une sonde unique avant la copie, pour qu'un vrai échec de lien dans la boucle reste une erreur.

44. package_source après un changement de VERSION.txt

Problème. L'archive prend son nom et sa version dans CPackSourceConfig.cmake, écrit par CMake à la configuration. Ninja reconfigure avant package_source (CMAKE_CONFIGURE_DEPENDS), mais avec les générateurs Makefile la cible lance CPack tout de suite (elle ne dépend pas de cmake_check_build_system, contrairement à package, qui passe par preinstall puis all). Reproduit avec les sources de configure-clean : après echo 5.0.1 > VERSION.txt, cmake --build build --target package_source donne gaol-5.0.0.tar.gz, qui contient gaol-5.0.0/VERSION.txt à 5.0.1, sans l'avertissement sur configure.

Correction (décidée : faire dépendre package_source d'une reconfiguration). Une cible intégrée comme package_source ne prend pas de dépendance, mais CPack inclut à chaque archive le fichier de CPACK_PROJECT_CONFIG_FILE. Le nouveau cmake/gaol_package_source.cmake y lit VERSION.txt avec gaol_read_version() ; s'il ne donne plus la version de la configuration (CPACK_GAOL_VERSION, et non CPACK_PACKAGE_VERSION, que cpack -R remplace), il relance cmake -S <sources> -B <build> (ce qui affiche l'avertissement sur configure), puis relit le CPackSourceConfig.cmake réécrit. CPack lit ce fichier sans aucune politique : il prend celles de CMakeLists.txt (cmake_policy(VERSION 3.14...3.25) entre PUSH et POP), sans quoi CMake 3 avertit de CMP0007 au list() de gaol_read_version(). Seulement pour l'archive des sources (CPACK_INSTALLED_DIRECTORIES défini) : package reconfigure déjà. Un VERSION.txt refusé fait échouer la reconfiguration, et CPack s'arrête sans archive (« CPack Error: Cannot initialize the generator TGZ », après le message de CMake sur VERSION.txt).

Le TODO disait qu'une vérification au moment de l'archive « demanderait CMake 3.19 » (CPACK_PRE_BUILD_SCRIPTS) : CPACK_PROJECT_CONFIG_FILE existe bien avant 3.14, et la correction marche avec CMake 3.14.4 (vérifié).

Test. cpack_stale_configure le vérifie : la copie configurée pour la version de configure, son VERSION.txt passé à la suivante, CPack lancé comme package_source le lance (cpack --config CPackSourceConfig.cmake dans le build, quel que soit le générateur) doit afficher l'avertissement et faire gaol-<nouvelle>.tar.gz, qui contient gaol-<nouvelle>/VERSION.txt, et pas gaol-<ancienne>.tar.gz, sans avertissement de CMake dans les fichiers cmake/gaol_*.cmake que lit CPack. L'archive de la copie est faite de ses liens avec CMake 3.28 et après (37 entrées, 174 Ko), des fichiers des répertoires qu'ils désignent avec CMake 3.14 et 3.16 (1703 entrées, 5,6 Mo) ; le test prend de 2 à 5 s ici (3,5 s avant).

63. Les textes du test

  • Le commentaire « The script removes what it made in this directory, and nothing else » (tests/cpack_stale_configure.cmake) dit maintenant que le script retire tout le répertoire, au début, et à la fin quand le test passe ou est ignoré (un échec le laisse pour qu'on le regarde), d'où la vérification de son nom. Le retrait des liens un par un est dans une macro remove_work_dir(). Le répertoire de build contient maintenant le _CPack_Packages de CPack, fait de liens vers l'arbre : file(REMOVE_RECURSE) ne les suit pas (vérifié avec CMake 3.14.4 et 4.4.3 : les sources gardent leurs 1739 entrées, et leurs fichiers sont identiques à ceux de git après tous les essais).
  • doc/tests.md dit pourquoi seul le build CMake a ce test : CPack fait l'archive, et les jobs autotools de la CI comparent déjà configure --version à VERSION.txt.

Hors du point N, ajouté à la demande du mainteneur : CPACK_SOURCE_IGNORE_FILES relu sans ses barres obliques inverses

Problème (déjà sur configure-clean, relevé par la relecture). CPack écrit les variables CPACK_* dans CPackConfig.cmake et CPackSourceConfig.cmake, puis les relit. Sans CPACK_VERBATIM_VARIABLES, il les écrit telles quelles : set(CPACK_IGNORE_FILES "/\.git/;…;\.o$;\.lo$;…"). CMake 3 y voit une séquence d'échappement invalide, et avertit (CMP0010) deux fois par archive des sources et une fois par paquet, en gardant la barre. CMake 4.4 n'avertit pas, mais lit \. comme . : les motifs relus sont /.git/, .o$, .lo$…, où le point vaut n'importe quel caractère. Aucun fichier de l'arbre actuel n'en était écarté (les listes de l'archive sont identiques, 1724 entrées, avec CMake 3.14, 3.16 et 4.4), mais avec CMake 4.4, examples/halo et doc/zz.go, ajoutés pour l'essai, manquaient dans l'archive.

Correction. set(CPACK_VERBATIM_VARIABLES ON) dans le bloc CPack de CMakeLists.txt : CPack échappe les valeurs qu'il écrit. Toutes les variables CPACK_* relues de CPackConfig.cmake et de CPackSourceConfig.cmake sont identiques avant et après avec CMake 3.14 et 3.16 (où la barre était gardée) ; avec CMake 4.4, seules CPACK_IGNORE_FILES et CPACK_SOURCE_IGNORE_FILES changent, et retrouvent leurs barres. Le .deb refait avec CMake 4.4 a le même control et les mêmes fichiers.

Test. L'étape CPack de cpack_stale_configure échoue maintenant sur tout avertissement de développeur (et plus seulement sur ceux de cmake/gaol_*.cmake), et la copie contient un fichier keep.halo, qu'aucun motif n'écarte mais que .lo$ écarterait : l'archive doit le contenir. Sans CPACK_VERBATIM_VARIABLES, le test échoue avec CMake 3.14.4 et 3.16.3 (avertissement) et avec 4.4.3 (« holds no gaol-5.0.1/keep.halo ») ; avec, il passe.

Pour doc/differences.md et ChangeLog (pull request de synthèse)

À ajouter à la puce de #33 (« CMake warns of a configure generated for another version », todo-notes/synthese.md) :

  • doc/differences.md : « After a change of VERSION.txt, package_source configures the build directory again before it makes the archive, whatever the generator (cmake/gaol_package_source.cmake): with the Makefile generators, the archive was named after the old version and held the new VERSION.txt. »
  • ChangeLog : « * CMakeLists.txt, cmake/gaol_package_source.cmake: package_source configures the build directory again when VERSION.txt holds another version than it was configured for, with the Makefile generators too. tests/cpack_stale_configure.cmake, tests/CMakeLists.txt: the compilers passed with their arguments (CC="ccache gcc") and the program of the generator (a Ninja outside PATH); skipped without sh or symbolic links; checks package_source after a change of VERSION.txt. .github/workflows/linux.yml: a job runs it with ccache in CC and Ninja outside PATH. CMakeLists.txt: CPACK_VERBATIM_VARIABLES, so that CPack reads CPACK_SOURCE_IGNORE_FILES with its backslashes. »
  • doc/differences.md, à la même puce : « CPack reads the regular expressions of CPACK_SOURCE_IGNORE_FILES with their backslashes (CPACK_VERBATIM_VARIABLES): CMake 3 warned of them, and CMake 4 read \. as ., which matches any character, so that a file such as examples/halo would have been left out of the archive. »

Relecture

Un relecteur indépendant (sous-agent sans le contexte du travail) a relu la branche à 501c734 et refait les essais avec CMake 3.14.4, 3.16.3, 3.28.4 et 4.4.3. Il a trouvé, corrigé dans les quatre derniers commits :

  • bloquant : avec CMake 3.14 à 3.31, chaque package_source affichait un avertissement de développeur CMP0007 venu de gaol_read_version(), CPack lisant cmake/gaol_package_source.cmake sans politique ; corrigé par cmake_policy(PUSH), cmake_policy(VERSION 3.14...3.25), cmake_policy(POP). Le test échoue maintenant sur un tel avertissement : sans la correction, il échoue avec CMake 3.14.4 et 3.16.3, et passe avec (CMake 4.4 n'avertit pas) ; le job CMake 3.14.7 de la CI le garde ;
  • cpack -R <version> donnait un faux message et une reconfiguration : comparaison avec CPACK_GAOL_VERSION ;
  • le job ajouté pouvait passer sans rien tester : il retire aussi ninja-build et samu du PATH (les noms que cherche CMake), et échoue si le test est « Skipped » (CTest rend alors 0) ;
  • un statut non numérique d'execute_process couvrait aussi un sh tué par un signal : le test ne se dit ignoré que pour « no such file » ;
  • deux commentaires du retrait du répertoire, et la phrase de doc/tests.md sur l'archive, qui ne valait qu'à partir de CMake 3.28.

Il a vérifié : les dents de chaque partie (avec les sources de configure-clean, le test échoue avec ccache dans CC, avec Ninja hors du PATH, et package_source donne gaol-5.0.0.tar.gz ; sans la ligne include(${CPACK_SOURCE_OUTPUT_CONFIG_FILE}), le test échoue aussi), les deux générateurs, CMake 3.14 à 4.4, la forme liste -DCMAKE_C_COMPILER="ccache;gcc", le build dans les sources ou hors d'elles, qu'un VERSION.txt refusé arrête CPack sans archive, que package n'est pas touché, que file(REMOVE_RECURSE) ne suit pas les liens (empreintes md5 des 1452 fichiers de la copie des sources inchangées), le manuel, check_branch.

Vérifié en local

  • Chaque défaut reproduit avec les sources de configure-clean, puis corrigé, ctest -R cpack_stale_configure (CMake 4.4.3, GCC 9.4) :
    • CC="<faux ccache> gcc" CXX="<faux ccache> g++" (un script exec "$@", ccache n'étant pas installé ici) : échouait, passe ;
    • -G Ninja -DCMAKE_MAKE_PROGRAM=<copie de ninja> avec un PATH sans Ninja : échouait, passe ;
    • PATH sans sh : FATAL_ERROR, maintenant « Skipped » ;
    • symlink() refusé par une bibliothèque LD_PRELOAD (pas de sudo pour monter un système de fichiers sans liens) : FATAL_ERROR, maintenant « Skipped » ;
    • package_source avec « Unix Makefiles » : gaol-5.0.0.tar.gz avant, gaol-5.0.1.tar.gz avec l'avertissement après ; Ninja inchangé (gaol-5.0.1.tar.gz).
  • Les dents de la nouvelle vérification : sans la ligne set(CPACK_PROJECT_CONFIG_FILE …) de CMakeLists.txt, cpack_stale_configure échoue (« CPack did not configure again, warn and make gaol-5.0.1.tar.gz ») ; avec, il passe.
  • CMake 3.14.4 (le minimum, installé par pip dans le scratchpad) : package_source reconfigure et fait gaol-5.0.1.tar.gz ; cpack_stale_configure passe, avec et sans le faux ccache ; sans sh, il passe avec son message (pas de SKIP_REGULAR_EXPRESSION avant 3.16).
  • Le job ajouté à linux.yml, simulé ici : configuration avec le faux ccache et Ninja hors du PATH, ctest -R cpack_stale_configure --no-tests=error passe.
  • Après les corrections de la relecture, sur l'arbre final : CMake 4.4.3 par défaut, avec le faux ccache et Ninja hors du PATH (les étapes du job ajouté), sans liens symboliques (« Skipped »), sans sh (« Skipped ») ; CMake 3.14.4 et 3.16.3 : le test passe, et échoue sans les politiques ; cpack -R 9.9.9 ne reconfigure plus.
  • Matrice CMake, tests et exemples, ctest -j4 : GCC 9.4 SSE2 avec -Wall -Wextra -Werror, 57 tests à 100 % ; GCC 9.4 FPU (-DGAOL_SIMD=OFF), 100 % ; Clang 18 avec -Wall -Wextra -Werror, 100 % (intervalf et interval2f ignorés par construction) ; aucun avertissement. cpack_stale_configure et numbers aussi sous LC_ALL=fr_FR.UTF-8. cmake --build <build> --target package fait toujours gaol-5.0.0-Linux.tar.gz et libgaol-dev_5.0.0_amd64.deb.
  • Manuel : pdflatex deux fois, zéro erreur, 129 pages, le même unique « Overfull » que configure-clean (celui des l. 511-515, noté au point Y).
  • CPACK_VERBATIM_VARIABLES : variables relues, listes de l'archive, avertissements et dents du test comme décrit plus haut, avec CMake 3.14.4, 3.16.3 et 4.4.3 ; cmake --build <build> --target package refait le même .deb, sans avertissement avec CMake 3.16.
  • autotools et meson ne sont pas touchés (aucun fichier de leurs builds ne change) : pas reconstruits.

Non vérifiable ici : le vrai ccache (simulé par un script) ; macOS (le test y tourne avec les générateurs Makefile) ; les runners lents sous QEMU (le test y prenait jusqu'à 52 s ; l'ajout est une reconfiguration qui réutilise le cache et une archive, de liens avec le CMake 3.31 de Debian 13 et le 3.28 d'Ubuntu 24.04) ; le job ajouté, jusqu'à la CI de cette pull request. Les cas « sans sh » et « sans liens » ne sont couverts par aucun job (MSYS2 prend le CMake de mingw-w64, où CMAKE_HOST_UNIX est faux, et le test n'y est pas enregistré) : seulement par les essais ci-dessus.

Dépendances

Aucune.

Questions ouvertes

  • « Faire dépendre package_source d'une reconfiguration » est lu ici comme « reconfigurer quand VERSION.txt a changé de version », ce que visait le TODO. Avec les générateurs Makefile, package_source ne relit toujours pas un autre changement de la configuration (CPACK_SOURCE_IGNORE_FILES modifié dans CMakeLists.txt, par exemple), comme pour tout projet CMake.
  • Les avertissements CMP0010 de CPack, remarqués pendant la relecture, sont traités dans cette pull request (section « Hors du point N »), comme demandé.

@Jordan08
Jordan08 merged commit 0dfc9c6 into configure-clean Oct 6, 2026
129 checks passed
Jordan08 added a commit that referenced this pull request Oct 6, 2026
@Jordan08
Jordan08 deleted the todo-n-cpack-stale-configure branch October 6, 2026 12:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant