2 votes

make ne trouve pas les règles pour faire la cible (débutant sur la génération manuelle du fichier makefile)

J'ai le makefile suivant que j'ai essayé de construire à partir d'un tutoriel. Puis j'ai (pensé) avoir ajouté les sources nécessaires afin de l'adapter à mon code mais il ne trouve pas la cible. Je pense que cela peut avoir un rapport avec la structure du dossier des sources, mais je n'arrive pas à le comprendre.

SVN_REV=(svnversion -cn | sed -e 's/.*://' -e 's/\([0-9]*\).*/\1/' | grep '[0-9]')

DEBUG_OPTS:=-g  -DSVN_REV \
            -DDEBUG_MODE \
            -UTIME_MODE \
            -UREADFROMFILE 

CFLAGS:=$(DEBUG_OPTS) -c -Wall 
LDFLAGS:=$(DEBUG_OPTS) -lpthread 

EXECUTABLE:=fw_board
COMPILER:=arm-linux-gcc

(le makefile se poursuit ci-dessous, il y a les emplacements des fichiers src vus depuis le TOPDIR)

SOURCES:=main_process/main.c \
      ezxml/ezxml.c \
      info_file_parser/info_file_parser.c \
      info_file_parser/array_management.c \
      info_file_parser/protocol_file_parser.c \
      info_file_parser/sequence_file_parser.c \
      info_file_parser/topology_file_parser.c \
      seq_exec_module/seq_execution.c \
      i2c_device_drivers/pca950x.c \
      i2c_device_drivers/ltc2495.c \
      i2c_device_drivers/ltc2609.c \
      i2c_device_drivers/temperature_uc.c \
      i2c_device_drivers/pcf8574.c \
      i2c_device_drivers/stepper_motor_control.c \
      i2c_device_drivers/test_functions.c \
      i2c_device_drivers/stepper_pca.c \
      i2c_device_drivers/stepper_atmega.c \
      i2c_device_drivers/general_i2c.c \
      i2c_device_drivers/zx_mbd_pwr.c \
      i2c_device_drivers/virtual_switch_handler.c \
      i2c_device_drivers/pressure_sensor_ASDXAV030PG7A5.c \
      hashing/ConfigData.c \
      hashing/Hash.c \
      hashing/LinkedList.c \
      init_file_parser/init_file_parser.c \
      usb_communication/serial_comm.c \
      protocol_parser/protocol_parser.c 

BINDIR:=bin
OBJDIR:=.obj
OBJECTS:=$(addprefix $(OBJDIR)/,$(SOURCES:%.c=%.o))

.PHONY: all
all: $(SOURCES) $(EXECUTABLE)
    @echo all_start

c'est l'étape de liaison

$(EXECUTABLE): $(OBJECTS) | $(BINDIR)
    @echo link
    $(COMPILER) $(LDFLAGS) $(OBJECTS) -o $(BINDIR)/$@

et l'étape de compilation. mais main.c ne peut être localisé comme vous le verrez

$(OBJECTS): $(OBJDIR)/%.o : %.c | $(OBJDIR)
    @echo compile
    $(COMPILER) $(CFLAGS) $< -o $@

$(OBJDIR):
    mkdir $(OBJDIR)

$(BINDIR):
    mkdir $(BINDIR)

.PHONY: clean
clean:
    @echo removing_files
    rm -rf $(OBJECTS) $(BINDIR)/$(EXECUTABLE)

running make renvoie ce qui suit :

make: *** No rule to make target `main_process/main.c', needed by `all'.  Stop.

3voto

AlastairG Points 1795

N'indiquez pas les sources comme une dépendance de tous.

all : dépend de $(EXECUTABLE). Par ailleurs, la sortie de l'écho n'aura lieu (si elle a lieu) qu'APRÈS que $(EXECUTABLE) ait été construit.

$(EXECUTABLE) : dépend de $(OBJECTS)

Je ne sais pas exactement ce que fait la syntaxe de votre règle $(OBJECTS), mais il n'est pas nécessaire d'avoir une règle explicite sur $(OBJECTS). Il suffit que le $(OBJECTS) liste tous les fichiers objets et qu'une règle les génère à partir des fichiers C.

Avec toutes ces règles, "all :" est implicitement dépendant des sources de toute façon. De plus, "all :" est une règle "bidon", donc elle reconstruira toutes les dépendances à chaque fois.

Le chemin main_process/main.c doit exister relativement au répertoire qui contient le makefile.

Réparez tout ça et vous devriez être prêt à partir.

0voto

thiton Points 21303

Je ne peux pas voir où exactement votre make s'est trompé sans beaucoup d'informations sur votre environnement de construction, mais vos meilleurs paris sont :

  1. Utilisez make -d pour vous montrer où les choses se sont mal passées. Si vous n'utilisez pas de règles implicites, make -rd est plus concis.
  2. Utilisez automake pour éviter d'écrire un Makefile du tout.

En principe, si le fichier main_process/main.c existe, il devrait être compilé. Avez-vous essayé un ls avec exactement le même nom ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X