Makefile et sensibilité à la case

Est ce que dans un Makefile on a une reelle difference entre la majuscule et la minuscule

Le problème exposé dans ce sujet a été résolu.

Salut à tous et à toutes. :)

Je débute avec les Makefile et suite à des expériences dans un Makefile, je me retrouve perturbé.

Pour la mise en situation, j’ai un petit projet constitué de 4 fichiers : main.c, point.c, point.h et un Makefile. Le contenu du Makefile est comme suit.

Prog : main.o point.o
	gcc -o Prog main.o point.o

MAIN.o : 
	gcc -o main.o -c main.c
	
point.o : point.c
	gcc -o point.o -c point.c

En exécutant make dans l’invite de commande, j’arrive à produire l’exécutable. Je ne comprends pas pourquoi cela fonctionne puisque (si je ne me trompe pas) les fichiers main.o et point.o n’existent pas encore au tout début de l’exécution de make et par conséquent font référence à des labels (cibles) à exécuter.

La cible point.o est bien présente dans le Makefile, mais au lieu de la cible main.o, on retrouve la cible MAIN.o. J’ai l’impression que l’outil make ne fait pas de différence entre la majuscule et la minuscule. Après de longues heures de recherche, je n’ai trouvé aucune information qui confirme mon impression et encore moins aucune qui l’infirme.

Je voudrais, s’il vous plaît, avoir vos retours par rapport à ce comportement et des suggestions pour rédiger un bon Makefile.

J’utilise la version 3.81 de GNU Make

Merci d’avance pour vos retours. :)

Quels fichiers .o se retrouvent dans ton dossier ?

Je dirais que make utilise en fait ici les règles implicites qu’il connaît : pour construire Prog, il faut main.o, pas de règle dans le Makefile pour construire main.o, mais make sait que pour construire un fichier .o, il faut exécuter une commande similaire à ce qui est déclaré pour construire MAIN.o.

Tu peux essayer de remplacer la ligne 5 gcc -o main.o -c main.c par echo "toto" et observer si toto s’affiche ou pas.

+2 -0
$ info make
[...]
   Variable names are case-sensitive.  The names 'foo', 'FOO', and 'Foo'
all refer to different variables.

   It is traditional to use upper case letters in variable names, but we
recommend using lower case letters for variable names that serve
internal purposes in the makefile, and reserving upper case for
parameters that control implicit rules or for parameters that the user
should override with command options (*note Overriding Variables:
Overriding.).
[...]
Compiling C programs
     'N.o' is made automatically from 'N.c' with a recipe of the form
     '$(CC) $(CPPFLAGS) $(CFLAGS) -c'.

Compiling C++ programs
     'N.o' is made automatically from 'N.cc', 'N.cpp', or 'N.C' with a
     recipe of the form '$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c'.  We
     encourage you to use the suffix '.cc' or '.cpp' for C++ source
     files instead of '.C' to better support case-insensitive file
     systems.
[...]

Au sujet des cibles, je suppose que sur un système sensible à la casse, alors Make l’est également et inversement. Mais il faudrait le vérifier.

+1 -0

Salut salut :)

Merci pour vos retours.

@philippemilink :

  • Au tout début, avant l’exécution du Makefile, il n’y a aucun fichier .o dans mon dossier. Ce n’est qu’après exécution qu’apparaissent les fichiers main.o et point.o.
  • En remplaçant la ligne 5 comme tu l’as suggéré, le mot toto est affiché dans l’invite de commande. Voici la sortie au complet:
echo "toto"
"toto"
gcc -o point.o -c point.c
gcc -o Prog main.o point.o
C:/x86_64-12.2.0-release-posix-seh-rt_v10-rev0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find main.o: No such file or directory
collect2.exe: error: ld returned 1 exit status
make: *** [Prog] error 1

@jo_link_noir: que j’entre make ou make VERBOSE=1 dans l’invite de commande, je n’observe aucune différence. Toutes les actions dont les cibles sont les dépendances de Prog s’affichent dans l’invite de commande. Voici la sortie :

gcc -o main.o -c main.c
gcc -o point.o -c point.c
gcc -o Prog main.o point.o

@ache: je pense qu’au sujet des cibles, tu as raison (au vue de l’experience proposée par @philippemilink). Et aussi, je pense que mon système n’est pas sensible à la case. Il m’est impossible d’avoir les fichiers main.c et MAin.c dans le même dossier. En plus de cela, pour lancer l’exécutable, que je tape Prog, PROG ou pROG ou même PROg.EXE (bref toutes les combinaisons possibles tant que l’ordre est intact), l’exécutable se lance. Et c’est la même chose pour MAKE, make, MakE etc …

Merci encor pour vos retous qui m’ont permis de voir un peu plus claire :)

Salut, sur DOS et du coup aussi sur Windows, le nom des fichiers est insensible à la casse. Il est possible que make soit rendu compatible avec les chemins Windows en ignorant aussi la casse dans le nom de ses cibles (à vérifier). Par contre, ce fichier makefile n’est pas forcément portable et il se peut qu’il ne fonctionne pas sur Linux qui dans mes souvenirs est sensible à la casse.

Je fais potentiellement des raccourcis entre systèmes d’exploitation et systèmes de fichiers, et que c’est NTFS et EXT4 et consort qui déterminent l’importance de la casse. Je laisse les experts préciser au besoin.

+1 -0

Hello,

Avec windows (toutes versions à ma connaissance), et en console également, la casse n’a pas la moindre importance, que ce soit pour les noms de fichier, de répertoires ou les identifiants de disques.

J’utilise make (GNU make 4.2) et pour lui aussi la casse n’a pas d’importance. Par contre, pour les variables style CC=…. , CC et Cc ne sont pas la même chose.

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte