Message ID | 20110706134642.GA27870@ours.starynkevitch.net |
---|---|
State | New |
Headers | show |
On Wed, Jul 6, 2011 at 3:46 PM, Basile Starynkevitch <basile@starynkevitch.net> wrote: > On Wed, Jul 06, 2011 at 03:21:47PM +0200, Richard Guenther wrote: >> On Wed, Jul 6, 2011 at 2:50 PM, Basile Starynkevitch >> <basile@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 <basile@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? I'm not sure using cut is portable enough - for bversion.h generation we use sed instead (see Makefile.in), so I suppose copying that would be better. I can't approve the configury changes but the change itself looks reasonable to me Thanks, Richard. > 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";