Forum: Compiler & IDEs WinAVR (GNU make): Problem mit dependency files


von Bertolt Mildner (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab ein Problem mit dem Erzeugen von Dependency Files sobald ich die 
Source Files auf Unterverzeichnise aufteile.

D.h.: wenn das Projekt Verzeichnis (wo auch das Make File liegt) z.B.: 
"C:\AVR\OpenCOS" ist und ich z.B.: auch in "C:\AVR\OpenCOS\I2C" C Files 
hab bekomme ich folgenden Fehler:

------------------------------------
makefile:199: OpenCOS.d: No such file or directory
set -e; avr-gcc -MM -DMCU_CLK=7372800  -g -Os -funsigned-char 
-fno-exceptions -f
unsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wa,-ahlms=I2C/I2C.lst -mmc
u=at90s8515 I2C/I2C.c \
| sed 's/\(I2C/I2C\)\.o[ :]*/\1.o I2C/I2C.d : /g' > I2C/I2C.d; \
[ -s I2C/I2C.d ] || rm -f I2C/I2C.d
sed: -e expression #2, char 23: Unknown option to 's'
I2C/I2C.c:6:21: I2C/I2C.h: No such file or directory
make: *** [I2C/I2C.d] Error 1
------------------------------------

Auch für C Files die im Project Verzeichnis liegen (z.B.: OpenCOS.c) 
wird dann kein .d File mehr erzeugt.

Ohne Aufteilung auf Unterverzeichnisse klappt alles prima!

Vielen Dank im Vorraus!

Bertolt

von Oryx (Gast)


Lesenswert?

Hallo Bertolt,

wie es scheint, liegt Dein Problem in folgender Zeile:

# List I2C module C source files here.
SRC_I2C= I2C/I2C.c

Wie soll der arme Compiler denn da den Pfad Deiner C-Datei kennen.
Versuch doch mal SRC_I2C=C:/AVR/OpenCOS/I2C/I2C.c

Evtl. mußt Du auch noch dem Linker mitteilen, wo das zweite Verzeichnis 
ist.

Sollte das nicht helfen, sende doch bitte ein zip-file von Deiner 
Verzeichnisstruktur, nur mit Dummy-Funktionen.

Oryx

von Bertolt Mildner (Gast)


Lesenswert?

@Oryx:

Schön währ's wenn's so einfach währe!

Wenn ich make ein zweits mal aufrufe wird auch alles brav gebaut!

Hab's mal mit SRC_I2C=C:/AVR/OpenCOS/I2C/I2C.c versucht, sieht aber noch 
nach dem gleichen Problem aus:

--------------------------------------
C:\AVR\OpenCOS>make
makefile:199: OpenCOS.d: No such file or directory
set -e; avr-gcc -MM -DMCU_CLK=7372800  -g -Os -funsigned-char 
-fno-exceptions -f
unsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wa,-ahlms=C:/AVR/OpenCOS/I
2C/I2C.lst -mmcu=at90s8515 C:/AVR/OpenCOS/I2C/I2C.c \
| sed 's/\(C:/AVR/OpenCOS/I2C/I2C\)\.o[ :]*/\1.o C:/AVR/OpenCOS/I2C/I2C.d : /g'
> C:/AVR/OpenCOS/I2C/I2C.d; \
[ -s C:/AVR/OpenCOS/I2C/I2C.d ] || rm -f C:/AVR/OpenCOS/I2C/I2C.d
C:/AVR/OpenCOS/I2C/I2C.c:6:21: I2C/I2C.h: No such file or directory
sed: -e expression #2, char 12: Unknown option to 's'
make: *** [C:/AVR/OpenCOS/I2C/I2C.d] Error 1

C:\AVR\OpenCOS>make
makefile:199: OpenCOS.d: No such file or directory
set -e; avr-gcc -MM -DMCU_CLK=7372800  -g -Os -funsigned-char 
-fno-exceptions -f
unsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wa,-ahlms=OpenCOS.lst -mmc
u=at90s8515 OpenCOS.c \
| sed 's/\(OpenCOS\)\.o[ :]*/\1.o OpenCOS.d : /g' > OpenCOS.d; \
[ -s OpenCOS.d ] || rm -f OpenCOS.d
In file included from OpenCOS.c:5:
I2C/I2C.h:6:19: Types.h: No such file or directory
-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3 20030310 (prerelease)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is 
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR 
PURPOSE.

Size before:
   text    data     bss     dec     hex filename
      0    2632       0    2632     a48 OpenCOS.hex
avr-gcc -c -DMCU_CLK=7372800  -g -Os -funsigned-char -fno-exceptions 
-funsigned-
bitfields -fpack-struct -fshort-enums -Wall 
-Wa,-ahlms=C:/AVR/OpenCOS/I2C/I2C.ls
t -mmcu=at90s8515 -I. C:/AVR/OpenCOS/I2C/I2C.c -o 
C:/AVR/OpenCOS/I2C/I2C.o
avr-gcc -Wl,-Map=OpenCOS.map,--cref -mmcu=at90s8515 OpenCOS.o 
C:/AVR/OpenCOS/I2C
/I2C.o  -lm --output OpenCOS.elf
avr-objcopy -O ihex -R .eeprom OpenCOS.elf OpenCOS.hex
avr-objcopy -O binary -R .eeprom OpenCOS.elf OpenCOS.bin
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section
-lma .eeprom=0 -O ihex OpenCOS.elf OpenCOS.eep.hex
avr-objdump -h -S OpenCOS.elf > OpenCOS.lss
objtool loadelf OpenCOS.elf mapfile OpenCOS.map writecof OpenCOS.cof
Size after:
   text    data     bss     dec     hex filename
      0    2632       0    2632     a48 OpenCOS.hex
-------- end --------
-------------------------------------

von Joerg Wunsch (Gast)


Lesenswert?

Tja, Bertold, da hat wohl jemand beim Zusammenstellen der
sed-Ausdrücke nicht bis zu Ende gedacht. ;-)  Kannste Eric
aber keinen Vorwurf machen, er ist kein Unix-Guru und hat das
auch nur aus der GNU make Doku so abgetippt.

Das Problem besteht darin, daß als Begrenzer der Such- und
Ersetzausdrücke in den sed `s' Kommandos Schrägstriche
benutzt werden -- dieselben Schrägstriche übrigens, die Du
für die Unterverzeichnisse benutzt... ;-)

Schreibe die sed-Kommandos auf irgendwas um, was garantiert
nicht in Deinen Dateinamen auftaucht.  Kommas oder senkrechte
Striche sind dafür gängig.  Also statt

s/foo/bar/g

s|foo|bar|g bzw. s,foo,bar,g

Danach sollte es gehen -- und schicke das bitte an Eric
zurück.

von Joerg Wunsch (Gast)


Lesenswert?

Sorry, ich hätte Deinen Namen besser nochmal lesen sollen vor
dem Posten -- Bertolt also, so wie Dein berühmter Namensvetter
Brecht. :)

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Kann mir jemand erklären warum das alles so fürchterlich kompliziert 
sein muss? Bei mir sieht ein Makefile so aus:

build:
       gcc -bla bla bla.c
       objcopy asfd -f asdf

clean:
       rm *.rom *.hex *.eep *.elf *.o

prog:
       uisp bla -c afasfd

Viellleicht würde es mehr Sinn machen, den Windows-geplagten sowas als 
Vorlage mitzugeben, anstatt einem allgemeingültigen Make-Monster das nur 
Probleme macht?

von Bertolt Mildner (Gast)


Lesenswert?

@Joerg:

Vielen dank für die Hilfe!

Ich hab zwar keinen Dunst wie sed funktioniert, aber so scheint es zu 
funktionieren:

%.d: %.c
  set -e; $(COMPILE) -MM $(CPFLAGS) -I$(DIRINC) $< \
  | sed 's|\($*\)\.o[ :]*|\1.o $@ : |g' > $@; \
  [ -s $@ ] || rm -f $@

Warum auch immer!

Ich glaub mann muss sich schon einige Zeit mit dem "Make und dem 
Shellscript Kult" in der "UNIX Religion" auseinandersetzen um das 
wirklich zu verstehen!
Hieroglyphen sind nichts dagegen. :((

von MiCHEL (Gast)


Lesenswert?

hier eine kleine batchdatei compile&burn

avr-gcc -o %1.elf -Os -Wall -mmcu=at90s8515 %1.c
avr-objcopy -O ihex %1.elf %1.hex
avrdude -p 8515 -c stk500 -y -e -i %1.hex

syntax:
<filename>.bat <datei>    <- ohne (.c) extension

funzt prima :)

von Bertolt Mildner (Gast)


Lesenswert?

Tja, so weit so gut. Allerdings macht das objtool offenbar Probleme.
Im .cof file ist weit und breit kein Hinweis auf source files die in 
einem Unterverzeichnis liegen!

(.elf und .map sehen gut aus)

==> AVRStudio versucht nicht mal den source zu laden.
==> Nix mit debuggen im Simulator <grr...> :[

von Joerg Wunsch (Gast)


Lesenswert?

Andreas, das Problem entsteht einfach dann, daß nach Änderung
eines Headerfiles die betroffenen C-Dateien nicht neu übersetzt
werden.  Normalerweise schreibt man dann die Abhängigkeiten
selbst in sein Makefile:

foo.o: foo.c project.h /usr/local/avr/include/avr/io.h

etc. pp.  Die Magie, die Eric da mitliefert, erledigt das
einfach von selbst, indem sie die Abhängigkeiten in einer
Datei hinterlegt, die dann von make im Makefile included wird.

Bertolt, auch ohne sed komplett zu erklären, so schlimm ist das
doch gar nicht: s/foo/bar/g ist normalerweise die globale (dafür
das »g«) Ersetzung (substitute, das »s«) der Teilzeichenkette
»foo« durch die Zeichenkette »bar« im Eingabestrom.  Die
Schrägstriche dienen dabei nur als Begrenzungszeichen.  Dumm
ist es eben, wenn dann statt »foo« ein »foo/bar« steht...
Dann kommt da s/foo/bar/foo/mumble/g oder sowas raus, und das
ist einfach Quatsch.  Abhilfe ist eben, daß man für die
Begrenzer ein Zeichen nimmt, was nicht in den Dateinamen
selbst (die ja hier gesucht und ersetzt werden) auftaucht.

Das dumme alte COFF, das Atmel sich so glorreich ausgesucht
hat, ist zu Zeiten entstanden, da ein UNIX-Filesystem nur
14 Zeichen lange Dateinamen kannte.  Folglich hat man darin
auch nur 14 Zeichen für den Dateinamen reserviert...  Damit
hat es keinen Sinn, auch noch Unterverzeichnisse da mit
aufzunehmen (der gcc selbst liefert in seinen Debuginformationen
eigentlich den absoluten Pfadnamen der Datei).

In der neueren Version von AVR COFF (die von der aktuellen
Version von AVR Studio 4 verstanden wird) hat Atmel eine
Variante erfunden, wie sie längere Namen unterbringen, aber
objtool kann dieses Format noch nicht (und viele andere
Compiler auch nicht).

AVR Studio sollte eine Möglichkeit besitzen, wie man die
Verzeichnisse, in denen die Quellen gesucht werden, konfigurieren
kann.  Der GDB hat sowas (Kommando »dir«).  Aber das mußt Du
Atmel begreiflich machen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.