Pergunta

Em um recente edição , descobri que DJGPP só pode aceitar o limite de caracteres de linha de comando DOS. Para contornar esta limitação, eu decidi tentar escrever um makefile para me permitir passar as cadeias mais longas . No processo de cortar juntos um makefile e testá-lo, eu me deparei com um erro estranho. O makefile é a seguinte:

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 $@

Ao tentar executá-lo, eu recebo este erro:

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

O que eu não entendo é por que ele está tentando encontrar uma regra para os arquivos .c. Pelo que eu entendo, se o arquivo estiver lá, ele deve apenas usá-lo. Como posso fazer make não precisa de uma regra para os arquivos .c?

Foi útil?

Solução

O que você está tentando fazer não funciona sem VPATH, e uma vez que você ainda está aprendendo makefiles, gostaria de evitar o uso de VPATH.

A regra está à procura de "consoleio.c", que se eu entendi o seu makefile corretamente não existe; o que existe é "fonte / consoleio.c". Você provavelmente deve alterá-lo para algo como "$ (fontes) /%. C" em vez de "% c".

Eu não verificar a sua sintaxe para essa regra, no entanto. Se for incorreta, o embutida "% .o:% .c". Regra será usada em vez disso, o que teria o mesmo problema

A maneira que você está fazendo não é a maneira usual que eu vi, no entanto. A maneira usual é:

  • Criar uma regra implícita "% .o:% .c" (ou no seu caso "% .o:. $ (Fontes) /% c")
  • lista explícita as dependências para cada arquivo: "foo.o: foo.c bar.h baz.h" (sem comando, a regra implícita tem o comando)

Outras dicas

Vamos tentar um não-comentário resposta ...

Possibilidade A:

  • O seu macro para SFILES está à procura de arquivos que terminam em '.s'.
  • Sua regra para compilar SOBJS está à procura de arquivos que terminam em '.asm'.

Possibilidade B:

  • A sua regra para SOBJS e COBJS está em uma notação que eu não reconheço.
  • De acordo com o GNU Make manual, você pode escrever regras implícitas como:

    % o:.% .C; comando

Você parece ter uma lista de alvos $ (SOBJS) que depende de '%.o : %.asm'. Eu não sei como fazer irá interpretar isso.

Pessoalmente, eu não confiar wild-cards em regras de compilação. Eu prefiro gastar o tempo listando exatamente quais arquivos de origem são necessários para construir o código. Eu não costumo correr para este problema, como resultado.

@CesarB parece ter pregado o problema, Vou apenas acrescentar algumas observações.

  1. Eu recomendo fortemente contra o uso de curingas em regras de compilação. As regras de compilação deve definir claramente exatamente o que está sendo construído, e não depender de quais arquivos acontecer de estar no diretório.

  2. Eu também recomendo contra o uso VPATH menos que você é (1) a construção de uma pasta de compilação separada, ou (2) ter seus arquivos de origem espalhadas por um grande número de diretórios. Se todas as suas fontes estão em um único diretório, usando VPATH só vai confundir.

  3. A: = forma de atribuição é normalmente usado somente quando a avaliação variável é conhecida a demorar muito tempo, como quando se usa um $ (shell ...). Caso contrário, "=" é preferível.

  4. Usando o "exportação" para propagar OUTDIR para concat.py (que eu presumo que é, desde concat.py não leva nenhum parâmetro) é um cheiro de código. Se possível, passá-lo como um parâmetro em vez disso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top