Forum: Compiler & IDEs automatisches Generieren von makefiles


von Martin (Gast)


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

von Günter R. (galileo14)


Lesenswert?

MFile. Siehe Doku zu WinAVR.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Martin (Gast)


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

von StinkyWinky (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

So ein übergeordnetes Makefile ist übrigens ziemlich simpel:
1
SUBDIRS= dir1 dir2 dirN
2
3
all clean install program:
4
  for dir in $(SUBDIRS); do \
5
    ( cd $$dir && make $@ ) ; \
6
  done

Vor dem
1
for
 muss dabei ein Tabulator stehen.

von Martin (Gast)


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:
1
LIBNAME  = usbstack
2
3
# Package definitions
4
PKG_NAME  = target
5
DATE    = $$(date +%Y%m%d)
6
7
# Tool definitions
8
CC      = arm-elf-gcc
9
LD      = arm-elf-ld -v
10
AR      = arm-elf-ar
11
AS      = arm-elf-as
12
CP      = arm-elf-objcopy
13
OD    = arm-elf-objdump
14
RM    = rm
15
TAR    = tar
16
17
CFLAGS  = -I./ -I../ -c -W -Wall -Os -g -DDEBUG -mcpu=arm7tdmi
18
ARFLAGS = -rcs
19
20
LIBSRCS = usbhw_lpc.c usbcontrol.c usbstdreq.c usbinit.c
21
LIBOBJS = $(LIBSRCS:.c=.o)
22
23
all: depend lib examples
24
25
clean:
26
  $(RM) -f $(LIBNAME).a $(LIBOBJS) .depend
27
  make -C examples clean
28
29
examples:
30
  make -C examples
31
32
# build lib
33
lib: $(LIBNAME).a
34
35
$(LIBNAME).a: $(LIBOBJS)
36
  $(AR) $(ARFLAGS) $@ $^
37
38
# Builds release tar file
39
dist: clean
40
  cd .. && $(TAR) --exclude={CVS,cvs,.svn} -cvzf $(PKG_NAME)-$(DATE).tar.gz $(PKG_NAME)
41
42
# recompile if the Makefile changes
43
$(LIBOBJS): Makefile
44
45
# dependency checking
46
depend: $(LIBSRCS)
47
  $(CC) $(CFLAGS) -MM $^ > .depend || rm -f .depend
48
49
# phony targets
50
.PHONY: all clean examples depend
51
52
-include .depend

Im .depend-file ist angegeben:
1
usbhw_lpc.o: usbhw_lpc.c type.h usbdebug.h usbhw_lpc.h usbapi.h \
2
  usbstruct.h
3
usbcontrol.o: usbcontrol.c type.h usbdebug.h usbstruct.h usbapi.h
4
usbstdreq.o: usbstdreq.c type.h usbdebug.h usbstruct.h usbapi.h
5
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:)

von Martin (Gast)


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:)?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

-Iincludepath

von Martin (Gast)


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:
1
 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

von Stefan B. (stefan) Benutzerseite


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.

von daniel (Gast)


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 ;)

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.