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
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
@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 --------
-------------------------------------
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.
Sorry, ich hätte Deinen Namen besser nochmal lesen sollen vor dem Posten -- Bertolt also, so wie Dein berühmter Namensvetter Brecht. :)
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?
@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. :((
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 :)
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...> :[
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.