automatisches Generieren von makefiles

Gast #699345
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
Gast #703449
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:)
Gast #704088
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
Persönliche Seite #704136
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.
Gast #704958
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren