Ik gebruik WinAVR (de avr build van GCC). Als het mogelijk is zuo ik graag de build versie van het programma mee willen nemen zodat dit bijvoorbeeld op (LCD) display te zien is.
Ik heb zelf al in de GCC manual gekeken maar heb niets gevonden. Ook op AVRFreaks kon ik niets terug vinden.
Nu kan natuurlijk aan het begin van programma een #define opnemen maar om dit nou elke keer met de hand te veranderen...
Alvast bedankt
cor
Wat wil je als versie hebben?
Kun je wat met __DATE__ en __TIME__?
Anders wellicht wat buiten de compiler om en met -D als define meegeven?
Ik gebruik zelf WinArm (GCC voor de ARM), maar het princiepe werkt voor alle make omgevingen. Ik heb een kleine console app die de huidige datum output:
int main(int argc, char* argv[])
{
time_t time_now = time(NULL);
struct tm *now = localtime(&time_now);
printf ("const char _BUILDDATE[]= \"%.4i-%.2i-%.2i %.2i:%.2i\";\n", now->tm_year+1900,now->tm_mon+1,now->tm_mday, now->tm_hour, now->tm_min);
return 0;
}
Deze roep ik aan vanuit de makefile en reroute de output naar builddate.c. deze builddate.c compile ik dan mee.
In de makefile staat iets van:
...
SRC += builddate.c
...
all: builddate begin gccversion sizebefore build sizeafter finished end
...
builddate:
./builddate.exe > builddate.c
...
In je code kan je dan _BUILDDATE gebruiken om de bouwdatum af te drukken.
Omdat __DATE__ niet overal werkt. Ken GCC voor de AVR niet dus vandaar mijn oplossing. Als __DATE__ werkt, zou ik die ook zeker gebruiken.
Hoi allemaal,
bedankt voor de reacties, 'k ga ze eens beproeven en laat het weten. Als er iemand nog een idee heeft om het build nummer te includen op een andere wijze dan de slimme van Lexy, dan ben ik benieuwd!
cor
Op 29 mei 2007 23:08:39 schreef Lexy:
Omdat __DATE__ niet overal werkt. Ken GCC voor de AVR niet dus vandaar mijn oplossing. Als __DATE__ werkt, zou ik die ook zeker gebruiken.
Hmz... non-ANSI compliant C compilers (of in dit geval meer: pre-processors)... Bestaan die nog? Als jij het zegt...
Overigens is jouw foefje best handig als het date format je niet aan staat. Maar dat was de vraag niet...
Ik heb weleens ergens gewerkt waar de projectnaam en het versienummer verwerkt was in de directory waarin het project stond. Dat werd met een scriptje opgevist en meegecompileerd. Erg handig want daarmee kon je altijd de source terugvinden waarmee een stuk firmware was gecompileerd.
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
echo "char source[] = \"$(pwd)\"" > source.h
of zoiets. Voor een bedrijf wellicht handig. Voor mij volstaat het, dat elk project een unieke naam krijgt; kan je de broncode ook gemakkelijk terugvinden.
De manier die ik gebruik, had ik oorspronkelijk gemaakt om ook een automatisch build nummer achter het versie nummer te zetten. Was iets van 'V1.0 Build 1234'. Elke keer als je een build maakte, werd het nummer verhoogt. Later heb ik alleen de tijd en datum gebruikt.
Ik ken ook bedrijven die op deze manier nog meer info in hun build stoppen, zoals op welke PC de build gedraait is en zo.
De methode van pros is inderdaad ook handig, maar werkt alleen op *nix systemen denk ik.
OK ff een update na alle tips.
1) Met avr-gcc en preprocessor werken de __DATE__ en de __TIME__ zonder problemen. Build nummer zelf oid kan ik nergens terug vinden.
Dus Lexy's tip gebruikt. Delphi console app geschreven die checkt of het bestand buildver.h bestaat. Zoniet dan wordt er een file gemaakt met daarin een "#define __BUILDVER__ 1" Bestaat buildver.h wel, dan wordt de build versie uitgelezen en met 1 verhoogt terug geschreven.
2) In de source code staat een #include <buildver.h>. Nu alleen nog iets vinden om AVRStudio/avr-gcc buildver.exe te laten aanroepen aan het begin van het builden.
Ik kan handmatig een makefile aanmaken zoals Lexy beschrijft mara op dit moment gebeurt dat automatisch door VARStudio en zou het jammer vinden om dit overhoop te gooien.
Cor
Kun je aan het einde van de build van de excutable waar je dat gekluste header file in gebruikt dat header file weg mikken? Zet er vervolgens een dependency op...
Kun je de string die je hebben wilt in een makefile variable krijgen? Kun je die met -D aan je compiler voeren.
Geen idee of dat bij gegenereerde make files ook wil...
Op 30 mei 2007 12:14:03 schreef Marco69:
Kun je aan het einde van de build van de xexcutable waar je dat gekluste header file in gebruikt dat header file meg mikken? Zet er vervolgens een dependency op...Kun je de string die je hebben wilt in een makefile variable krijgen? Kun je die met -D aan je compiler voeren.
Geen idee of dat bij gegenereerde make files ook wil...
Marco, bedankt voor je reactie maar het is me niet helemaal duidelijk wat je probeert te zeggen (sorry ben geen expert)
In het kort het concept van makefiles:
Om een bepaald file te maken heeft het ding dependencies op andere files. Die moeten dus eerst gemaakt worden.
Voorbeeld: om een executable te maken, moet je eerst de object files bouwen.
Je zou het dus als een soort recursie kunnen zien.
Als je nou een dependency zet op het gegenereerde header file zet, zal je make tool kijken of die er is. Zo niet, gaat die kijken of er een make rule voor is en zo ja die uitvoeren (als die makerule er niet is, klapt het ding eruit met een foutmelding).
Hiermee forceer je dat dat header file gemaakt wordt voordat hetgeen wat 'm nodig heeft gebouwd wordt.
Als je nou direct na het bouwen van 'het ding wat 'm nodig heeft' dat header file weer weg mietert, zal bij een volgende build dat header file opnieuw gemaakt worden. Met de huidige datum en tijd enzo.
Het foefje met -D: Dit is een compiler optie. Hiermee kun je op de command line defines meegeven, alsof ze met een #define in je code staan.