Bonjour,

je suis sur un projet d'application (jusque là logique).

j'ai pris l'habitude de ranger mes fichiers de façon logique, c'est à dire de cette manière :

-Makefile
-src/+
|-*.c
-inc/+
|-*.h
-obj/+
|-*.o
-lib/+
|-*.a

voici mon Makefile :
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
################################################################################
################################################################################
#                Zone a personnaliser                   #
################################################################################
################################################################################
## Debug ? ##
DEBUG    = yes
 
## Sources files ##
SRC    = main.c
 
 
################################################################################
################################################################################
#             /!\ Zone a ne pas toucher /!\                   #
################################################################################
################################################################################
## Directories ##
DSRC    = ../src
DINC    = ../inc
DLIB    = ../lib
 
## Files ##
OBJ    = ${SRC:.c=.o}
INC    = ${SRC:.c=.h}
 
## Compil paths ##
IPATH    = -I${DINC} -I.
LPATH     = -L${DLIB}
 
## Librairies utilisees ##
LIBS    = -lma_lib
 
## Flags ##
WFLAGS    = -W -Wall -Wstrict-prototypes -ansi -pedantic
.if ${DEBUG} == yes
OPTI    = -g
.else
OPTI     = -O3
.endif
CFLAGS    = ${WFLAGS} ${OPTI} ${IPATH}
LDFLAGS    = ${LPATH} ${LIBS}
 
## Binary used in Makefile ##
CC    = gcc
RM    = rm -f
COMP    = gzip -f
UNCOMP    = gunzip -f
 
## Gestions des couleurs ##
RED    = printf '\033[0;31;40m'
GREEN    = printf '\033[0;32;40m'
YEL    = printf '\033[0;33;40m'
BLUE    = printf '\033[0;34;40m'
CYAN    = printf '\033[0;35;40m'
TURQ    = printf '\033[0;36;40m'
WHITE    = printf '\033[0;37;40m'
 
## Gestion des erreurs ##
ERR    = ../.ccerr
 
## Targets ##
TARGET     = asm
 
all     : ${TARGET}
    @${GREEN}; echo; echo "Errors & Warnings: "
    @${RED};
    @cat ${ERR};echo
    @echo -n > ${ERR}
 
${TARGET} : ${OBJ}
    @${YEL}
    @echo "--------------------------------------------------------------------------------"
    @echo -n "Link edition : "
    @(((${CC} -o ../$@ ${OBJ} ${LDFLAGS}) 2>> ${ERR} && ${GREEN} && echo -n "DONE  ") || (${RED}; echo -n "FAILED"))
    @${YEL} && echo -n " ==> [" && ${WHITE} && echo -n "$@" && ${YEL} && echo "]"
 
 
${OBJ}     : ${SRC} ${INC}
    @${YEL}
    @echo -n "Compilation  : "
    @(((${CC} -c ${DSRC}/$< ${CFLAGS}) 2>> ${ERR}) && ${GREEN} && echo -n "DONE  ") || (${RED}; echo -n "FAILED")
    @${YEL} && echo -n " ==> [" && ${WHITE} && echo -n "$<" && ${YEL} && echo "]"
 
${SRC}     : ${INC}
 
${INC}    :
 
## Regles de nettoyage ##
clean     :
    @${YEL};echo -n "Cleaning .... "
    @${RM} *~
    @${RM} \#*
    @${RM} *.o
    @${RM} ../*~
    @${RM} ../\#*
    @${RM} ${DSRC}/*~
    @${RM} ${DSRC}/\#*
    @${RM} ${DINC}/*~
    @${RM} ${DINC}\#*
    @${GREEN}; echo "DONE"
 
fclean     : clean
    @${YEL};echo -n "Cleaning of ${TARGET} "
    @${RM} ${TARGET}
    @${GREEN}; echo "DONE"
 
re     : fclean all
 
## Regles de compressiond des fichiers sources ##
comp    : clean
    ${COMP} ${SRC} ${INC}
 
uncomp     : 
    ${UNCOMP} ${SRC} ${INC}
Petite précision, je suis sous FreeBSD, et l'un des mécanisme des Makefiles sous FreeBSD est de se placer dans le répertoire obj/ s'il existe.

Mon problème étant que lorsque je fais la règle .c.o ou ${OBJ}:${SRC}, il ne sait pas regarder dans le bon répetoire (logique parce que je mets les noms des fichiers sans le répertoire. Cependant, je ne peux pas le mettre au nom des fichiers parce que sinon a cause de la règle
je me retrouverais avec les .o dans le dossier src/ ...

Y a-t-il un moyen de faire en sorte de changer le .c en .o mais aussi le src/ en obj/, du style
Code : Sélectionner tout - Visualiser dans une fenêtre à part
OBJ=${SRC:src/*.c=obj/*.o}
J'ai déjà vu cette forme, mais je n'arrive pas à la retrouver...

Merci d'avance de m'aider