Makefile übersetzt immer alles

Gast #40733
Hi,

bei dem folgenden Makefile habe ich das Problem, dass stets alles
übersetzt wird. Die Make-Doku kenne ich mittlerweile fast auswendig.
Die Ursache für die unnötigen Programmabläufe habe ich leider bis jetzt
noch nich entdecken können. Für einen Tip wäre ich sehr dankbar.

mfg

Peter


# AVR-GCC Makefile
#**************************************************************
.SUFFIXES:
.SUFFIXES:  .S .c .o .cof .elf .eep .rom

#--- define some variables based on the AVR base path in $(AVR)
CC  = avr-gcc
AS  = avr-gcc
RM  = rm -f
RN  = mv
CP      = cp
BIN  = avr-objcopy
ELFCOF  = objtool
INCDIR  = .


INCLUDES = Standard_Include.h Zentrale_Types.h Zentrale_Common.h

OBJECTS = Zentrale_Main.o Zentrale_Lcd.o Zentrale_Common.o
Zentrale_Uart.o Zentrale_Rtc.o Zentrale_Can.o


#If all other steps compile ok then echo "Errors: none".
#Necessary for AVR Studio to understand that everything went ok.
DONE    = @echo Errors: none


#--- default mcu type
MCU = atmega16

#--- default compiler flags -ahlmsn
CPFLAGS = -g -Os -funsigned-char -funsigned-bitfields -fpack-struct
-fshort-enums -Wall -Wstrict-prototypes -mmcu=$(MCU)
-Wa,-ahlmsnd=$(<:.c=.lst)

#--- default assembler flags
ASFLAGS = -mmcu=$(MCU) -Wa,-mmcu=$(MCU),-gstabs

#--- default linker flags
LDFLAGS = -Wl,-Map=$(<:.o=.map),--cref -mmcu=$(MCU)

#--- output format can be srec (Motorola), ihex (Intel HEX)
ROMFORMAT   = ihex  #<========== wichtig, Zentrale_Main.rom ist ein
Hexfile !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
EEPROMFORMAT    = ihex              # AVR Studio needs Intel HEX
format


#--- compile: instructions to create assembler and/or object files from
C source
%o : %c
  $(CC) -c $(CPFLAGS) -I$(INCDIR) $< -o $@

%s : %c
  $(CC) -s $(CPFLAGS) -I$(INCDIR) $< -o $@


#--- assemble: instructions to create object file from assembler
source
%o : %S
  $(AS) -x assembler-with-cpp $(ASFLAGS) -I$(INCDIR) -c $< -o $@


#--- link: instructions to create elf output file from object files
%elf:  %o
  $(CC) $^ $(LIB) $(LDFLAGS) -o $@

#--- create AVR Studio cof file from elf output file and map file
#%cof: %elf
#  $(ELFCOF) loadelf $^ mapfile $(<:.elf=.map) writecof $@

#--- create flash and eeprom bin file (ihex, srec) from elf output
file
%rom: %elf
  $(BIN) -O $(ROMFORMAT) -R .eeprom $< $@

#%eep: %elf
#  $(BIN) -j .eeprom --set-section-flags=.eeprom="alloc,load"
--change-section-lma .eeprom=0 -O $(EEPROMFORMAT) $< $(@:.elf=.eep)

#If all other steps compile ok then echo "Errors: none".
#Necessary for AVR Studio to understand that everything went ok.
#%ok:
#  $(DONE)
#  @echo "Errors: none"



# .PHONY  : begin
# begin:  all

.PHONY  : all


#.phony:  clean
#clean:
#  $(RM) *.rom
#  $(RM) *.eep
#  $(RM) *.cof
#  $(RM) *.elf
#  $(RM) *.o
#  $(RM) *.lst
#  $(RM) *.map


#----------------------------------------------------------------------- 
-----------------


#--- this defines the aims of the make process
all:  Zentrale_Main.rom
  $(DONE)

Zentrale_Main.rom:  Zentrale_Main.elf

Zentrale_Main.elf:  $(OBJECTS)



Zentrale_Main.o:  Zentrale_Main.c $(INCLUDES)

Zentrale_Lcd.o:    Zentrale_Lcd.c Zentrale_Lcd.h $(INCLUDES)

Zentrale_Common.o:  Zentrale_Common.c Zentrale_Common.h $(INCLUDES)

Zentrale_Uart.o:  Zentrale_Uart.c Zentrale_Uart.h $(INCLUDES)

Zentrale_Rtc.o:    Zentrale_Rtc.c Zentrale_Rtc.h $(INCLUDES)

Zentrale_Can.o:    Zentrale_Can.c Zentrale_Can.h $(INCLUDES)


#----------------------------------------------------------------------- 
-----------------
Gast
Die Abhängigkeit %elf: %o finde ich ziemlich lausig formuliert.
Überhaupt ist mir nicht so ganz klar, warum die Leute offenbar
den GNUismus %foo: %bar anstelle der generischen Variante
mittels .SUFFIXES und .foo: .bar bevorzugen.

Ansonsten sollte es irgendwelche Debug-Optionen geben, die Dir die
Abhängigkeitsbehandlung der einzelnen Targets näher erläutern.
Gast
Hallo Joerg,

Deine philosophischen Betrachtungen haben mir leider nicht weiter
geholfen. Die Debug - Möglichkeiten hatte ich bereits vorher genutzt.
Meldungen wie: pruning xxx.c, xxx.c older than xxx.o waren mir
allerdings unerklärlich, da die C-Files einen älteren Timestamp
aufwiesen als die O-Files.

Die Lösung war aber an sich ganz einfach:
make muss in diesem Fall nicht mit make sondern mit make all aufgerufen
werden und schon werden die Abhängikeiten korrekt bearbeitet.

mfg

Peter
Gast
Verstehe zwar nicht warum (ich hatte versucht herauszufinden, ob
"all:" nicht das erste Target ist), aber das ist ein bißchen die
Folge dieses ``obfuscated'' Makefiles: man weiß gar nicht so recht,
was nun wirklich das default target ist...  Offenbar ist es aus
irgendwelchen Gründen nicht "all", aber ich finde es auch nicht
raus (das Webformular zerschrummst das Makefile hinreichend -- Du
hättest es besser als Upload machen sollen).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.