Add requirement for plugin_is_GPL_compatible symbol in loaded objects.
authorPaul Smith <psmith@gnu.org>
Wed, 15 May 2013 02:53:42 +0000 (22:53 -0400)
committerPaul Smith <psmith@gnu.org>
Wed, 15 May 2013 02:53:42 +0000 (22:53 -0400)
ChangeLog
doc/make.texi
load.c
tests/ChangeLog
tests/scripts/features/load
tests/scripts/features/loadapi

index d482c2cfee0002460006bf87d9b28d740e94194d..c3175948acbc24ca7df98745c1c20eca511f4d5e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
 
        * filedef.h (struct file): Add a builtin flag.
index e3e5135de1a489bb7f53828154b254becbb04dfd..d1ceefb52402b141ab3756cbfb2ffca80b30c257 100644 (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
 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
 
 @table @code
@@ -11185,6 +11203,8 @@ function in a file @file{mk_temp.c}:
 
 #include <gnumake.h>
 
+int plugin_is_GPL_compatible;
+
 char *
 gen_tmpfile(const char *nm, int argc, char **argv)
 @{
diff --git a/load.c b/load.c
index f20c1c794edd69dc39bc978d5c112841d7dd84cf..655928ad117e953c4e37211c0a37885fb036142c 100644 (file)
--- a/load.c
+++ b/load.c
@@ -71,6 +71,12 @@ load_object (const gmk_floc *flocp, int noerror,
         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);
     if (! symp)
       fatal (flocp, _("Failed to load symbol %s from %s: %s"),
index 34e8cc295616af00fe8456632ae1ee6fd5fafefb..0abe96f22875c754e0c5284a1a1ae336eb8b9c6c 100644 (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>
 
        * scripts/features/output-sync (output_sync_set): Update for new
index 78d5c512bb363ebde03fd4d100e69d21bc6a3679..2e3f263c80d64aa23ad523bc3e09d689b537c179 100644 (file)
@@ -20,6 +20,8 @@ print $F <<'EOF' ;
 
 #include "gnumake.h"
 
+int plugin_is_GPL_compatible;
+
 int
 testload_gmk_setup (gmk_floc *pos)
 {
index 94a48a713dc4e0d97cddaaf393c4400e6781f713..4976ce3bcce3e88ec283da02c4a0291c88755cb2 100644 (file)
@@ -20,6 +20,8 @@ print $F <<'EOF' ;
 
 #include "gnumake.h"
 
+int plugin_is_GPL_compatible;
+
 static char *
 test_eval (const char *buf)
 {