2010-07-02 7 views
7

Je compile des paquets et je vois que souvent les auteurs de Makefile écrivent set CFLAGS dans le makefile, avec telle ou telle option. Je, d'un autre côté, voudrait essayer quelques optimisations de compilateur et voudrait propager les commutateurs de compilateur pour faire avec le moins de problème possible. Ce n'est pas toujours faisable. Par exemple quand un makefile spécifie CFLAGS et je veux que toutes les invocations du compilateur C utilisent -fomit-frame-pointer, sans avoir à écrire explicitement quelque chose comme CFLAGS=-fomit-frame-pointer make, quelles sont mes options qui ne sont pas hackish. D'après ce que je peux voir il y a ce qui précède, alors il est le même mais différent make "CFLAGS=-fomit-frame-pointer" et je peux aussi faire ce que je considère être la meilleure solution et la raison de cette question:Pourquoi les variables d'environnement ne remplacent-elles pas les variables définies dans les fichiers makefiles par défaut?

export CFLAGS=-fomit-frame-pointer 
make -e 

Je considère que ce le meilleur un, car franchement même pensé drapeau potentiellement dangereux, je ne débogage pas beaucoup de logiciels, et quand j'ai besoin de je peux recompiler un morceau particulier à la demande, avec des informations de débogage et tout. Sinon, j'aime travailler avec un logiciel de version sans avoir à déboguer les cloches et les sifflets, surtout si le paquet n'est pas écrit par moi. Donc je suppose que ce que je demande ici spécifiquement est: pourquoi make ne préfère pas automatiquement les variables d'environnement à makefile? Après tout l'environnement sait mieux quoi faire, et dans le cas où l'auteur a vraiment besoin de quelque chose, il y a la syntaxe 'override', n'est-ce pas?

+0

Il ya un paramètre à faire: --environment-overrides qui fait ce que vous décrivez, je pense, donc vous pourriez être en mesure de faire cela par défaut "wrapping" make avec un script qui appelle real make avec --environment -overrides FWIW – rogerdpack

Répondre

5

Ce pourrait soutenir: « Après tout environnement connaît le mieux ce qui est ce »

Il est comme dire « mère connaît le mieux » à un tout grandi enfant et les empêcher d'aller étudier le droit parce que vous vouliez voir quel genre de plombier ils seraient. C'est leur vie. Laissez aller et laissez-les faire leur choix pour eux-mêmes.

Oh, attends, tu posais des questions sur l'environnement et la marque. Droite. Eh bien, make est un nouveau processus qui commence après que vous avez modifié votre environnement et dans le cas général, l'environnement ne sait pas ce que sont les objectifs make et comment cela fonctionne. Donc, peu importe ce qui fait explicitement doit devrait trump tout ce qui peut arriver dans l'environnement.

Mise à jour: Il y a un argument que j'ai manqué à l'origine dans ma réponse - la prévisibilité. La seule exigence devrait être la présence d'un ensemble normalisé d'outils (même version de GCC, mêmes librairies), et sachant qu'un fichier make correctement écrit devrait toujours produire le même résultat, quel que soit l'environnement ou les autres outils présents .

+1

Alors comment sommes-nous censés remplacer les commutateurs du compilateur pour les logiciels construits par make? Je veux dire d'une manière respectueuse de l'environnement? :-) Sûrement on voudrait contrôler les optimisations? Vous ne pouvez pas décider à ce sujet. Si quoi que ce soit, un fichier makefile qui code en dur CFLAGS/CXXFLAGS/CPPFLAGS et NE permet PAS de les changer, n'est pas bien conçu? – amn

+1

Vous modifiez le fichier makefile ou vous les remplacez en passant les indicateurs appropriés en tant que paramètres de ligne de commande lorsque vous appelez make. écraser ceux-ci dans ce cas est une action _explicit_ de l'utilisateur. l'obtention de tout ce qui se passe dans l'environnement peut entraîner des résultats imprévisibles, car l'utilisateur peut même ne pas savoir quelles modifications de l'environnement le programme précédent a utilisé –

+0

Eh bien c'est tout mon argument - que l'environnement connaît le mieux. Ou au moins devrait, avec un Makefile correctement conçu. D'où l'implication que si le Makefile casse sur une variable d'environnement, ce n'est pas bon. Si un auteur a vraiment besoin de son commutateur de compilation '-g', et craint que l'utilisateur de makefile ne le fasse pour autre chose, il devrait peut-être utiliser la syntaxe "override", ou l'assignation de second niveau ": ="? Passer des drapeaux de ligne de commande à faire n'est pas une bonne option lorsque vous construisez tout un ensemble de paquets .... – amn

16

va remplacer les variables si vous les mettez sur la ligne de commande make.

Essayez ceci: make CFLAGS=-fomit-frame-pointer

Un mot d'avertissement. La plupart des Makefiles n'attendent pas que leurs variables soient surchargées. Cela signifie que si le fichier Makefile utilise CFLAGS pour spécifier -I pour les fichiers d'inclusion, -O2 pour l'optimisation ou d'autres indicateurs, vous devez les ajouter à votre remplacement CFLAGS sinon le make échouera probablement.

Questions connexes