Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Outil Make simple

50 réponses
Avatar
TSalm
Bonjour,

Je cherche un outil qui me permette de lancer des compilations de façon
simple sur un projet de plusieurs executables.

Quand je dis simple, je veux dire qui sache trouver automatiquement les
dépendances, qui génére les fichiers .o seulement s'ils ne sont pas à jour
avec leurs sources, et qui m'oblige à une certaine organisation de mes
sources évidemment.

Qui fait que je n'ai plus qu'à lancer une compilation de mon executable,
plein d'autres dépendances, de cette façon :
$MON_OUTIL chemin/vers/mon/exe.cpp

Ca existe ?

Merci d'avance pour vos conseils.
-TSalm

10 réponses

1 2 3 4 5
Avatar
James Kanze
On Nov 26, 2:49 pm, Michael Doubez wrote:
On 26 nov, 14:03, (Marc Espie) wrote:



> In article ps.com>,



[...]
> Parce que mv file file.old && sed <file.old >file c'est pas
> sorcier.



Et pourtant il y a une erreur pour avoir le même comportement
;) mv file file.old && sed <file.old >file && rm file.old



J'espère que ce n'est pas le comportement du -i. Sinon, c'est à
éviter. Comme j'ai dire ailleurs, il ne faut pas détruire
l'original si on rencontre une erreur lors de la transformation.
(Imagine ce qui se passe si la disque est à peu près plein, et
qu'il y a une erreur d'écriture après n'avoir transformé qu'un
tiers du fichier.)

[...]
> Okay, je caricature en forcant le trait, mais il y a
> franchement un peu de ca, et il y a des idees gnu qui sont
> nocives au final (le coup de la glibc qui "accepte" des
> pointeurs nuls comme chaines de caracteres valides, par
> exemple, ou encore cette idee saugrenue que les pages de
> man, c'est du passe, et que info c'est mieux)...

Dans le cas de la glibc, je n'ai pas la norme sous le coude
mais je ne crois pas qu'elle impose une erreur. A vue de nez,
ça doit être un comportement indéfini donc traiter NULL comme
une chaine valide n'est pas si grave et conforme: je ne
connais personne qui compte sur un segfault de printf() pour
détecter les chaines NULL.



Moi. Au moins, quand j'ai une erreur de programmation, je veux
le savoir le plus vite possible. Masquer les erreurs n'est
jamais un bon choix.

--
James Kanze
Avatar
Michael Doubez
On 26 nov, 19:53, James Kanze wrote:
On Nov 26, 2:49 pm, Michael Doubez wrote:

> On 26 nov, 14:03, (Marc Espie) wrote:
> > In article oups.com>,

    [...]

> > Parce que mv file file.old && sed <file.old >file c'est pas
> > sorcier.
> Et pourtant il y a une erreur pour avoir le même comportement
> ;) mv file file.old && sed <file.old >file && rm file.old

J'espère que ce n'est pas le comportement du -i. Sinon, c'est à
éviter. Comme j'ai dire ailleurs, il ne faut pas détruire
l'original si on rencontre une erreur lors de la transformation.
(Imagine ce qui se passe si la disque est à peu près plein, et
qu'il y a une erreur d'écriture après n'avoir transformé qu'un
tiers du fichier.)



J'espère que dans ce cas sed renvoit une erreur et le && n'est pas
executé.
Oui, il faut traiter le cas ou sed rate ou si il ne peut pas parser
l'expression.

    [...]

> > Okay, je caricature en forcant le trait, mais il y a
> > franchement un peu de ca, et il y a des idees gnu qui sont
> > nocives au final (le coup de la glibc qui "accepte" des
> > pointeurs nuls comme chaines de caracteres valides, par
> > exemple, ou encore cette idee saugrenue que les pages de
> > man, c'est du passe, et que info c'est mieux)...

> Dans le cas de la glibc, je n'ai pas la norme sous le coude
> mais je ne crois pas qu'elle impose une erreur. A vue de nez,
> ça doit être un comportement indéfini donc traiter NULL comme
> une chaine valide n'est pas si grave et conforme: je ne
> connais personne qui compte sur un segfault de printf() pour
> détecter les chaines NULL.

Moi. Au moins, quand j'ai une erreur de programmation, je veux
le savoir le plus vite possible. Masquer les erreurs n'est
jamais un bon choix.



Je suis d'accord mais dans la mesure où le comportment est indéfini,
c'est AMA au codeur de mettre un assert() pour vérifier ses pré-
conditions.

Pour moi, ce serait comme si je ne testait pas si un pointeur est NULL
en me disant que de toutes façons ça fait un segfault si ça arrive.

--
Michael
Avatar
James Kanze
On Nov 27, 8:43 am, Michael Doubez wrote:
On 26 nov, 19:53, James Kanze wrote:
> On Nov 26, 2:49 pm, Michael Doubez wrote:



> > On 26 nov, 14:03, (Marc Espie) wrote:
> > > In article
> > > ,



> [...]
> > > Parce que mv file file.old && sed <file.old >file c'est
> > > pas sorcier.
> > Et pourtant il y a une erreur pour avoir le même
> > comportement ;) mv file file.old && sed <file.old >file &&
> > rm file.old



> J'espère que ce n'est pas le comportement du -i. Sinon,
> c'est à éviter. Comme j'ai dire ailleurs, il ne faut pas
> détruire l'original si on rencontre une erreur lors de la
> transformation. (Imagine ce qui se passe si la disque est à
> peu près plein, et qu'il y a une erreur d'écriture après
> n'avoir transformé qu'un tiers du fichier.)



J'espère que dans ce cas sed renvoit une erreur et le && n'est
pas executé. Oui, il faut traiter le cas ou sed rate ou si il
ne peut pas parser l'expression.



S'un programme ne renvoit pas une erreur lors d'une erreur
d'écriture, c'est bien une erreur dans le programme. Qu'il faut
absolument corriger. (Dans le cas de mon C++, c'est la classe
singleton ProgramStatus qui s'en occupe, quand on lui démande le
status de retour. C'est donc systèmatique. Mais même avant, en
C, je faisais bien un fflush(), avec une vérification du
résultat, avant de terminer.)

> [...]
> > > Okay, je caricature en forcant le trait, mais il y a
> > > franchement un peu de ca, et il y a des idees gnu qui sont
> > > nocives au final (le coup de la glibc qui "accepte" des
> > > pointeurs nuls comme chaines de caracteres valides, par
> > > exemple, ou encore cette idee saugrenue que les pages de
> > > man, c'est du passe, et que info c'est mieux)...



> > Dans le cas de la glibc, je n'ai pas la norme sous le
> > coude mais je ne crois pas qu'elle impose une erreur. A
> > vue de nez, ça doit être un comportement indéfini donc
> > traiter NULL comme une chaine valide n'est pas si grave et
> > conforme: je ne connais personne qui compte sur un
> > segfault de printf() pour détecter les chaines NULL.



> Moi. Au moins, quand j'ai une erreur de programmation, je
> veux le savoir le plus vite possible. Masquer les erreurs
> n'est jamais un bon choix.



Je suis d'accord mais dans la mesure où le comportment est
indéfini, c'est AMA au codeur de mettre un assert() pour
vérifier ses pré- conditions.



Dans la mesure où c'est un comportement indéfini, c'est au
codeur de ne pas le faire. Si tous les codeurs étaient parfaits,
et ne faisaient jamais d'erreur, c'est égal ce que fait strxxx
dans ces cas-là. Autrement, il vaut mieux crasher le plus vite
possible en cas d'erreur.

Historiquement... Les tous premiers Unix s'arrangaient pour que
les 512 premiers octets soient accessibles en lecture (ils
n'avaient pas le choix avec les machines de l'époque) et
contenaient 0. Je me rappelle qu'effectivement, quand on a
introduit la mémoire virtuelle, on n'a pas mappé la page 0,
justement pour detecter ce genre d'erreur. Et du coup, pas mal
d'utilitaires de base ne fonctionnaient plus ; on a dû faire
marche en arrière jusqu'à ce ils soient corrigés. Mais c'était
au milieu des années 1980 ; depuis lors, j'espèrerais que ce
n'est plus un problème. (Je sais qu'on n'était pas les seuls à
rencontrer le problème, et que les sources « officielles », de
AT&T, ont été changées peu après.)

Pour moi, ce serait comme si je ne testait pas si un pointeur
est NULL en me disant que de toutes façons ça fait un segfault
si ça arrive.



Ça dépend du contrat. En C++, en général, si je n'accepte pas
NULL, j'utilise une référence, non un pointeur. Et je ne teste
pas pour NULL.

--
James Kanze
Avatar
espie
In article ,
James Kanze wrote:
Historiquement... Les tous premiers Unix s'arrangaient pour que
les 512 premiers octets soient accessibles en lecture (ils
n'avaient pas le choix avec les machines de l'époque) et
contenaient 0. Je me rappelle qu'effectivement, quand on a
introduit la mémoire virtuelle, on n'a pas mappé la page 0,
justement pour detecter ce genre d'erreur. Et du coup, pas mal
d'utilitaires de base ne fonctionnaient plus ; on a dû faire
marche en arrière jusqu'à ce ils soient corrigés. Mais c'était
au milieu des années 1980 ; depuis lors, j'espèrerais que ce
n'est plus un problème. (Je sais qu'on n'était pas les seuls à
rencontrer le problème, et que les sources « officielles », de
AT&T, ont été changées peu après.)



Faudra que je retrouve (ou que tu fasses une recherche) sur un trou recent
de flash, qui correspond a une dereferencement du pointeur nul assez joli.

Oui, la page zero n'est pas mappee, mais si tu utilises le pointeur nul
pour faire p->tab[1024], en supposant que tab est un tableau de taille
variable niche a la fin de ta structure de donnees, tu peux eviter le segfault
et taper dans de la memoire valide... et ca fournit une classe d'exploit
assez joli (en l'occurrence, l'exploit flash en question est dependant du
processeur, mais pas de l'OS, et donc fonctionnait indifferemment sous
windows ou linux).
Avatar
Michael Doubez
On 27 nov, 10:55, James Kanze wrote:
On Nov 27, 8:43 am, Michael Doubez wrote:
> On 26 nov, 19:53, James Kanze wrote:
> > On Nov 26, 2:49 pm, Michael Doubez wrote:
> > > On 26 nov, 14:03, (Marc Espie) wrote:


[snip]
> > > > Okay, je caricature en forcant le trait, mais il y a
> > > > franchement un peu de ca, et il y a des idees gnu qui sont
> > > > nocives au final (le coup de la glibc qui "accepte" des
> > > > pointeurs nuls comme chaines de caracteres valides, par
> > > > exemple, ou encore cette idee saugrenue que les pages de
> > > > man, c'est du passe, et que info c'est mieux)...
> > > Dans le cas de la glibc, je n'ai pas la norme sous le
> > > coude mais je ne crois pas qu'elle impose une erreur. A
> > > vue de nez, ça doit être un comportement indéfini donc
> > > traiter NULL comme une chaine valide n'est pas si grave et
> > > conforme: je ne connais personne qui compte sur un
> > > segfault de printf() pour détecter les chaines NULL.
> > Moi. Au moins, quand j'ai une erreur de programmation, je
> > veux le savoir le plus vite possible. Masquer les erreurs
> > n'est jamais un bon choix.
> Je suis d'accord mais dans la mesure où le comportment est
> indéfini, c'est AMA au codeur de mettre un assert() pour
> vérifier ses pré- conditions.

Dans la mesure où c'est un comportement indéfini, c'est au
codeur de ne pas le faire. Si tous les codeurs étaient parfaits,
et ne faisaient jamais d'erreur, c'est égal ce que fait strxxx
dans ces cas-là. Autrement, il vaut mieux crasher le plus vite
possible en cas d'erreur.



Je pense qu'ici il y a une tension entre la robustesse et la
correction.

Dans le cas d'un printf()/str*(), la question est "Est ce que ça porte
à conséquence que la chaine soit NULL ?"
Pas vraiment si on considère seulement la chaine de caractères et les
services rendus par ces fonctions (affichage, calcul, comparaison).
L'erreur existerait aussi si le programmeur s'était trompé de chaine à
comparer.
Dans ce cas, AMA la robustesse peut être un choix valide: si le codeur
doit avoir une chaine non NULL autre part, ce n'est pas en relation
avec les fonction strxxx(), et c'est donc de sa responsabilité de
vérifier ses contrats.

--
Michael
Avatar
espie
In article ,
Michael Doubez wrote:
Dans le cas d'un printf()/str*(), la question est "Est ce que ça porte
à conséquence que la chaine soit NULL ?"
Pas vraiment si on considère seulement la chaine de caractères et les
services rendus par ces fonctions (affichage, calcul, comparaison).
L'erreur existerait aussi si le programmeur s'était trompé de chaine à
comparer.
Dans ce cas, AMA la robustesse peut être un choix valide: si le codeur
doit avoir une chaine non NULL autre part, ce n'est pas en relation
avec les fonction strxxx(), et c'est donc de sa responsabilité de
vérifier ses contrats.



Non, en pratique ca fout une merde pas possible. Le bon comportement, ca
serait d'etre robuste *et* de diagnostiquer le probleme (en affichant
par exemple quelque chose sur stderr).

Dans ce cas extremement precis, ca fait des programmes qui segfaultent
des qu'on les compile et execute sur un Unix, et qui tournent sans broncher
cote Linux.
Avatar
debug this fifo
Mickaël Wolff wrote:

caracteres valides, par exemple, ou encore cette idee saugrenue que les
pages de man, c'est du passe, et que info c'est mieux)...


Sur ces points je suis largement d'accord avec toi. Surtout que c'est
l'enfer de naviguer dans infos (désolé, je suis un Vimer).




un navigateur info a la mode lynx
https://alioth.debian.org/projects/pinfo/
Avatar
ld
On 24 nov, 22:21, TSalm wrote:
Merci à tous pour vos réponses.
Vu qu'il semble qu'il faut en passer par là, je vais déjà commencer par  
apprendre les Makefile.



Puisque c'est cette direction que vous avez choisi, jetez un oeil sur
la GNU Make Standard Library

http://gmsl.sourceforge.net/

Ca n'explique pas les fondements de make, mais plutot comment faire
des macros utiles.

a+, ld.
Avatar
Gabriel Dos Reis
James Kanze writes:

| On Nov 26, 8:49 am, Michael Doubez wrote:
| > On 25 nov, 18:16, James Kanze wrote:
| > [snip]
| > Il y a aussi les outils gnuwin32 (dont make) qui permettent
| > d'avoir les outils classics en win32 natif. Je les utilise
| > pour compléter mon install de MinGW avec sed, cat, wget ... et
| > même les expression [ - f ... ]. Le seul conflit que j'ai
| > trouvé avec Windows est avec echo et find.
|
| En effet.
|
| En général, les ports plus ou moins complets des outils Unix
| (CygWin, MinGW) s'integrent mal dans Windows, et posent des

Je n'ai pas de problème particulier avec MSYS/MinGW -- c'est une
plateforme de cross-compilation qui remplit largement son but. Il n'a
aucune prétention de fournir POSIX.

| problèmes quand on veut se servir aussi des programmes Windows.
| Tandis que les ports plus ou moins indépendants de chaque outil
| n'ont pas ce problème.

-- Gaby
Avatar
Gabriel Dos Reis
Mickaël Wolff writes:

[...]

| > Le principe d'Unix, c'est d'avoir des petits outils qui se comportent
| > bien entre eux.
| Je suis bien d'accord sur la philosophie Unix, mais en quoi le flag
| i de GNU sed contrevient à cette règle ?

ou celui de Perl.

-- Gaby
1 2 3 4 5