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
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.
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
Ich empfehle für jedes Verzeichnis ein eigenes Makefile, plus ein übergeordnetes, welches alle "Unteren" abgrast.
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.
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:)
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:)?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.