Arduino MakeFile (LINUX) -- bitte um Hilfe bzgl Verständisfrage

Hallo Forum,

ich bräuchte Unterstützung bei der Verwendung von makefile für Arduino 1.0 unter Ubuntu.

Das Makefile habe ich mir von http://ed.am/dev/make/arduino-mk runtergeladen.

Die arduino.mk Datei habe ich bei mir unter /usr/src abgespeichert.

Mein Projektverzeichnis, wo alle meine Sourcen zu meinen Arduinoprojekten abgelegt sind, liegt unter home/sdi/Dropbox/Hardwareprogrammierung/1_EigeneProjekte/Arduino

hier untergliedere ich nochmals in weiteren Unterordnern zu den einzelnen Projekten wie zB /1_Testprojekt/. In diesem Ordner wie hier beschrieben (1_Testprojekt), liegt nun die finale Version des Arduinosketches (ino Datei)

Muss ich nun in jeden dieser Projektordner einen symbl Link von meinem Makefile setzen wie zB ln -s /home/sdi/Dropbox/Hardwareprogrammierung/1_EigeneProjekte/Arduino/1_Testprojekt Makefile oder kann ich das Makefile auch zentral wo ablegen?? ( ich meine dass wäre ein schöner Aufwand wenn ich zB 500 Arduino Projekte nun überall auf das Makefile verlinken muss nur weil ich unter Linux arbeiten will)

So ich habe nun mal den sym Link direkt in mein Projektverzeichnis reingesetzt.

wenn ich nun make boards in der Kommandozeile eingebe, erscheinen mir schön die Boards welche verfügbar sind.

So aber wie kompiliere ich nun einen Sourcecode um sehen zu können, ob ich Syntaxfehler enthalten habe? make "+ welcher Befehl???"

Bitte um Info, denn an und für sich ist die Makefile Methode unter Linux klasse.... :-)))

danke

lg

Dieter

Als Fenstermensch kann ich Dir nur mit einem Link helfen ohne zu wissen ob die Infos hilfreich sein könnten:
http://arduino.cc/playground/Linux/Ubuntu
Grüße Uwe

Hallo

  • Das Makefile liegt normalerweise immer im Verzeichnis der Quelldateien. Tatsächlich ist es eher eine Kopie als ein Sym/Hardlink.
  • Das Makefile enthält auch alle Einstellungen: Verwendete Libs, angeschlossene Boards, etc. Es ist unwahrscheinlich, dass es ein Makefile für alle Projekte geben kann.
  • Ein Makefile muss normalerweise angepasst werden. Selten war es bei mir möglich Makefiles ohne Änderung zu übernehmen.
  • Es gibt gute Makefiles (gut dokumentiert) und schlechte Makefiles (keine doku). Dieses Makefile scheint mir ganz gut zu sein, denn
  • Es beschreibt die Config-Parameter
  • Es sind die Kommandos (eigentlich: Targets) beschrieben

Lese selbst: http://ed.am/dev/make/arduino-mk/arduino.mk

Wenn man tiefer einsteigen will, kommt man nicht darum herum, sich mit Make auseinanderzusetzen. Das ist eigentlich gar nicht so schwer (http://www.gnu.org/software/make/manual/make.html).

Grüße, Oliver

Hi Zusammen,

also ich bin schon etwas vertraut mit dem Makefile, bekomme aber beim compilieren von manchen Projekten bei make immer einen Fehlermeldung, jedoch nicht wenn ich diese direkt in der Arduino IDE compiliere. Das makefile schreit kurz vor Ende ....." xxxx Function was not declared in scope"

sdi@ubuntu:~/Dropbox/Hardwareprogrammierung_Entwicklung/1 Eigene Projekte/Arduino/2 Windmessung_MFC/1_Firmware/0_Testaufbau_Firmwarefunction_aus_Einzeltestprogramme/aktuell/MFC_Siegendorf_SLAVE_v007$ ls Makefile MFC_Siegendorf_SLAVE_v007.ino MFC_Siegendorf_SLAVE_v007.rar sdi@ubuntu:~/Dropbox/Hardwareprogrammierung_Entwicklung/1 Eigene Projekte/Arduino/2 Windmessung_MFC/1_Firmware/0_Testaufbau_Firmwarefunction_aus_Einzeltestprogramme/aktuell/MFC_Siegendorf_SLAVE_v007$ export BOARD=mini328 sdi@ubuntu:~/Dropbox/Hardwareprogrammierung_Entwicklung/1 Eigene Projekte/Arduino/2 Windmessung_MFC/1_Firmware/0_Testaufbau_Firmwarefunction_aus_Einzeltestprogramme/aktuell/MFC_Siegendorf_SLAVE_v007$ estprogramme/aktuell/MFC_Siegendorf_SLAVE_v007$ make mkdir -p .dep/./ /usr/bin/avr-g++ -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=100 -I. -Iutil -Iutility -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/eightanaloginputs/ -I/usr/share/arduino/libraries/Wire -I/usr/share/arduino/libraries/SD -I/usr/share/arduino/libraries/Wire/utility -I/usr/share/arduino/libraries/SD/utility -c -MMD -MP -MF .dep/MFC_Siegendorf_SLAVE_v007.ino.dep -o MFC_Siegendorf_SLAVE_v007.o -x c++ -include /usr/share/arduino/hardware/arduino/cores/arduino/Arduino.h MFC_Siegendorf_SLAVE_v007.ino MFC_Siegendorf_SLAVE_v007.ino: In function ‘void setup()’: MFC_Siegendorf_SLAVE_v007.ino:121:20: error: ‘receiveEvent’ was not declared in this scope MFC_Siegendorf_SLAVE_v007.ino: In function ‘void loop()’: MFC_Siegendorf_SLAVE_v007.ino:179:12: error: ‘Watchdog’ was not declared in this scope MFC_Siegendorf_SLAVE_v007.ino:183:12: error: ‘Watchdog’ was not declared in this scope MFC_Siegendorf_SLAVE_v007.ino: In function ‘void receiveEvent(int)’: MFC_Siegendorf_SLAVE_v007.ino:244:9: warning: unused variable ‘x’ make: *** [MFC_Siegendorf_SLAVE_v007.o] Fehler 1

ich hab hier mal die Infos aus dem Terminal rauskopiert damit ihr es sehen könnts. Woran könnte es liegen?

Diese Sketches wurden einstmals unter Windows 7 erstellt, dass kompilieren und uploaden in Linux funktioniert einwandfrei in der IDE.

lg Dieter

danke Forum,

habe die Ursache des Problems schon gefunden. ich muss Protoypes für meine Functions definieren.

Für die jenigen die es nicht wissen, ich habe vor der void setup() folgende Functionen definiert, also jene die mir make als not declared zurückgemeldet hat.

void Watchdog(); void receiveEvent(int howMany);

lg

Dieter

Hallo,

leider bekomme ich bei manchen Sketches diesen Fehler beim kompilieren. Hat jemand eine Ahnung woran es liegen könnte? (collect2: ld returned 1 exit status ????? )

estprogramme/aktuell/MFC_Siegendorf_v020/makeLinux$ make /usr/bin/avr-gcc -Os -Wl,--gc-sections -mmcu=atmega328p MFC_Siegendorf_v021_LINUX.o .lib/arduino.a -o MFC_Siegendorf_v021_LINUX.elf /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/libc.a(log.o):../../../libm/fplib/log.S:96: relocation truncated to fit: R_AVR_13_PCREL against symbol __addsf3' defined in .text section in /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_addsub_sf.o) /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/libc.a(log.o):../../../libm/fplib/log.S:100: relocation truncated to fit: R_AVR_13_PCREL against symboladdsf3' defined in .text section in /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_addsub_sf.o) /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/libc.a(log.o):../../../libm/fplib/log.S:116: relocation truncated to fit: R_AVR_13_PCREL against symbol `floatsisf' defined in .text section in /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_si_to_sf.o) collect2: ld returned 1 exit status make: *** [MFC_Siegendorf_v021_LINUX.elf] Fehler 1

danke im voraus

lg

Dieter

ich tippe auf ein fehlendes "-lm" beim linken.

Grüße, Oliver

hi

ja aber wo fehlt das -lm ??

Bin neu im Bereich der Verwendung von Makefile und kenne mich daher nicht so aus. Bitte um Hilfe

danke lg Dieter

Hi

naja, jedes Makefile ist anders aufgebaut, aber ich tippe mal auf: "linken" --> LINKFLAGS

einfach "-lm" hier anhängen:

LINKFLAGS := -Os -Wl,--gc-sections -mmcu=$(BOARD_BUILD_MCU)

das sieht dann so aus:

LINKFLAGS := -Os -Wl,--gc-sections -mmcu=$(BOARD_BUILD_MCU) -lm

Alternative: Das linken direkt modifizieren: Aus

$(TARGET).elf: $(ARDUINOLIB) $(OBJECTS)
    $(CC) $(LINKFLAGS) $(OBJECTS) $(ARDUINOLIB) -o $@

wird

$(TARGET).elf: $(ARDUINOLIB) $(OBJECTS)
    $(CC) $(LINKFLAGS) $(OBJECTS) $(ARDUINOLIB) -lm -o $@

Grüße, Oliver

Hallo Oliver,

also ich habe deine Tips probiert leider ohne Erfolg. Hier wieder der Auszug aus dem Log.

/usr/bin/avr-gcc -Os -Wl,--gc-sections -mmcu=atmega328p MFC_Siegendorf_v021_LINUX.o .lib/arduino.a -o MFC_Siegendorf_v021_LINUX.elf /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/libc.a(log.o):../../../libm/fplib/log.S:96: relocation truncated to fit: R_AVR_13_PCREL against symbol __addsf3' defined in .text section in /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_addsub_sf.o) /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/libc.a(log.o):../../../libm/fplib/log.S:100: relocation truncated to fit: R_AVR_13_PCREL against symboladdsf3' defined in .text section in /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_addsub_sf.o) /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/libc.a(log.o):../../../libm/fplib/log.S:116: relocation truncated to fit: R_AVR_13_PCREL against symbol `floatsisf' defined in .text section in /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_si_to_sf.o) collect2: ld returned 1 exit status make: *** [MFC_Siegendorf_v021_LINUX.elf] Fehler 1

Hier findest du mein Makefile .... http://ed.am/dev/make/arduino-mk/arduino.mk

hmmm... also das verlinkte File hat zumindest kein "-lm" Wichtig ist auch immer, ein "make clean" vorab durchzuführen und dann erst "make upload"

Oliver

Alternative zu make ist scons. Meiner Meinung nach die deutlich angehmere Wahl. Vor allem weil darunter Python liegt --> man kann das Teil vernünftig debuggen wenn mal was nicht klappt.

http://code.google.com/p/arscons/source/browse/SConstruct