Forum: Mikrocontroller und Digitale Elektronik .dep/main_elf.aps:1: *** target pattern contains no `%'. Stop.


von Alex a. (swam)


Lesenswert?

Schönen guten Abend,

ich bin Neueinsteiger und wollte mit Hilfe des STK500,WinAVR und 
AVR-Studio in die Materie einsteigen. Dafür wollte ich das 
AVR-GCC-Tutorial durchackern. Der erste Code stand und hat bereits 
funktioniert. Beim zweiten Durchlauf kam letztlich im "Programmers 
Notepad2"(WIN-AVR 20100110) diese Fehlermehldung hier:

> "make.exe" all
.dep/main_elf.aps:1: *** target pattern contains no `%'.  Stop.

> Process Exit Code: 2
> Time Taken: 00:00

Nach einiger Recherche habe ich herausgefunden, dass der Fehler auf die 
Angabe des Verzeichnisses im Makefile zurückzuführen ist. Hier spackt er 
wohl wegen des ":"-Zeichens in der Verzeichnisangabe rum, aber das sind 
nur wage Einschränkungen des Problems. In den meisten Foren wird nur 
gesagt, dass es daran liegt, aber nciht wie es richtig sein soll.

Kennt sich einer mit dem Fehler aus und weiß, was abzuändern ist?

Hier der wahrscheinlich relevante Teil meiner Makefile, die ich mit 
mfile erstellt habe. Falls mehr benötigt wird, liefer ich gerne mehr 
Daten.
Vielen Dank schonmal!
1
# MCU name
2
MCU = atmega8515
3
4
5
# Processor frequency.
6
#     This will define a symbol, F_CPU, in all source code files equal to the 
7
#     processor frequency. You can then use this symbol in your source code to 
8
#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
9
#     automatically to create a 32-bit value in your source code.
10
#     Typical values are:
11
#         F_CPU =  1000000
12
#         F_CPU =  1843200
13
#         F_CPU =  2000000
14
#         F_CPU =  3686400
15
#         F_CPU =  4000000
16
#         F_CPU =  7372800
17
#         F_CPU =  8000000
18
#         F_CPU = 11059200
19
#         F_CPU = 14745600
20
#         F_CPU = 16000000
21
#         F_CPU = 18432000
22
#         F_CPU = 20000000
23
F_CPU = 8000000
24
25
26
# Output format. (can be srec, ihex, binary)
27
FORMAT = ihex
28
29
30
# Target file name (without extension).
31
TARGET = main
32
33
34
# Object files directory
35
#     To put object files in current directory, use a dot (.), do NOT make
36
#     this an empty or blank macro!
37
OBJDIR = .
38
39
40
# List C source files here. (C dependencies are automatically generated.)
41
SRC = $(TARGET).c
42
43
44
# List C++ source files here. (C dependencies are automatically generated.)
45
CPPSRC = 
46
47
48
# List Assembler source files here.
49
#     Make them always end in a capital .S.  Files ending in a lowercase .s
50
#     will not be considered source files but generated files (assembler
51
#     output from the compiler), and will be deleted upon "make clean"!
52
#     Even though the DOS/Win* filesystem matches both .s and .S the same,
53
#     it will preserve the spelling of the filenames, and gcc itself does
54
#     care about how the name is spelled on its command-line.
55
ASRC =
56
57
58
# Optimization level, can be [0, 1, 2, 3, s]. 
59
#     0 = turn off optimization. s = optimize for size.
60
#     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
61
OPT = s

Quellen:

http://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/Static-Usage.html#Static-Usage

http://fixunix.com/kernel/368943-kernel-compilation-make-halts-error-message-***-target-pattern-contains-no-%60%25.html

http://forums.devshed.com/c-programming-42/target-pattern-contains-no-174161.html

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=396363

von Karl H. (kbuchegg)


Lesenswert?

Wenn dein Problem tatsächlich mit den Dingen zusammenhängt, die du 
vermutest, dann findet sich in deinem letzten Link ein Beispiel für das 
Problem.

Der Programmierer hat seine Sourcen im Verzeichnis

`/home/mrvn/build/grace_1:5.1.20-3/grace-5.1.20'

abgelegt. Schau dir den Pfadnamen genau an. Da ist ein ':' drinnen. Der 
: hat aber für make eine spezielle Bedeutung, da die Regeln, die er 
letztendlich abarbeitet nach dem Muster aufgebaut sind
1
Ziel: Abhaengig_von
2
      Kommando um 'Ziel' aus den Abhaengigkeiten zu erzeugen

Da kommt ebenfalls ein ':' vor und der dient dazu die Angabe des Ziels 
von den Abhängigkeiten zu trennen.

Als Programmierer, der immer wieder auf Command Line Tools angewiesen 
ist, solltest du es dir zur Regel machen, in Pfadnamen (weder bei der 
Compiler Installation noch bei deinen Projektverzeichnissen) 
irgendwelche Besonderheiten zu benutzen. Keine Umlaute, keine 
Sonderzeichen (ausser einem Unterstrich), keine Leerzeichen oder 
dergleichen. Überlass die Verwendung solcher Dinge den BWL Leuten, die 
ihre Powerpoint Präsentationen nicht mehr finden würden, wenn das 
Verzeichnis nicht
"allgemeine Ablage\streng vertraulich\Präsentationen\nur für den Chef\"
heißen kann.
Als Software Entwickler legst du auf solche Dinge keinen Wert, sondern 
sorgst lieber dafür, dass du deinen Werkzeugen möglichst wenig 
Sonderfälle präsentierst über die sie stolpern können. Und irgendein 
Command Line Tool, welches mit Umlauten nicht klar kommt, oder bei dem 
vergessen wurde beim Aufruf das Argument in " einzuschliessen so dass 
sich Leerzeichen fatal auswirken, hat man immer in der Toolchain.

von Alex a. (swam)


Lesenswert?

Vielen Dank für die schnelle Antwort.

Die Sache mit den schlecht gewählten Ordnernamen hat mir auch schon 
öfters bei python einen Strich durch die Rechnung gemacht. Ich habe es 
jetzt geändert und nun liegt meine main.c und eine neu erstellte 
Makefile in

"C:\microntroller\gccTutorial\",

Das hat das Problem jedoch nicht gelöst und der Doppelpunkt hinter dem 
Laufwerknamen lässt sich ja bei Windows nicht vermeiden ;)
In der Makefile gilt immernoch

"OBJDIR = .",

was ja letztlich dazu führt, dass sie den Sourcecode aus dem selben 
Ordner nimmt.

Mir fällt keine weitere Fehlerquelle ein. Gibt's noch eine Idee?

von Alex a. (swam)


Lesenswert?

Edit: Hat sich erledigt! Der Fehler war, dass ich alle alten Dateien in 
das neue Verzeichnis mitgenommen habe (*.hex,*.elf usw.). Nur mit main.c 
und Makefile im Ordner hat dann alles wunderbar geklappt.

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.