diff --git a/CMakeLists.txt b/CMakeLists.txt index 2be40343f..68f77bace 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,7 @@ include(FindPackageMessage) include(GNUInstallDirs) set(CONFIG_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}") +set(AVRDUDE_BUILDSYSTEM "cmake") set(AVRDUDE_FULL_VERSION ${CMAKE_PROJECT_VERSION}) # ===================================== diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f7b1700b8..563829667 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -179,6 +179,7 @@ set(SOURCES avrpart.c bitbang.c bitbang.h + buildinfo.c buspirate.c buspirate.h butterfly.c diff --git a/src/Makefile.am b/src/Makefile.am index b075ea869..2c00fba1d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -106,6 +106,7 @@ libavrdude_la_SOURCES = \ avr_opcodes.c \ bitbang.c \ bitbang.h \ + buildinfo.c \ buspirate.c \ buspirate.h \ butterfly.c \ diff --git a/src/buildinfo.c b/src/buildinfo.c new file mode 100644 index 000000000..e551c513e --- /dev/null +++ b/src/buildinfo.c @@ -0,0 +1,51 @@ +#include + +#include + +static +const char *const libavrdude_buildinfo[] = { + AVRDUDE_FULL_VERSION, + "buildsystem: " AVRDUDE_BUILDSYSTEM, +#ifdef HAVE_LIBELF + "libelf", +#endif +#ifdef HAVE_LIBUSB + "libusb", +#endif +#ifdef HAVE_LIBUSB_1_0 + "libusb_1_0", +#endif +#ifdef HAVE_LIBHIDAPI + "libhidapi", +#endif +#ifdef HAVE_LIBHID + "libhid", +#endif +#ifdef HAVE_LIBFTDI + "libftdi", +#endif +#ifdef HAVE_LIBFTDI1 + "libftdi1", +#endif +#ifdef HAVE_LIBREADLINE + "libreadline", +#endif +#ifdef HAVE_LIBSERIALPORT + "libserialport", +#endif +#ifdef HAVE_PARPORT + "parport", +#endif +#ifdef HAVE_LINUXGPIO + "linuxgpio", +#endif +#ifdef HAVE_LINUXSPI + "linuxspi", +#endif + NULL +}; + +const char *const *avr_get_buildinfo(void) +{ + return libavrdude_buildinfo; +} diff --git a/src/cmake_config.h.in b/src/cmake_config.h.in index f11ca00cc..e3e829ab3 100644 --- a/src/cmake_config.h.in +++ b/src/cmake_config.h.in @@ -21,6 +21,7 @@ #endif #define AVRDUDE_FULL_VERSION "@AVRDUDE_FULL_VERSION@" +#define AVRDUDE_BUILDSYSTEM "@AVRDUDE_BUILDSYSTEM@" /* Options */ diff --git a/src/configure.ac b/src/configure.ac index 2abf92196..dc65ca0c5 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -91,6 +91,9 @@ AC_DEFINE_UNQUOTED([AVRDUDE_FULL_VERSION], ["$AVRDUDE_FULL_VERSION"], [The full avrdude version as displayed in -? and avrdude.conf]) AC_SUBST([AVRDUDE_FULL_VERSION]) +AC_DEFINE_UNQUOTED([AVRDUDE_BUILDSYSTEM], ["autotools"], + [The buildsystem used to build avrdude]) + # Define libavrdude libtool version from cmake libavrdude information dnl diff --git a/src/libavrdude.h b/src/libavrdude.h index 9bb35b991..b099c53b7 100644 --- a/src/libavrdude.h +++ b/src/libavrdude.h @@ -1202,6 +1202,8 @@ extern "C" { int avr_flush_cache(const PROGRAMMER *pgm, const AVRPART *p); int avr_reset_cache(const PROGRAMMER *pgm, const AVRPART *p); +const char *const *avr_get_buildinfo(void); + #ifdef __cplusplus } #endif diff --git a/src/main.c b/src/main.c index 16cb95f13..2cff32e0c 100644 --- a/src/main.c +++ b/src/main.c @@ -48,6 +48,8 @@ #include #endif +#include + #include "avrdude.h" #include "libavrdude.h" #include "config.h" @@ -228,6 +230,39 @@ const char *pgmid; // Programmer -c string static char usr_config[PATH_MAX]; // Per-user config file + +static +const char *const avrdude_buildinfo[] = { + AVRDUDE_FULL_VERSION, + "buildsystem: " AVRDUDE_BUILDSYSTEM, + NULL +}; + + +static void print_buildinfos(const char *const *buildinfo) +{ + for (unsigned int i=1; buildinfo[i]; ++i) { + msg_info("%3u. %s\n", i, buildinfo[i]); + } +} + + +static void print_version_message(void) +{ + msg_info("avrdude (...) %s\n", AVRDUDE_FULL_VERSION); + msg_info("Copyright (C) ...2024...\n"); + msg_info("License GPL...\n"); + msg_info("This is free software...\n"); + + msg_info("avrdude %s\n", avrdude_buildinfo[0]); + print_buildinfos(avrdude_buildinfo); + + const char *const *libavrdude_buildinfo = avr_get_buildinfo(); + msg_info("libavrdude %s\n", libavrdude_buildinfo[0]); + print_buildinfos(libavrdude_buildinfo); +} + + // Usage message static void usage(void) { char *home = getenv("HOME"); @@ -269,6 +304,7 @@ static void usage(void) { " -v Verbose output; -v -v for more\n" " -q Quell progress output; -q -q for less\n" " -l logfile Use logfile rather than stderr for diagnostics\n" + " --version Display build and version information\n" " -? | --help Display this usage\n" "\navrdude version %s, https://github.com/avrdudes/avrdude\n", progname, strlen(cfg) < 24? "config file ": "", cfg, AVRDUDE_FULL_VERSION); @@ -814,12 +850,14 @@ int main(int argc, char *argv[]) { #endif // Process command line arguments +#define LONGOPT_VERSION 0x2342 struct option longopts[] = { - {"help", no_argument, NULL, '?'}, - {NULL, 0, NULL, 0} + {"help", no_argument, NULL, '?'}, + {"version", no_argument, NULL, LONGOPT_VERSION}, + {NULL, 0, NULL, 0} }; - while((ch = getopt(argc, argv, "?Ab:B:c:C:DeE:Fi:l:nNp:OP:qrtT:U:vVx:", - longopts, NULL)) != -1) { + while((ch = getopt_long(argc, argv, "?Ab:B:c:C:DeE:Fi:l:nNp:OP:qrtT:U:vVx:", + longopts, NULL)) != -1) { switch(ch) { case 'b': // Override default programmer baud rate baudrate = str_int(optarg, STR_INT32, &errstr); @@ -965,6 +1003,11 @@ int main(int argc, char *argv[]) { exit(0); break; + case LONGOPT_VERSION: + print_version_message(); + exit(0); + break; + default: pmsg_error("invalid option -%c\n\n", ch); usage();