Pregunta

En un problema reciente , descubrí que DJGPP solo puede acepte el límite de caracteres de la línea de comandos de DOS. Para evitar esta limitación, he decidido intentar escribir un archivo MAKE que me permita pasar cadenas más largas . En el proceso de hackear un archivo MAKE y probarlo, me encontré con un extraño error. El archivo MAKE es el siguiente:

AS  :=  nasm
CC  :=  gcc
LD  :=  ld

TARGET      :=  $(shell basename $(CURDIR))
BUILD       :=  build
SOURCES     :=  source

CFLAGS  :=  -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions \
            -nostdinc -fno-builtin -I./include
ASFLAGS :=  -f aout

export OUTPUT   :=  $(CURDIR)/$(TARGET)

CFILES      :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
SFILES      :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))

SOBJS   :=  $(SFILES:.s=.o)
COBJS   :=  $(CFILES:.c=.o)
OBJS    :=  $(SOBJS) $(COBJS)

build   :   $(TARGET).img

$(TARGET).img   :   $(TARGET).bin
    concat.py

$(TARGET).bin   :   $(OBJS)
    $(LD) -T link.ld -o $@ $^

$(SOBJS)    :   %.o :   %.asm
    $(AS) $(ASFLAGS) $< -o $@

$(COBJS)    :   %.o :   %.c
    $(CC) -c $< $(CFLAGS) -o $@

Cuando intento ejecutarlo, recibo este error:

make: *** No rule to make target `consoleio.c', needed by `consoleio.o'.  Stop.

Lo que no entiendo es por qué está tratando de encontrar una regla para los archivos .c. Por lo que entiendo, si el archivo está allí, debería usarlo. ¿Cómo hago para que make no necesite una regla para archivos .c?

¿Fue útil?

Solución

Lo que está intentando hacer no funcionará sin VPATH, y dado que todavía está aprendiendo makefiles, evitaría usar VPATH.

La regla está buscando " consoleio.c " ;, que si entendí su archivo MAKE correctamente no existe; lo que existe es " source / consoleio.c " ;. Probablemente debería cambiarlo a algo como & Quot; $ (SOURCES) /%. C & Quot; en lugar de "% c " ;.

Sin embargo, no revisé su sintaxis para esa regla. Si es incorrecto, el & Quot;%. O:% .c & Quot; se usará la regla en su lugar, lo que tendría el mismo problema.

Sin embargo, la forma en que lo estás haciendo no es la forma habitual que he visto. La forma habitual es:

  • Crear una regla implícita "%. o:% .c " (o en su caso "%. o: $ (FUENTES) /%. c ")
  • Lista explícita de las dependencias para cada archivo: " foo.o: foo.c bar.h baz.h " (sin comando, la regla implícita tiene el comando)

Otros consejos

Probemos una respuesta sin comentarios ...

Posibilidad A:

  • Su macro para SFILES está buscando archivos que terminen en '.s'.
  • Su regla para compilar SOBJS es buscar archivos que terminen en '.asm'.

Posibilidad B:

  • Su regla para SOBJS y COBJS está en una notación que no reconozco.
  • Según el manual de GNU Make, puede escribir reglas implícitas como:

    % .o:% .c; comando

Parece que tiene una lista de objetivos $ (SOBJS) que depende de '%.o : %.asm'. No estoy seguro de cómo make interpretará eso.

Personalmente, no confiaría en los comodines en las reglas de compilación. Prefiero pasar el tiempo enumerando exactamente qué archivos de origen son necesarios para construir el código. A menudo no me encuentro con este problema como resultado.

@CesarB parece haber solucionado el problema, solo agregaré un par de observaciones.

  1. Recomiendo encarecidamente no usar comodines en las reglas de compilación. Las reglas de compilación deben definir claramente lo que se está construyendo, y no depender de qué archivos estén en el directorio.

  2. También recomendaría no usar VPATH a menos que esté (1) compilando en un directorio de compilación separado, o (2) tenga sus archivos fuente distribuidos en una gran cantidad de directorios. Si todas sus fuentes están en un solo directorio, usar VPATH solo va a confundir.

  3. El formulario de asignación: = generalmente solo se usa cuando se sabe que la evaluación de la variable lleva mucho tiempo, como cuando se usa $ (shell ...). De lo contrario, & Quot; = & Quot; es preferible.

  4. Usando " export " propagar OUTDIR a concat.py (que supongo que es, ya que concat.py no toma ningún parámetro) es un olor a código. Si es posible, páselo como parámetro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top