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 :
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
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
Partager