Point N : package_source reconfigure, cpack_stale_configure avec ccache, Ninja hors du PATH - #94
Merged
Merged
Conversation
…he Makefile generators too
…out sh or links, package_source
…ure checks and why CMake only
…th CMake 3), GAOL's own version
…s, skipped only without sh
… or another Ninja is in PATH
…its backslashes (CMP0010)
…hived (no pattern ignores it)
…e checks in the archive
Jordan08
added a commit
that referenced
this pull request
Oct 6, 2026
This was referenced Oct 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Point N de
TODO.md: les suites du testcpack_stale_configureet depackage_sourceaprès un changement deVERSION.txt(anciens 44 et 63).44. Le test
cpack_stale_configureavec un lanceur dansCCet un Ninja hors duPATHProblème. Le test configure des copies de l'arbre avec les compilateurs du build parent, passés par
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}. AvecCC="ccache gcc", CMake rangeccachedansCMAKE_C_COMPILERetgccdansCMAKE_C_COMPILER_ARG1: la copie était configurée avecccacheseul 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.txtpasse au script chaque compilateur suivi de ses arguments (CMAKE_<LANG>_COMPILERetCMAKE_<LANG>_COMPILER_ARG1, qui vautgccdepuisCCetgccdepuis une liste-DCMAKE_C_COMPILER=ccache;gcc), et le programme du générateur (CMAKE_MAKE_PROGRAM). Le script configure chaque copie parcmake -E env "CC=…" "CXX=…" cmake … -DCMAKE_MAKE_PROGRAM=…: la copie relitCCetCXXcomme le parent les a lus.Sans
shou sans liens symboliques, le script s'arrêtait surFATAL_ERROR. Il dit maintenant « cpack_stale_configure: skipped, … » et rend la main, etSKIP_REGULAR_EXPRESSIONen fait un test ignoré (CTest 3.16 et après ; avec CMake 3.14 et 3.15, il passe avec ce message).shabsent se voit au statut d'execute_process(« no such file or directory », unshtué 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_sourceaprès un changement deVERSION.txtProblème. L'archive prend son nom et sa version dans
CPackSourceConfig.cmake, écrit par CMake à la configuration. Ninja reconfigure avantpackage_source(CMAKE_CONFIGURE_DEPENDS), mais avec les générateurs Makefile la cible lance CPack tout de suite (elle ne dépend pas decmake_check_build_system, contrairement àpackage, qui passe parpreinstallpuisall). Reproduit avec les sources deconfigure-clean: aprèsecho 5.0.1 > VERSION.txt,cmake --build build --target package_sourcedonnegaol-5.0.0.tar.gz, qui contientgaol-5.0.0/VERSION.txtà 5.0.1, sans l'avertissement surconfigure.Correction (décidée : faire dépendre
package_sourced'une reconfiguration). Une cible intégrée commepackage_sourcene prend pas de dépendance, mais CPack inclut à chaque archive le fichier deCPACK_PROJECT_CONFIG_FILE. Le nouveaucmake/gaol_package_source.cmakey litVERSION.txtavecgaol_read_version(); s'il ne donne plus la version de la configuration (CPACK_GAOL_VERSION, et nonCPACK_PACKAGE_VERSION, quecpack -Rremplace), il relancecmake -S <sources> -B <build>(ce qui affiche l'avertissement surconfigure), puis relit leCPackSourceConfig.cmakeréécrit. CPack lit ce fichier sans aucune politique : il prend celles deCMakeLists.txt(cmake_policy(VERSION 3.14...3.25)entrePUSHetPOP), sans quoi CMake 3 avertit de CMP0007 aulist()degaol_read_version(). Seulement pour l'archive des sources (CPACK_INSTALLED_DIRECTORIESdéfini) :packagereconfigure déjà. UnVERSION.txtrefusé fait échouer la reconfiguration, et CPack s'arrête sans archive (« CPack Error: Cannot initialize the generator TGZ », après le message de CMake surVERSION.txt).Le TODO disait qu'une vérification au moment de l'archive « demanderait CMake 3.19 » (
CPACK_PRE_BUILD_SCRIPTS) :CPACK_PROJECT_CONFIG_FILEexiste bien avant 3.14, et la correction marche avec CMake 3.14.4 (vérifié).Test.
cpack_stale_configurele vérifie : la copie configurée pour la version deconfigure, sonVERSION.txtpassé à la suivante, CPack lancé commepackage_sourcele lance (cpack --config CPackSourceConfig.cmakedans le build, quel que soit le générateur) doit afficher l'avertissement et fairegaol-<nouvelle>.tar.gz, qui contientgaol-<nouvelle>/VERSION.txt, et pasgaol-<ancienne>.tar.gz, sans avertissement de CMake dans les fichierscmake/gaol_*.cmakeque 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
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 macroremove_work_dir(). Le répertoire de build contient maintenant le_CPack_Packagesde 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.mddit 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_FILESrelu sans ses barres obliques inversesProblème (déjà sur
configure-clean, relevé par la relecture). CPack écrit les variablesCPACK_*dansCPackConfig.cmakeetCPackSourceConfig.cmake, puis les relit. SansCPACK_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/haloetdoc/zz.go, ajoutés pour l'essai, manquaient dans l'archive.Correction.
set(CPACK_VERBATIM_VARIABLES ON)dans le bloc CPack deCMakeLists.txt: CPack échappe les valeurs qu'il écrit. Toutes les variablesCPACK_*relues deCPackConfig.cmakeet deCPackSourceConfig.cmakesont identiques avant et après avec CMake 3.14 et 3.16 (où la barre était gardée) ; avec CMake 4.4, seulesCPACK_IGNORE_FILESetCPACK_SOURCE_IGNORE_FILESchangent, et retrouvent leurs barres. Le.debrefait avec CMake 4.4 a le mêmecontrolet 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 decmake/gaol_*.cmake), et la copie contient un fichierkeep.halo, qu'aucun motif n'écarte mais que.lo$écarterait : l'archive doit le contenir. SansCPACK_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.mdetChangeLog(pull request de synthèse)À ajouter à la puce de #33 (« CMake warns of a
configuregenerated for another version »,todo-notes/synthese.md) :doc/differences.md: « After a change ofVERSION.txt,package_sourceconfigures 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 newVERSION.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 ofCPACK_SOURCE_IGNORE_FILESwith their backslashes (CPACK_VERBATIM_VARIABLES): CMake 3 warned of them, and CMake 4 read\.as., which matches any character, so that a file such asexamples/halowould have been left out of the archive. »Relecture
Un relecteur indépendant (sous-agent sans le contexte du travail) a relu la branche à
501c734et 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 :package_sourceaffichait un avertissement de développeur CMP0007 venu degaol_read_version(), CPack lisantcmake/gaol_package_source.cmakesans politique ; corrigé parcmake_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 avecCPACK_GAOL_VERSION;ninja-buildetsamuduPATH(les noms que cherche CMake), et échoue si le test est « Skipped » (CTest rend alors 0) ;execute_processcouvrait aussi unshtué par un signal : le test ne se dit ignoré que pour « no such file » ;doc/tests.mdsur 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 dansCC, avec Ninja hors duPATH, etpackage_sourcedonnegaol-5.0.0.tar.gz; sans la ligneinclude(${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'unVERSION.txtrefusé arrête CPack sans archive, quepackagen'est pas touché, quefile(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
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 scriptexec "$@", ccache n'étant pas installé ici) : échouait, passe ;-G Ninja -DCMAKE_MAKE_PROGRAM=<copie de ninja>avec unPATHsans Ninja : échouait, passe ;PATHsanssh:FATAL_ERROR, maintenant « Skipped » ;symlink()refusé par une bibliothèqueLD_PRELOAD(pas desudopour monter un système de fichiers sans liens) :FATAL_ERROR, maintenant « Skipped » ;package_sourceavec « Unix Makefiles » :gaol-5.0.0.tar.gzavant,gaol-5.0.1.tar.gzavec l'avertissement après ; Ninja inchangé (gaol-5.0.1.tar.gz).set(CPACK_PROJECT_CONFIG_FILE …)deCMakeLists.txt,cpack_stale_configureéchoue (« CPack did not configure again, warn and make gaol-5.0.1.tar.gz ») ; avec, il passe.package_sourcereconfigure et faitgaol-5.0.1.tar.gz;cpack_stale_configurepasse, avec et sans le faux ccache ; sanssh, il passe avec son message (pas deSKIP_REGULAR_EXPRESSIONavant 3.16).linux.yml, simulé ici : configuration avec le faux ccache et Ninja hors duPATH,ctest -R cpack_stale_configure --no-tests=errorpasse.PATH(les étapes du job ajouté), sans liens symboliques (« Skipped »), sanssh(« Skipped ») ; CMake 3.14.4 et 3.16.3 : le test passe, et échoue sans les politiques ;cpack -R 9.9.9ne reconfigure plus.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 % (intervalfetinterval2fignorés par construction) ; aucun avertissement.cpack_stale_configureetnumbersaussi sousLC_ALL=fr_FR.UTF-8.cmake --build <build> --target packagefait toujoursgaol-5.0.0-Linux.tar.gzetlibgaol-dev_5.0.0_amd64.deb.pdflatexdeux fois, zéro erreur, 129 pages, le même unique « Overfull » queconfigure-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 packagerefait le même.deb, sans avertissement avec CMake 3.16.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_UNIXest faux, et le test n'y est pas enregistré) : seulement par les essais ci-dessus.Dépendances
Aucune.
Questions ouvertes
package_sourced'une reconfiguration » est lu ici comme « reconfigurer quandVERSION.txta changé de version », ce que visait le TODO. Avec les générateurs Makefile,package_sourcene relit toujours pas un autre changement de la configuration (CPACK_SOURCE_IGNORE_FILESmodifié dansCMakeLists.txt, par exemple), comme pour tout projet CMake.