Bonsoir,

J'ai (enfin) un makefile qui fait ce que je veux, mais comme je ne maitrise par très bien le sujet, pouvez-vous me relire et m'indiquer mes erreurs ?


Mes erreurs certaines, que j'aimerais solutionner avec vous, sont :

1. L'endroit où je crée les dépendances est différent des exemples que j'ai pu trouver sur le net, mais je n'y arrive pas si je crée une règle '%d:%c' ou équivalent.

2. Compiler et générer les dépendances en une seule ligne.
Actuellement si je tente de le faire, j'obtiens bien un fichier de dépendances, et le fichier objet est créé, mais vide.


Je suis structuré ainsi en répertoires :

TEST (fichier makefile ici)
|-- src (fichiers .c et.h)
|-- obj (fichiers .o et .d)
|-- bin (fichier .so final)


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
HIDE	= @
NAME	= Test
BINEXT	= .so
SRCDIR	= ./src/
OBJDIR	= ./obj/
BINDIR	= ./bin/
 
DEBUG	= -D_DEBUG			# DEBUG= 		 : remove debug.c in compilation
ifeq ("$(DEBUG)","")		# DEBUG=-D_DEBUG : add debug.c in compilation
EXCLUDE	= $(SRCDIR)debug
MODE="NOT "
endif
 
CC		= /usr/local/cross/gcc-3.3.4_glibc-2.3.2/arm-linux/bin/gcc
CFLAGS	= -std=c99 -W -Wall -O2 -fPIC -pedantic -finline-functions -Os
LDFLAGS	= -ldl -fvisibility=hidden -shared -lm
LINKER	= -Wl,--version-script=$(NAME)_so.map
 
SRCS	= $(filter-out $(EXCLUDE).c,$(wildcard $(SRCDIR)*.c))
SRCS_H	= $(filter-out $(EXCLUDE).h,$(wildcard $(SRCDIR)*.h))
OBJS	= $(addprefix $(OBJDIR),$(notdir $(SRCS:.c=.o)))
BIN		= $(addprefix $(BINDIR), $(NAME)$(BINEXT))
DEPS	= $(OBJS:.o=.d)
 
.PHONY: clean, install
 
all: pre-build main-build
 
pre-build:
	$(HIDE)echo "==== DEBUG in source code is $(MODE)included ====" 
 
main-build:
	$(HIDE)echo "==== sources compilation beginning... ===="
	$(HIDE)$(MAKE) --no-print-directory $(BIN)
 
$(BIN): $(OBJS)
	$(HIDE)echo "==== linking ... ====="
	$(HIDE)mkdir -p $(BINDIR)
	$(HIDE)$(CC) $(LDFLAGS) $(OBJS) -o $(BIN) $(LINKER)
 
-include $(DEPS)
 
$(OBJDIR)%.o: $(SRCDIR)%.c $(SRCDIR)%.h
	$(HIDE)mkdir -p $(OBJDIR)
	$(HIDE)echo "---- generating dependency $(OBJDIR)$*.d"
#	$(HIDE)$(CC) -MM -MF $(OBJDIR)$*.d -MT $(<F:.c=.o) -MT $(OBJDIR)$*.d $(CFLAGS) $<
	$(HIDE)$(CC) $(CFLAGS) -MM -MF $(patsubst %.o,%.d,$@) -MT $(OBJDIR)$*.o $<
	$(HIDE)echo "---- compilating object file $@"
	$(HIDE)$(CC) $(CFLAGS) -c $< -o $@ $(DEBUG)
 
clean:
	$(HIDE)$(RM) $(EXEC) $(OBJDIR)*.* $(DEPS)
Merci pour votre aide.