On Wed, Jul 06, 2011 at 03:21:47PM +0200, Richard Guenther wrote: > On Wed, Jul 6, 2011 at 2:50 PM, Basile Starynkevitch > <bas...@starynkevitch.net> wrote: > > > > I belive it can help to make plugin code more robust. A serious plugin > > developper could then add in his plugin code something like > > > > #if GCCPLUGIN_VERSION != 4007 > > #error this plugin can be built only for GCC 4.7 > > #endif > > > > and with such a feature the plugin won't even compile if, for one reason or > > another, the wrong gcc has been considered i.e. passed with > > -I$(gcc -print-file-name=plugin) > > > > This brings some help to the careful plugin coder, and don't harm GCC > > itself. > > > > For GCC trunk or branches we have the BUILDING_GCC_VERSION macro, but it > > does not appear in the headers insdtalled by gcc-4.6-plugin-dev package. > > Plugins can currently only check for version compatibility at plugin dlopen > > time, not at plugin build time! > > I'd say exposng major, minor and patchlevel (instead of micro) > should be enough.
Thanks for the comment. I am attaching a diff to GCC trunk 175912, and I documented the feature. #### gcc/ChangeLog entry ##### 2011-07-06 Basile Starynkevitch <bas...@starynkevitch.net> * configure.ac (plugin-version.h): Generate GCCPLUGIN_VERSION_MAJOR, GCCPLUGIN_VERSION_MINOR, GCCPLUGIN_VERSION_PATCHLEVEL, GCCPLUGIN_VERSION constant integer macros. * configure: Regenerate. * doc/plugins.texi (Building GCC plugins): Mention GCCPLUGIN_VERSION ... constant macros in plugin-version.h. ### end of gcc/ChangeLog entry #### Ok for trunk? Regards. -- Basile STARYNKEVITCH http://starynkevitch.net/Basile/ email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359 8, rue de la Faiencerie, 92340 Bourg La Reine, France *** opinions {are only mines, sont seulement les miennes} ***
Index: gcc/doc/plugins.texi =================================================================== --- gcc/doc/plugins.texi (revision 175912) +++ gcc/doc/plugins.texi (working copy) @@ -417,6 +417,17 @@ Inside plugins, this @code{plugin} directory name can be queried by calling @code{default_plugin_dir_name ()}. +Plugins may know, when they are compiled, the GCC version for which +@file{plugin-version.h} is provided. The constant macros +@code{GCCPLUGIN_VERSION_MAJOR}, @code{GCCPLUGIN_VERSION_MINOR}, +@code{GCCPLUGIN_VERSION_PATCHLEVEL}, @code{GCCPLUGIN_VERSION} are +integer numbers, so a plugin could ensure it is built for GCC 4.7 with +@smallexample +#if GCCPLUGIN_VERSION != 4007 +#error this GCC plugin is for GCC 4.7 +#endif +@end smallexample + The following GNU Makefile excerpt shows how to build a simple plugin: @smallexample Index: gcc/configure =================================================================== --- gcc/configure (revision 175912) +++ gcc/configure (working copy) @@ -11072,6 +11072,11 @@ cat > plugin-version.h <<EOF #include "configargs.h" +#define GCCPLUGIN_VERSION_MAJOR `cut -d. -f1 $srcdir/BASE-VER` +#define GCCPLUGIN_VERSION_MINOR `cut -d. -f2 $srcdir/BASE-VER` +#define GCCPLUGIN_VERSION_PATCHLEVEL `cut -d. -f3 $srcdir/BASE-VER` +#define GCCPLUGIN_VERSION (GCCPLUGIN_VERSION_MAJOR*1000 + GCCPLUGIN_VERSION_MINOR) + static char basever[] = "$gcc_BASEVER"; static char datestamp[] = "$gcc_DATESTAMP"; static char devphase[] = "$gcc_DEVPHASE"; @@ -17623,7 +17628,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 17626 "configure" +#line 17631 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -17729,7 +17734,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 17732 "configure" +#line 17737 "configure" #include "confdefs.h" #if HAVE_DLFCN_H Index: gcc/configure.ac =================================================================== --- gcc/configure.ac (revision 175912) +++ gcc/configure.ac (working copy) @@ -1511,6 +1511,11 @@ cat > plugin-version.h <<EOF #include "configargs.h" +#define GCCPLUGIN_VERSION_MAJOR `cut -d. -f1 $srcdir/BASE-VER` +#define GCCPLUGIN_VERSION_MINOR `cut -d. -f2 $srcdir/BASE-VER` +#define GCCPLUGIN_VERSION_PATCHLEVEL `cut -d. -f3 $srcdir/BASE-VER` +#define GCCPLUGIN_VERSION (GCCPLUGIN_VERSION_MAJOR*1000 + GCCPLUGIN_VERSION_MINOR) + static char basever[] = "$gcc_BASEVER"; static char datestamp[] = "$gcc_DATESTAMP"; static char devphase[] = "$gcc_DEVPHASE";