2009-01-29 7 views
4

Quelqu'un peut-il m'aider à trouver le fichier make suivant?Que signifient ces constructions Makefile?

BINS=file1 file2 file3 

all: $(BINS) 

clean: 
     rm -f $(BINS) *~ 

$*: [email protected] 
     gcc -g -o [email protected] $? 

Voici mes questions:

  1. Quelle est l'option -g de gcc?
  2. Quels sont $ * et $ @
  3. Comment sait-il exécuter la dernière cible?

Merci!

+0

Vous devriez. donner à cette question un meilleur nom. –

+0

C'est tout le makefile? $ * comme cible est assez étrange – Quassnoi

Répondre

5

De l'gcc et make documentation:

  1. "-g Produire des informations de débogage au format natif du système d'exploitation".

  2. a. "$ * La racine avec laquelle une règle implicite correspond (voir How Patterns Match.) Si la cible est dir/a.foo.b et que le motif cible est un.% .b alors la racine est dir/foo. Dans une règle de modèle statique, la racine fait partie du nom de fichier qui correspond au '%' dans le modèle cible. "

    b. "$ @ Le nom de fichier de la cible de la règle Si la cible est un membre d'archive, alors '$ @' est le nom du fichier d'archive Dans une règle de modèle qui a plusieurs cibles (voir Introduction aux règles de modèle), '$ @' est le nom de la cible qui a provoqué l'exécution des commandes de la règle. "

    c. "$? Les noms de tous les prérequis qui sont plus récents que la cible, avec des espaces entre eux." (Pas demandé, mais il vaut la peine d'ajouter.)

  3. "'all' Compile le programme complet, qui devrait être la cible par défaut."

Cet exemple de fichier makefile est un peu limité, car il semble ne construire que des programmes C. Le GNU make a plusieurs exemples plus complets qui sont utiles pour apprendre à écrire des fichiers makefiles.

1
+1

RTFM n'est pas vraiment une réponse utile. –

+0

Apprenez à pêcher ... – nicerobot

+1

Une documentation technique comme celle-ci peut être assez opaque. Apprendre les bases de faire à travers la documentation est sur la façon la plus difficile que je puisse penser. –

2

1.) Qu'est-ce que l'option -g de gcc?

Generate informations de débogage

2.) Quels sont $ * et $ @

$* est la tige de la règle.Lorsque vous faites règle comme

%.ext: %.otherext 
    ext2otherext --input $? --output [email protected] --logfile $*.log 

, et la règle tente de faire file.ext de file.otherext, puis de se connecter va à file.log

[email protected] est le nom du fichier cible (file.ext dans le cas ci-dessus).

3.) Comment sait-il exécuter la dernière cible?

Ceci est un mystère.

$* est utilisé pour les fichiers intermédiaires: comme, lorsque vous essayez de faire une %.so sur %.c, vous aurez besoin d'un %.o intermédiaire qui est ni cible ni source. Vous mettez:

%.so: %.c 
    gcc -fPIC -g -c -o $*.o $? 
    ld -shared -o [email protected] $*.o 

En d'autres termes, dans une règle %.extension, $* est tout sauf le .extension.

En tant que cible, $* n'a aucun sens. Etes-vous sûr que cette règle est effectivement exécutée quelque part?

Lorsque je tente de le reproduire en utilisant votre Makefile, il applique des règles par défaut (cc -o) au lieu de gcc -g -o

Règle dont vous avez besoin semble être:

%: %.c 
    gcc -g -o [email protected] $? 
+0

Je suis curieux de savoir si le fichier makefile fonctionne, mais je suis trop paresseux pour l'essayer. As tu? –

+0

Oui, je l'ai fait, ça ne marche pas :) Il fait en fait, mais utilise des règles par défaut au lieu de gcc -g. – Quassnoi

0

Q1 et Q2 ont été répondu largement déjà, une brève explication pour Q3 seulement:

Make exécute toujours la première cible sauf si vous en avez spécifié une autre. Ceci est également appelé la cible par défaut. Habituellement, la cible par défaut est appelée "tous".

1

La première ligne fait exactement ce que vous attendez en la regardant - elle crée une liste de noms et l'attribue à BIN. Ensuite, une cible de création appelée all est définie, qui dépend des cibles répertoriées dans $BIN (all ne peut pas être généré avant que chaque cible de $BIN ne soit créée). all est une cible de construction spéciale; Si vous exécutez simplement make plutôt que, disons, make clean, la cible all est automatiquement créée. Il n'y a aucune commande réelle associée à all - il s'assure simplement que toutes ses dépendances sont construites. La dernière commande assez simple définit une cible de construction appelée clean, qui supprime chaque fichier répertorié dans $BIN (notez que $BIN est utilisé à la fois comme une liste de cibles de construction et une liste de fichiers dans ce fichier Make) et toutes les sauvegardes.

Ensuite, nous arrivons à une ligne qui est, fondamentalement, magique. $* est une cible de construction spéciale qui signifie "tout ce qui n'est pas spécifiquement défini". Lorsque make essaie de générer all, il trouve la cible et commence à travailler sur ses dépendances. Mais quand il essaie de construire file1, il n'y a pas de cible explicite définie. Au lieu de cela, il utilise $* pour construire file1. De même, [email protected] est remplacé par le nom de la cible de construction, et $? avec ses dépendances (en quelque sorte, il vaut mieux vérifier le manuel pour).Quand make va construire file1, alors, la règle $* l'amène à se comporter comme si la règle suivante ont été définis:

file1: file1.c 
     gcc -g -o file1 file1.c 

Enfin, l'option -g permet simplement des informations de débogage à compiler dans

+0

$ * n'est pas une cible de construction spéciale, ce n'est pas une cible du tout. – Quassnoi

Questions connexes