mikrocontroller.net

Forum: Compiler & IDEs automatisches Generieren von makefiles


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Gibt es eigentlich ein Tool mit dessen Hilfe man (halb-)automatisch 
makefiles erzeugen kann.
Ich habe ein Projekt mit mehreren Verzeichnisse in denen Code drin ist.

Ich benutze gcc mit LPC (ARM7) und eclipse.

Viele Grüsse

Martin

Autor: Günter R. (galileo14)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MFile. Siehe Doku zu WinAVR.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Allerdings ist Mfile natürlich wirklich spezifisch für den AVR
geschrieben worden.  Ich wollte explizit keine frei konfigurierbare
eierlegende Wollmilchsau bauen.

Man könnte die Idee aber sicher für den ARM ableiten, wenn das jemand
will.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Vielen Dank für die Tipps!

Habe hier noch einen Link zu einem Makefile-Generator gefunden.

http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/

Ganz habe ich das Prozedre noch nicht durchschaut. Das liegt aber auch 
s.w. daran, dass mir die Gesamtübersicht bzgl. Makefiles fehlt.


z.B.
1.) Sollte für jedes Verzeichnis ein eigenes Makefile erzeugt werden?
2.) Wie geht man damit um, wenn source-Files in andern Verzeichnisen 
abgelegt sind? Das macht man ja oft, um seinen Code zu strukturieren.

Beste Grüsse

Martin

Autor: StinkyWinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich empfehle für jedes Verzeichnis ein eigenes Makefile, plus ein 
übergeordnetes, welches alle "Unteren" abgrast.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ein übergeordnetes Makefile ist übrigens ziemlich simpel:
SUBDIRS= dir1 dir2 dirN

all clean install program:
  for dir in $(SUBDIRS); do \
    ( cd $$dir && make $@ ) ; \
  done

Vor dem
for
 muss dabei ein Tabulator stehen.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

und vielen Dank für die Hinweise. Genau in diese Richtung möchte ich 
gehen!

1.) Verschiedene Softwaremodule befinden sich in verschiedenen 
Verzeichnissen. Das Hautpanwendung (main) ebenso.

Ich habe nun in jedem Verzeichnis ein Makefile und eine file .depend 
angelegt. Das Makefile sieht folgendermassen aus:
LIBNAME  = usbstack

# Package definitions
PKG_NAME  = target
DATE    = $$(date +%Y%m%d)

# Tool definitions
CC      = arm-elf-gcc
LD      = arm-elf-ld -v
AR      = arm-elf-ar
AS      = arm-elf-as
CP      = arm-elf-objcopy
OD    = arm-elf-objdump
RM    = rm
TAR    = tar

CFLAGS  = -I./ -I../ -c -W -Wall -Os -g -DDEBUG -mcpu=arm7tdmi
ARFLAGS = -rcs

LIBSRCS = usbhw_lpc.c usbcontrol.c usbstdreq.c usbinit.c
LIBOBJS = $(LIBSRCS:.c=.o)

all: depend lib examples

clean:
  $(RM) -f $(LIBNAME).a $(LIBOBJS) .depend
  make -C examples clean

examples:
  make -C examples

# build lib
lib: $(LIBNAME).a

$(LIBNAME).a: $(LIBOBJS)
  $(AR) $(ARFLAGS) $@ $^

# Builds release tar file
dist: clean
  cd .. && $(TAR) --exclude={CVS,cvs,.svn} -cvzf $(PKG_NAME)-$(DATE).tar.gz $(PKG_NAME)

# recompile if the Makefile changes
$(LIBOBJS): Makefile

# dependency checking
depend: $(LIBSRCS)
  $(CC) $(CFLAGS) -MM $^ > .depend || rm -f .depend

# phony targets
.PHONY: all clean examples depend

-include .depend

Im .depend-file ist angegeben:
usbhw_lpc.o: usbhw_lpc.c type.h usbdebug.h usbhw_lpc.h usbapi.h \
  usbstruct.h
usbcontrol.o: usbcontrol.c type.h usbdebug.h usbstruct.h usbapi.h
usbstdreq.o: usbstdreq.c type.h usbdebug.h usbstruct.h usbapi.h
usbinit.o: usbinit.c type.h usbdebug.h usbapi.h usbstruct.h

Beim Aufruf von make erhalte ich allerdings die Meldung:

F:\Ex1_usb\Misc>make
make: *** No rule to make target `usbhw_lpc.c', needed by `depend'. 
Stop.

F:\Ecx1_usb\Misc>make depend.
make: *** No rule to make target `depend.'.  Stop.


2.) Ich habe das Problem, dass h-files auch in anderen Verzeichnissen 
abgelegt werden. Kann man dieses Problem auch irgendwie lösen?

Vielen Dank für Eure Hilfe

Martin
So richtig kompfortabel wäre es, wenn es ein Tool gäbe, das diese 
"scheinbare" Routineaufgabe erfüllen kann - obwohl es nun langsam 
neugierig werde, wie dies makesfiles funktionieren:)

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja, der compi meckert, weil er ein h-file, welches in einem anderen 
Verzeichnis befindet nicht findet. Er hat recht, aber wie teile ich ihm 
mit wo es liegt:)?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-Iincludepath

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Nun bin ich etwas weiter gekommen. für die Pfadeinstellungen habe ich 
wie von Jörg gezeigt, den Parameter -I gewählt, vielen Dank Jörg.

Nun werden .o-files und daraus dann ein .a-file erzeugt.

Alle a-Files habe ich dann in das Verzeichnis der Hautpapplikation 
kopiert und versucht das Programm zu linken.

Nun erhalte ich aber den Fehler:
 undefined reference to `sqrt'

sqrt ist aber Bestandteil von der math-library....? Muss ich da noch 
etwas anderweitig compilieren oder linken?

Beste Grüsse

Martin

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die Mathe-Library fehlt in deinem Makefile bzw. eher in dem Makefile 
für das TargetPROGRAMM (dein Makefile sieht mir nach einem Makefile für 
eine LIBRARY aus). Sie wird durch den Linkeroption -lm eingebunden.

Üblicherweise hat ein Makefile fürs Targetprogramm dafür eine Variable 
LDFLAGS, in der das direkt oder indirekt drin steht und die 
entsprechende Kommandozeile im Build-Abschnitt. Also z.B.

# Build-Variablen
MATH_LIB = -lm
LDFLAGS = $(MATH_LIB)
LDFLAGS += ...

# Build-Regeln
%.elf:
  $(CC) $(CFLAGS) $(LDFLAGS) ...

In die LDFLAGS solltest du dann auch deine in den Unter-Makefiles 
erzeugten Libraries aufnehmen.

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beispiel
/privat/lib64/libWeatherForcast.so

gcc -L /private/lib64 -lWeaterForcast foo.c bar.c main.c

-L sagt wo libraries
-l sagt was für libraries
-I sagt wo include dateien
.. und was für include dateien, das steht im C code selber ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.