Add requirement for plugin_is_GPL_compatible symbol in loaded objects.

This commit is contained in:
Paul Smith 2013-05-14 22:53:42 -04:00
parent 58dae24352
commit c21c1455fd
6 changed files with 41 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2013-05-14 Paul Smith <psmith@gnu.org>
* doc/make.texi (Loaded Object API): Document the requirement for
the plugin_is_GPL_compatible symbol.
* load.c (load_object): Check for plugin_is_GPL_compatible symbol.
2013-05-13 Paul Smith <psmith@gnu.org> 2013-05-13 Paul Smith <psmith@gnu.org>
* filedef.h (struct file): Add a builtin flag. * filedef.h (struct file): Add a builtin flag.

View File

@ -11058,6 +11058,24 @@ functions may make use of the @code{gmk_expand} and @code{gmk_eval}
routines to perform their tasks, then optionally return a string as routines to perform their tasks, then optionally return a string as
the result of the function expansion. the result of the function expansion.
@subsubheading Loaded Object Licensing
@cindex loaded object licensing
@cindex plugin_is_GPL_compatible
Every dynamic extension should define the global symbol
@code{plugin_is_GPL_compatible} to assert that it has been licensed
under a GPL-compatible license. If this symbol does not exist,
@code{make} emits a fatal error and exits when it tries to load your
extension.
The declared type of the symbol should be @code{int}. It does not need
to be in any allocated section, though. The code merely asserts that
the symbol exists in the global scope. Something like this is enough:
@example
int plugin_is_GPL_compatible;
@end example
@subsubheading Data Structures @subsubheading Data Structures
@table @code @table @code
@ -11185,6 +11203,8 @@ function in a file @file{mk_temp.c}:
#include <gnumake.h> #include <gnumake.h>
int plugin_is_GPL_compatible;
char * char *
gen_tmpfile(const char *nm, int argc, char **argv) gen_tmpfile(const char *nm, int argc, char **argv)
@{ @{

6
load.c
View File

@ -71,6 +71,12 @@ load_object (const gmk_floc *flocp, int noerror,
return NULL; return NULL;
} }
/* Assert that the GPL license symbol is defined. */
symp = dlsym (*dlp, "plugin_is_GPL_compatible");
if (! symp)
fatal (flocp, _("Loaded object %s is not declared to be GPL compatible"),
ldname);
symp = dlsym (*dlp, symname); symp = dlsym (*dlp, symname);
if (! symp) if (! symp)
fatal (flocp, _("Failed to load symbol %s from %s: %s"), fatal (flocp, _("Failed to load symbol %s from %s: %s"),

View File

@ -1,3 +1,8 @@
2013-05-14 Paul Smith <psmith@gnu.org>
* scripts/features/loadapi: Add plugin_is_GPL_compatible symbol.
* scripts/features/load: Ditto.
2013-05-13 Paul Smith <psmith@gnu.org> 2013-05-13 Paul Smith <psmith@gnu.org>
* scripts/features/output-sync (output_sync_set): Update for new * scripts/features/output-sync (output_sync_set): Update for new

View File

@ -20,6 +20,8 @@ print $F <<'EOF' ;
#include "gnumake.h" #include "gnumake.h"
int plugin_is_GPL_compatible;
int int
testload_gmk_setup (gmk_floc *pos) testload_gmk_setup (gmk_floc *pos)
{ {

View File

@ -20,6 +20,8 @@ print $F <<'EOF' ;
#include "gnumake.h" #include "gnumake.h"
int plugin_is_GPL_compatible;
static char * static char *
test_eval (const char *buf) test_eval (const char *buf)
{ {