Forum: Compiler & IDEs Projektname als String


von Ingo Less (Gast)


Lesenswert?

Hallo Leute,

ich habe in System Workbench ein Projekt. Den Projektnamen würde ich 
gern im LCD anzeigen lassen. Natürlich könnte man das händisch 
erledigen, aber ich hätte das gern automatisiert. Wie komme ich in C 
dahin, dass der Projektname in einem String landet?

von Joachim B. (jar)


Lesenswert?

Ingo Less schrieb:
> Wie komme ich in C
> dahin, dass der Projektname in einem String landet?

in dem du dem File den Projektnamen gibst?

Dort steckt er ja in argv[0] oder _NAME

von Ingo Less (Gast)


Lesenswert?

Joachim B. schrieb:
> in dem du dem File den Projektnamen gibst?
Kannst du das etwas näher ausführen? Ich steh aufm Schlauch.

von Joachim B. (jar)


Lesenswert?

Ingo Less schrieb:
> in C

steht in jedem C-Buch
http://www.c-howto.de/tutorial/funktionen-teil-2/hauptfunktion/

oder bei gcc
const char main_name[] PROGMEM = {__FILE__};

von Nick M. (Gast)


Lesenswert?

Joachim B. schrieb:
> const char main_name[] PROGMEM = {__FILE__};

Voller Pfad mit extension?

von Johannes S. (Gast)


Lesenswert?

ja ja, steht alles im C-Buch...
Da muss man schon mit Macros tricksen und der gcc ist da etwas zickig.
1
#define STRINGIFY(x) #x
2
#define TOSTRING(x) STRINGIFY(x)
3
4
5
printf("Hello from "  TOSTRING(PROJECT_NAME) "\n");

damit bekommt man ein define in einen String. Jetzt muss noch 
PROJECT_NAME (habe ich hier nur als Beispiel genommen) von der Workbench 
in den Compiler setttings für die übergebenen defines vorhanden sein. 
Eventuell gibt es sowas, oder man muss gucken ob es eine 
Envrionmentvariable gibt die man in ein entsprechendes define packen 
kann. Und da es hier wohl um Cortex-M geht gibt es auch kein PROGMEM.
Also nicht unbeding das erste Kapitel im C-Buch.

von Nick M. (Gast)


Lesenswert?

Mach ein #define in den ProjectSettings.

von Bernd K. (prof7bit)


Lesenswert?

Lass einfach vom Makefile einen Header erzeugen der all diese Sachen als 
Define enthält (Name, Version, Branch, Commit-ID, Compiledatum, was auch 
immer...)

von Joachim B. (jar)


Lesenswert?

Johannes S. schrieb:
> Und da es hier wohl um Cortex-M geht gibt es auch kein PROGMEM

Hellseher?
vom TO liesst man das nicht ;)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Joachim B. schrieb:
> Hellseher?

Es ist Google, der hellsieht, wenn man "System Workbench" eingibt :)

von Joachim B. (jar)


Lesenswert?

Yalu X. schrieb:
> Es ist Google, der hellsieht, wenn man "System Workbench" eingibt

ach so, ja dann google hat sich ja noch nieeeee geirrt :)

dachte ich bei workbench immer an Amiga.

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

Joachim B. schrieb:
> dachte ich bei workbench immer an Amiga.

Gib mal "Workbench" in die Bildersuche ein.

von Joachim B. (jar)


Lesenswert?


von Bauform B. (bauformb)


Lesenswert?

Zum Beispiel: im Makefile
1
HOST := $(shell hostname)
2
USER := $(shell whoami)
3
TOP  := $(shell dirname `pwd`)
4
5
CFLAGS += -DHOSTNAME="\"$(HOST)\""
6
CFLAGS += -DUSERNAME="\"$(USER)\""
7
CFLAGS += -DBUILD_PATH="\"$(TOP)\""
und dann
1
   printf ("  GCC %d.%d.%d (%s)\n  %s@%s:%s",
2
           __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__, __VERSION__,
3
           USERNAME, HOSTNAME, BUILD_PATH);

von Ingo Less (Gast)


Lesenswert?

Nick M. schrieb:
>> const char main_name[] PROGMEM = {__FILE__};
_FILE_ hilft nicht weiter, es gibt den Dateinamen der Sourcdatei 
zurück (z.B. main.c). So wie es scheint, kommt man an die Info nicht 
ohne Krücken über Makefile dran. Sehr schade...

von Programmierer (Gast)


Lesenswert?

Der C Compiler weiß nicht was ein "Projekt" ist und auch nicht was der 
Name des Projekts ist. Du kannst in Eclipse (=System Workbench) in den 
Projekteinstellungen Makros (dort fälschlich "Symbol" genannt) 
definieren und als Wert "${project_name}" setzen, das wird dann von 
Eclipse mit dem Projektnamen ersetzt. Das Makro kannst du dann im Code 
nutzen.

von Nick M. (Gast)


Lesenswert?

Ingo Less schrieb:
> FILE hilft nicht weiter,

Genau das hab ich doch geschrieben!?

von Ingo Less (Gast)


Lesenswert?

Nick M. schrieb:
> Genau das hab ich doch geschrieben!?
Nö, du hast ne Frage dazu gestellt.

Programmierer schrieb:
> Du kannst in Eclipse (=System Workbench) in den
> Projekteinstellungen Makros (dort fälschlich "Symbol" genannt)
> definieren und als Wert "${project_name}" setzen,
Ich habs an verschiedenen Stellen versucht. Wo genau soll ich das Symbol 
erstellen?

von Ingo Less (Gast)


Lesenswert?

Ich habe nun in Settings -> Tools -> Global compiler settins -> #defines 
_SW_VERSION_  "${TARGET_OUTPUT_BASENAME}" erzeugt.

Ich bekomme als Fehlermeldung:

1V9 No such file or directory
1V9, so heisst das Projekt

von Nick M. (Gast)


Lesenswert?

Ingo Less schrieb:
>> Genau das hab ich doch geschrieben!?
> Nö, du hast ne Frage dazu gestellt.

https://de.wikipedia.org/wiki/Rhetorische_Frage

von Ingo Less (Gast)


Lesenswert?

*Push

von Programmierer (Gast)


Lesenswert?

Ingo Less schrieb:
> Ich habe nun in Settings -> Tools -> Global compiler settins -> #defines
> SW_VERSION  "${TARGET_OUTPUT_BASENAME}" erzeugt.

Das sind die globalen Settings, also völlig falsch. Hab Grad kein 
Eclipse zu Hand und kanns nicht nachgucken. Rechte Maustaste auf das 
Projekt, Properties, C/C++ General -> Paths and Symbols -> Symbols, oder 
so ähnlich.

https://armstrap-documentation.readthedocs.io/en/latest/_images/Eclipse-Project-Properties.png

https://help.eclipse.org/2019-12/topic/org.eclipse.cdt.doc.user/images/prop_symb.png

von Ingo Less (Gast)


Lesenswert?

Danke für die Hilfe, aber ich glaube man hat hier das EmBitz zu weit von 
Eclipse verfremdet. Die Menüeinträge gibts garnicht. Habe es aber 
woanders gefunden:

Unter den BuildOptions kann ich dieses #define erzeugen:
SW_VERSION="${TARGET_OUTPUT_BASENAME}"

Im Programm mache ich dann folgendes:
1
const char TimeStampBuildTime[] = SW_VERSION;

Das wirft aber die Fehlermeldung "invalid suffix "V9" on integer 
constant".

Das heisst, er erzeugt ein #define, welches einen String statt einer 
Zahl erhält. Damit kommt er nicht klar. Irgendwo habe ich noch n Fehler 
in der Syntax offensichtlich. Aber einen String als #define is sowieso 
schwierig oder? Kannst du mir da noch n Tip geben wo der Hase begraben 
liegt?

von Bauform B. (bauformb)


Lesenswert?

Ingo Less schrieb:
> SW_VERSION="${TARGET_OUTPUT_BASENAME}"

SW_VERSION="\"${TARGET_OUTPUT_BASENAME}\""

von Programmierer (Gast)


Lesenswert?

Ingo Less schrieb:
> Danke für die Hilfe, aber ich glaube man hat hier das EmBitz zu weit von
> Eclipse verfremdet.

EmBitz? Ich dachte es geht um System Workbench?

Ingo Less schrieb:
> Das heisst, er erzeugt ein #define, welches einen String statt einer
> Zahl erhält

Genau umgekehrt.

Ingo Less schrieb:
> Aber einen String als #define is sowieso schwierig oder?

Nö, da müssen nur Anführungsstriche drum, wie von Bauform B. gezeigt.

von Ingo Less (Gast)


Lesenswert?

Bauform B. schrieb:
> SW_VERSION="\"${TARGET_OUTPUT_BASENAME}\""
Astrein! Das war die Lösung! Vielen Dank euch beiden!

von Programmierer (Gast)


Lesenswert?

Ingo Less schrieb:
> Unter den BuildOptions kann ich dieses #define erzeugen:
> SW_VERSION="${TARGET_OUTPUT_BASENAME}

Das klingt stark nach Code::Blocks, also doch EmBitz. Da helfen die 
Hinweise zu Eclipse natürlich überhaupt nicht. Aber warum war dann zu 
Anfang die Rede von System Workbench?

von Ingo Less (Gast)


Lesenswert?

Programmierer schrieb:
> Das klingt stark nach Code::Blocks, also doch EmBitz
Verdammte Axt, du hast natürlich völlig Recht, es ging hier um EmBitz! 
Normalerweise arbeite ich mit System Workbench, habe aber noch ein altes 
Projekt aus EmBitz wieder beleben müssen, da habe ich mich anfangs 
gleich vertan -.-

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.