Bonjour,
Je viens de rendre un peu plus propre l'arborescence d'un projet en C sur lequel je travaille et j'ai des difficultés pour réaliser mon makefile.
L'arborescence est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
include
src
    gps_frames.c
    main.c
    post_send.c
    sender.c
obj
Où include contient les headers, src les .c et obj doit contenir les .o qui seront utilisés pour créer l'exécutable main, situé à la racine.

trève de bavardages, je poste le makefile, ce sera plus clair :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CC=gcc
CFLAGS=-W -Wall -std=c99 -Iinclude
LDFLAGS=
EXEC=main
INC=include
SRC_DIR=src
OBJ_DIR=obj
SRC=$(wildcard $(SRC_DIR)/*.c)
OBJ=$(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
 
all:$(EXEC)
 
$(EXEC):$(OBJ)
	$(CC) -o $@ $< $(LDFLAGS) $(CFLAGS)
 
$(OBJ):
	$(CC) -c $^ -o $@
 
clean:
	rm -f $(OBJ)
 
mrproper:clean
	rm -f $(EXEC)
 
.PHONY:clean all mrproper
Pour l'instant la règle $(OBJ) est bien sûr débile , mais c'est justement celle là que je n'arrive pas à écrire.
Apparemment, $(OBJ): crée une règle par fichier objet, je voudrais qu'à chaque règle, la dépendance soit sur le fichier .c correspondant et ça, j'y arrive pas. J'ai essayé avec la variable $@ mais dès que j'essaye de la modifier, (par exemple avec patsubst) j'obtiens un résultat vide.

Par exemple pour la règle obj/gps_frames.o, je voudrais créer une dépendance en remplaçant obj ($(OBJ)) par src ($(SRC)) et .o par .c ce qui doit donner obj/gps_frames.o:src/gps_frames.c.

Ça doit bien être possible, mais p****n je me casse les dents dessus !!!

Merci d'avance !

PS: Bien sûr je pourrai créer chaque règle à la main, mais le projet va pas mal évoluer, il risque d'y avoir pas mal de fichiers sources et je voudrai que tout soit facilement maintenable.

[Edit] J'ai eu beaucoup de mal à savoir où poster, et je ne suis pas convaincu que cette section soit la meilleure, n'hésitez pas à déplacer si je me suis planté ! Merci.