Makefile avec sous-dossiers

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

Bonjour,

J’essaye de faire un makefile pour compiler un projet C qui a l’architecture suivante :

.
|- src
   |- bind
      |- main.c
      |- matrix
         |- matrix.c
         |- matrix.h
      |- types
         | base.h

Voici ce que j’ai essayé :

APP_NAME := app

C := gcc
CFLAGS := -Wall -Wextra -std=gnu11

DEBUG ?= 1

ifeq ($(DEBUG), 1)
        CFLAGS += -DDEBUG -g
endif

BINDIR := bin
OBJDIR := obj
SRCDIR := src

SOURCES := $(shell find $(SRCDIR) -name "*.c")
OBJECTS := $(addprefix $(OBJDIR)/,$(shell echo $(notdir $(SOURCES)) | sed 's/\.c/\.o/g'))

$(BINDIR)/$(APP_NAME): $(OBJECTS) | $(BINDIR)
        @$(CC) -o $@ $^

$(OBJDIR)/%.o: %.c | $(OBJDIR)
        @$(CC) $(CFLAGS) -c -o $@ $<

$(BINDIR) $(OBJDIR):
        @mkdir $@

clean:
        @rm -rf $(OBJDIR)/*

mrpropre: clean
        @rm -rf $(BINDIR) $(OBJDIR)

.PHONY: clean mrpropre

Ce que je souhaiterai avoir c’est l’ensemble de mes fichiers objets dans un dossier obj à la racine et l’exécutable dans un dossier bin.

Soit :

.
|- obj
   |- main.o
   |- matrix.o
|- bin
   |- app

Ou alors

.
|- obj
   |- bind
      |- main.o
      |- matrix
         |- matrix.o
|- bin
   |- app

Je préfère la seconde solution comme ça me permettrai d’avoir des fichiers .c avec potentiellement le même nom dans des modules différents.

Sauriez-vous comment je pourrais le faire ?

Merci à vous.

Salut,

Tu peux y arriver en apportant quelques modifications à ton Makefile :

  1. Remplacer la ligne de définition des objets pour simplement modifier le répertoire racine

    OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
    
  2. Adapter le fichier source dans la règle $(OBJDIR)/%.o et créer le répertoire cible

    $(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
            @mkdir -p `dirname $@`
            @$(CC) $(CFLAGS) -c -o $@ $<
    
mrpropre: clean

:lol:

À la ligne 3 il te manque un C:

CC := gcc

Je suppose que c’est une erreur de recopie.

+1 -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