OVH Cloud OVH Cloud

Makefile

17 réponses
Avatar
Thomas
bonjour :-)

y a t il un meilleur forum pour parler des Makefiles ?


est il bien vu de mettre un lien sur du code que j'ai écrit, comme ça ?

<http://svn.savannah.gnu.org/viewvc/rapid/branches/gtkada-2.24/bin/Makefi
le-include.mk?view=markup>


1
j'aimerais savoir si je peux faire mieux, pour la définition de
ADA_FILES :
est il possible de factoriser les répétitions sous forme de boucle ?
idéalement, il faudrait que ça s'arrête quand ADA_DIRS est vide.


2
je me demande si mon Makefile est suffisamment bien fait pour être
agréable Í  ceux qui manipulent des Makefile toute l'année

par exemple, avec les règles clean et clobber, c'est pas très pratique
parce que l'auto-complétion s'arrête Í  'cl' et on doit taper une lettre
de plus pour continuer :
est ce qu'on peut choisir des noms qui vont mieux, ou est ce qu'il vaut
mieux laisser ça comme ça parce que tout le monde "dans le milieu" en a
l'habitude ?

n'hésitez pas Í  me faire vos commentaires, si y a des choses pour
lesquelles je n'ai pas l'idée de vous poser la question :-)


je pense que je vais ajouter la construction des exemples
(dans branches/gtkada-2.24/examples,
décrits dans branches/gtkada-2.24/INSTALL partie 5)

je crois savoir comment faire,
je vais faire une règle "examples" et je vais l'ajouter Í  "all",

mais ensuite je me demande quelle politique adopter pour le nettoyage,
pour que ça soit ergonomique :

les exemples sont censés être autonomes et simples, puisque c'est leur
rÍ´le

- si je ne touche pas Í  clean et clobber,
on va avoir all qui va construire les exemples, et clean et clobber ne
vont pas les nettoyer.
- si je modifie clean et clobber pour que ça nettoie ce que "make all"
fait,
Í  ce moment lÍ , on pourrais se retrouver Í  aller dans le dossier des
exemples, en fabriquer un, ensuite on retourne dans le principal, et si
on nettoie, l'exemple se retrouve nettoyé aussi !
ça peut surprendre, non ?
surtout que "make" ne les fabrique pas, puisque il est dirigé sur "build"

voilÍ , je crois que je suis obligé de choisir une de ces 2 alternatives,
je ne crois pas qu'il y en ait d'autres.
qu'en pensez vous ?

--
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/

7 réponses

1 2
Avatar
Nicolas George
Thomas , dans le message
, a écrit :
pardon, je viens de m'apercevoir que j'ai écrit une énorme bêtise !
il y a aussi une bibliothèque, mais qui n'est pas signalée comme telle,
donc actuellement l'énorme avantage de tout laisser "en plan" après la
compilation et de ne rien installer, c'est que les utilisateurs peuvent
utiliser les fichiers objets créés Í  la compilation, ça ne pose pas de pb
(pas sur que si on les déplaçait ça irais aussi bien)
... donc avant de passer Í  l'étape de l'installation, il faut que je
régularise ça !
(il y a aussi la curiosité du fait que ça supporte plusieurs interfaces
graphiques au choix,
je ne sais pas si c'est possible ni souhaitable d'en installer plusieurs
"pairs" en parallèle,
mais c'est pas mon 1er pb parce que je vais commencer avec 1 Í  la fois)

Je n'ai absolument rien compris Í  tout ça.
je tacherai d'utiliser GPRinstall (puisqu'il a été fait pour simplifier
la vie des gens, autant s'en servir)

Ce pour quoi un programme a été fait n'est pas forcément la même chose que
ce qu'il réalise en réalité. Je ne connais pas GPRinstall, et même si son
but est de simplifier la vie des gens, je devine que son effet est d'être
Yet Another F***ing Non-Standard Build System.
en fait je crois que j'ai compris de travers ce que t'as écrit :
je pensais que tu parlais du Makefile et que les fichiers de données
désignaient ceux générés par la compilation
alors qu'en fait (si j'ai bien compris cette fois ci),
t'avais déjÍ  commencé Í  répondre Í  la question écrite plus bas
(les fichiers de données désignant les images) :

Oui, je parlais des fichiers de données nécessaires Í  l'exécution.
par contre, il reste une question (qui était un peu plus haut) non
répondue, puisque je croyais que t'y répondais mais c'était pas ça :
tu parlais de "compiler dans un répertoire séparé", et je demandais
comment le Makefile devait être fait pour ça :

La manière standard est d'avoir in script configure qui enregistre, quand il
est invoqué comme /chemin/vers/les/sources/configure, que les sources sont
dans /chemin/vers/les/sources/.
Une manière un peu moins standard est d'attendre des utilisateurs qu'ils
compilent avec make -f /chemin/vers/les/sources/Makefile, et dans ce cas le
répertoire de sources sera $(dir $(MAKEFILE_LIST)).
Avatar
Thomas
In article <606adb20$0$16194$,
Nicolas George <nicolas$ wrote:
Thomas , dans le message
, a écrit :
<http://svn.savannah.gnu.org/viewvc/rapid/branches/gtkada-2.24/bin/Makefi
le-include.mk?view=markup>


j'aurais du inclure le n° de version, c'est plus pratique pour ceux qui
viennent lire le fil plus tard :
http://svn.savannah.gnu.org/viewvc/rapid/branches/gtkada-2.24/bin/Makefil
e-include.mk?revision"5&view=markup ( https://urlpetite.fr/jf6 )
voilÍ  la nouvelle version :
http://svn.savannah.gnu.org/viewvc/rapid/branches/gtkada-2.24/bin/Makefil
e-include.mk?revision"6&view=markup ( https://urlpetite.fr/vgv )
Avoir une fois la liste compète des fichiers Í  compiler écrite explicitement
est une bonne idée.

je le refuse pour l'instant, mais Í  l'occasion je demanderai dans
quelles circonstances les gens trouvent ça utile.
pour l'adopter j'ai besoin de comprendre.
2
je me demande si mon Makefile est suffisamment bien fait pour être
agréable Í  ceux qui manipulent des Makefile toute l'année

Je ne vois pas les règles pour installer, donc je ne vois pas si elles
respectent la convention DESTDIR.
Il ne semble pas que ça permette de compiler dans un répertoire séparé avec
le répertoire de sources en pure lecture seule. C'est un problème.

les 2 sont sur la to-do-list, + prefix
je le ferai quand j'en serai arrivé Í  l'étape de compiler mon projet
sous ubuntu 20.04
(je préfère éviter de me manger des bugs qui auraient été corrigés dans
cet intervalle)
en attendant, s'il te reste un peu de patience, je veux bien que tu me
dises s'il y a d'autres choses qui ne te plaisent pas dans la nouvelle
version :-)
est ce qu'on peut choisir des noms qui vont mieux, ou est ce qu'il vaut
mieux laisser ça comme ça parce que tout le monde "dans le milieu" en a
l'habitude ?

Ton «Â clobber » ressemble Í  «Â distclean ».
Í  ce moment lÍ , on pourrais se retrouver Í  aller dans le dossier des
exemples, en fabriquer un, ensuite on retourne dans le principal, et si
on nettoie, l'exemple se retrouve nettoyé aussi !
ça peut surprendre, non ?

En général, c'est ce qu'on attend : make clean efface, même les cibles
optionnelles.

voilÍ  :-) merci !
--
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/
Avatar
Thomas
In article <607481d1$0$12712$,
Nicolas George <nicolas$ wrote:
Thomas , dans le message
, a écrit :
pardon, je viens de m'apercevoir que j'ai écrit une énorme bêtise !
il y a aussi une bibliothèque, mais qui n'est pas signalée comme telle,
donc actuellement l'énorme avantage de tout laisser "en plan" après la
compilation et de ne rien installer, c'est que les utilisateurs peuvent
utiliser les fichiers objets créés Í  la compilation, ça ne pose pas de pb
(pas sur que si on les déplaçait ça irais aussi bien)
... donc avant de passer Í  l'étape de l'installation, il faut que je
régularise ça !
(il y a aussi la curiosité du fait que ça supporte plusieurs interfaces
graphiques au choix,
je ne sais pas si c'est possible ni souhaitable d'en installer plusieurs
"pairs" en parallèle,
mais c'est pas mon 1er pb parce que je vais commencer avec 1 Í  la fois)

Je n'ai absolument rien compris Í  tout ça.

tant pis.
c'est pas grave pour moi parce que a priori je n'ai pas besoin de toi
pour cette partie.
par contre je ne veux pas te manquer de respect, et si tu souhaites
comprendre je suis Í  ta disposition,
mais il faudrait me diriger un peu pour me permettre de savoir de quelle
manière je pourrais t'expliquer de façon Í  ce que tu comprennes
je tacherai d'utiliser GPRinstall (puisqu'il a été fait pour simplifier
la vie des gens, autant s'en servir)

Ce pour quoi un programme a été fait n'est pas forcément la même chose que
ce qu'il réalise en réalité. Je ne connais pas GPRinstall, et même si son
but est de simplifier la vie des gens, je devine que son effet est d'être
Yet Another F***ing Non-Standard Build System.

https://docs.adacore.com/gprbuild-docs/html/gprbuild_ug/introduction.html
GPRbuild est censé etre multi-langages, mais en vrai il est très orienté
"ada".
je suppose que pour ceux qui font du multi-langages incluant ada,
GPRbuild est mieux que GNAT,
mais pour ceux qui ne touchent pas Í  ada, par rapport Í  d'autres
systèmes qui "ne doivent pas manquer d'exister", j'ai des doutes.
enfin, moi je programme en ada, donc je vais m'en servir.
les autres en ont l'air content, donc je vais suivre la majorité de ceux
qui programment en ada :-)
tu parlais de "compiler dans un répertoire séparé", et je demandais
comment le Makefile devait être fait pour ça :

La manière standard est d'avoir in script configure qui enregistre, quand il
est invoqué comme /chemin/vers/les/sources/configure, que les sources sont
dans /chemin/vers/les/sources/.

ça me parait accessible, pourrais tu me décrire un peu plus le
fonctionnement stp ?
- le principe c'est qu'on se place tjr dans le répertoire o͹ on veut
qu'il mette le résultat de la compilation ?
- ensuite on exécute /chemin/vers/les/sources/configure et il nous
fabrique un fichier de config dans ce répertoire ?
- et ensuite, comment est ce qu'on appelle make ?
Une manière un peu moins standard est d'attendre des utilisateurs qu'ils
compilent avec make -f /chemin/vers/les/sources/Makefile, et dans ce cas le
répertoire de sources sera $(dir $(MAKEFILE_LIST)).

si j'arrive pas Í  faire le précédent, ce qui complique les choses c'est
pour détecter le "peer" choisi.
mais je ne vais pas creuser cette piste avant d'avoir vu l'autre,
puisque c'est ta préférée :-)
est ce qu'il y a des restrictions par rapport au répertoire de
destination ?
par ex s'il fait partie de la distribution (un autre répertoire que
celui qu'on doit utiliser par défaut), est ce que je dois faire la
compilation par défaut, ou refuser de la faire ?
--
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/
Avatar
Thomas
In article <607480a9$0$12712$,
Nicolas George <nicolas$ wrote:
Thomas , dans le message
, a écrit :
mais si ça te dérange pas trop, j'aimerais bcp que tu me montres comment
on peut parcourir les sous dossiers avec un Makefile stp,
parce que lÍ  je sèche, et j'aimerais bien savoir le faire si on peut :-)


j'ai trouvé !
j'en étais resté Í  l'interdiction de faire des boucles avec les
"variables développées récursivement".
il fallait que je relise la doc de call, pour m'apercevoir qu'il y a une
différence décisive avec les "variables développées récursivement" : les
variables locales ! et ça change complètement la donne ...
dans presque tous les exemples donnés on peut remplacer l'appel Í  call
par une variable globale ... donc Í  la 1ere lecture je n'avais pas
compris l'intérêt de s'intéresser Í  call de plus près.
(l'exception étant très spéciale. je ne sais pas si c'est qqch qui peut
être un jour utile dans un Makefile.)
Attends, tu changes les données du problème, lÍ . Il n'a jamais été question
dans tes questions de parcourir des sous-répertoire
(on peut éviter les
appellations microsoftiennes ?),

désolé, je viens du mac, et surtout c'est bcp plus court Í  écrire :-P
(sais tu d'o͹ vient cette différence de vocabulaire ?)
il a toujours été question de parcourir des
listes.
En fait, pour commencer, il faudrait poser le problème un peu plus
clairement et précisément que par la donnée d'une ébauche de solution un peu
bancale.

la question était :
"j'aimerais savoir si je peux faire mieux, pour la définition de
ADA_FILES :
est il possible de factoriser les répétitions sous forme de boucle ?
idéalement, il faudrait que ça s'arrête quand ADA_DIRS est vide."
et le code était :
function_ADA_DIRS = $(wildcard $(foreach D,$(ADA_DIRS),$(D)/*))
function_ADA_FILES = $(wildcard $(foreach D,$(ADA_DIRS),$(D)/*.ad?))
ADA_FILES :
ADA_DIRS := ../../src/tki
ADA_FILES += $(function_ADA_FILES)
puis, répété autant qu'on veut creuser dans les sous-répertoires :
ADA_DIRS := $(function_ADA_DIRS)
ADA_FILES += $(function_ADA_FILES)
(veux tu dire avec "prefix" en plus de "DESTDIR" ?
je me réfère Í 
https://www.gnu.org/software/make/manual/html_node/Directory-Variables.ht
ml ( https://urlpetite.fr/0mw ), penses tu qu'il faut éviter ?)

Oui, prefix est une convention très largement respectée, et absolument
indispensable pour n'importe quel programme non trivial.
mais il faut bien qu'il y ait un emplacement prévu par défaut, au cas o͹
l'utilisateur n'en donne pas

/usr/local

mais alors, pourquoi m'as tu donné un exemple dans lequel prefix
n'apparait pas, et l'emplacement d'installation était /opt/machin ?
mais ça me parait prioritaire d'avoir un logiciel qui fait ce que je
veux, plutÍ´t qu'un logiciel buggé bien installé ;-)

Il vaut mieux partir propre dès le début.

c'est pour ça que j'ai commencé par des choses du genre nettoyage, comme
ça :
http://svn.savannah.gnu.org/viewvc/rapid?view=revision&revision"3
http://svn.savannah.gnu.org/viewvc/rapid?view=revision&revision"5
mais ça marche bcp mieux quand on sait des le début comment on veut que
ça se passe
je vais m'occuper de l'installation quand je me sentirai prêt,
et si je démarre un nouveau projet après ça, évidement je mettrai en
place tout ce que j'aurai appris sur l'installation des le début, ça
serais saugrenu d'attendre :-)
mais lÍ , vu d'o͹ je pars, ça ne me parait pas être prioritaire ... c'est
sur la liste :-)
est ce que ça vaut pour l'emplacement de compilation par défaut aussi,
en vue de ne pas en avoir besoin Í  l'emplacement d'installation ?
(Í  la 1ere lecture je croyais que c'était seulement pour l'emplacement
de compilation personnalisé)

Euh... Si ton programme a besoin d'être Í  un endroit particulier pour être
compilé, ne compte sur personne pour y contribuer.

tu parlais d'"une option ou une variable d'environnement".
est ce que je dois comprendre que tu consideres normal qu'il en ait
besoin Í  son emplacement de compilation par défaut aussi, pas seulement
Í  un emplacement de compilation personnalisé,
et que c'est uniquement Í  l'emplacement d'installation final qu'il est
censé être capable de fonctionner sans ?
par contre, si la doc de gnu ne te convient pas comme référence, y en a
t il une autre ?

Pas Í  ma connaissance.

ok, bon ben je compte sur toi alors ;-)
--
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/
Avatar
Thomas
In article
,
Thomas wrote:
voilÍ  la nouvelle version :
http://svn.savannah.gnu.org/viewvc/rapid/branches/gtkada-2.24/bin/Makefile-include.mk?revision"6&view=markup ( https://urlpetite.fr/vgv )
en attendant, s'il te reste un peu de patience, je veux bien que tu me
dises s'il y a d'autres choses qui ne te plaisent pas dans la nouvelle
version :-)

1
y a t il trop de override Í  ton gout ?
je n'ai pas réussi Í  résister, malgré la recommandation :
ma formation est de programmer les choses les plus fiables possibles,
pour avoir le moins possible Í  y revenir
2
l 39 :
un avis sur ASCII_SP ?
3
l 58 :
cette fois ci je pense que ça y est, mon test est insubmersible !! haha
:-)
... sauf que je l'ai pensé une 10aine de fois avant de m'apercevoir de
nouvelles failles ...
est t il possible de faire un peu moins "hackesque", si possible sans
trop rogner sur la fiabilité ?
4
l 79-165 :
comme le traitement de GPR_PROJECT_PATH est très long et pas très
intéressant, je pense diviser ce Makefile en 2 :
bonne idée ?
5
je trouve que ces 2 pages lÍ  ne sont pas parfaitement claires :
https://www.gnu.org/software/make/manual/html_node/Parsing-Makefiles.html
https://www.gnu.org/software/make/manual/html_node/Reading-Makefiles.html
déjÍ , il me semble qu'il faut inverser les étapes 2 et 3, même si
j'aurais préféré que ça soit exact
ensuite, faut il inverser aussi les étapes 4 et 5 ?
si non, on devrais pouvoir faire
var_def := var := machin
$(var_def)
mais il dit "*** nom de variable vide. Arrêt."
(si je met
var_def := var = machin
c'est "*** missing separator. Arrêt.")
et en même temps, dans l'exemple qui est donné plus bas, même si on a
l'obligation de la faire tenir sur 1 seule ligne,
myrule contient Í  la fois du immediate et du deferred
donc pourquoi ce qui marche pour les règles ne marche pas pour les
définitions de variables ?
6
Í  l'inverse de la précédente,
$(nom-de-fonction-fantaisiste paramètre) ne fait pas d'erreur mais
renvoie du vide (même si la variable nom-de-fonction-fantaisiste
existe) !
normal ?
7
l 215-235 :
pour faire mon ADA_FILES,
si je trouve sur mon chemin un fichier machin.txt, il va faire un
wildcard sur machin.txt/* puis sur machin.txt/*.ad[bs]
est il possible d'optimiser un peu en évitant ces 2 wildcard, qu'on sait
inutiles aussitÍ´t qu'on sait que machin.txt n'est pas un répertoire ?
--
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/
Avatar
Thomas
In article
,
Thomas wrote:
In article
,
Thomas wrote:
voilÍ  la nouvelle version :


http://svn.savannah.gnu.org/viewvc/rapid/branches/gtkada-2.24/bin/makefil
e-Main.mk?revision"8&view=markup ( https://urlpetite.fr/m7j )
2
l 39 :
un avis sur ASCII_SP ?

est ce que $= est suffisamment sur ?
est ce que c'est interdit par le système de mettre dans l'environnement
des variables ayant ce nom lÍ  ?
4
l 79-165 :
comme le traitement de GPR_PROJECT_PATH est très long et pas très
intéressant, je pense diviser ce Makefile en 2 :
bonne idée ?

c'est fait, j'espère que ça convient
(pour l'instant je ne regrette pas)
--
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/
Avatar
Thomas
In article
,
Thomas wrote:
In article
,
Thomas wrote:
voilÍ  la nouvelle version :


http://svn.savannah.gnu.org/viewvc/rapid/branches/gtkada-2.24/bin/makefil
e-Main.mk?view=markup&pathrev#2 ( https://urlpetite.fr/6tz )
depuis la dernière fois, j'ai trouvé comment faire un lien qui ne soit
pas cassé quand je renomme ou déplace le fichier dans la révision de
tête.
l'inconvénient, c'est que vous n'avez pas d'accès direct aux nouvelles
versions du fichier, même quand le chemin n'a pas changé.
mais je crois que ça vaut mieux plutÍ´t que le lien soit cassé (qu'en
pensez vous ?)
1
y a t il trop de override Í  ton gout ?
je n'ai pas réussi Í  résister, malgré la recommandation :
ma formation est de programmer les choses les plus fiables possibles,

cad, en l'occurrence, dont le comportement ne dépend pas de
l'environnement
pour avoir le moins possible Í  y revenir
2
un avis sur ASCII_SP ?

l 42 :
je pense que je me suis décidé pour de bon :
SP := $(subst V,, )
# V pour "void"
en fait, l'ex donné ici avec empty :
https://www.gnu.org/software/make/manual/html_node/Syntax-of-Functions
m'a inspiré l'idée que :
- s'appuyer sur une variable (qu'on espère) vide ... bof
- une borne en dur, c'est mieux : `$(subst borne,,borne borne)`
ensuite, je l'ai simplifiée au max, sans risquer l'incertitude de
`$(subst ,, )`,
et j'ai aussi pensé Í  `$(subst SP, ,SP)` mais il m'a semblé que ça
faisait un peu plus de travail pour l'interpreteur, sans que ça soit
vraiment utile pour la lisibilité.
3
cette fois ci je pense que ça y est, mon test est insubmersible !! haha
:-)
... sauf que je l'ai pensé une 10aine de fois avant de m'apercevoir de
nouvelles failles ...
est t il possible de faire un peu moins "hackesque", si possible sans
trop rogner sur la fiabilité ?

l 69-73 :
... un peu moins "hackesque" ... juste un peu moins ! :-D
enfin, même si c'est un peu plus long Í  écrire au final,
je trouve ça quand même plus solide,
puisque ça ne dépend plus d'éventuels aléas d'interprétation d'un
"pattern",
et ça donne une belle condition nulle ou pas (au lieu d'une chaine
obscure Í  comparer).
et finalement je trouve ça plus lisible :-)
un avis ?
4
l 156-166 :
je viens de m'apercevoir d'un pb :
je sollicite la cible `tests` pour vérifier que tous les tests Í 
exécuter sont bien construits, sauf que ma variable TESTS a été
construite avant !
j'ai failli demander si c'est possible de mettre Í  jour la variable
entre les 2 recettes, mais :
https://www.gnu.org/software/make/manual/html_node/Standard-Targets.html
pour 'check', dit :
"The user must build the program before running the tests"
est ce que ça veut dire que la seule bonne chose que j'aurais Í  faire ça
serais de couper la dépendance Í  `tests`,
parce que ça n'est pas une bonne chose Í  automatiser et l'usager est
tenu d'avoir exécuté d'autres buts avant celui lÍ  ?
5
l 216, 241 :
est il possible de récupérer la liste des prerequis de .PHONY pour
remplir TARGETS ?
6
de nouveau des questions de nommage :
- pour les cibles composées, faites avec BUILD_MODES et PEERS,
dans quel sens est ce que c'est mieux de les construire ?
(par ex "debug-tests" ou "tests-debug" ?
"peers-distclean" ou "distclean-peers" ?)
pour l'auto-complétion, est ce que c'est gênant ou pas que les debug-*
et develop-* se battent avec distclean ?
- pour fabriquer le logiciel principal (ni les tests ni les exemples),
est ce que "build" est un bon choix ?
pour l'auto-complétion, il a l'avantage d'être le seul Í  commencer par
"b".
--
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/
1 2