]> git.ipfire.org Git - thirdparty/make.git/commitdiff
[SV 63044] load: Update .LOADED if the setup function returns -1
authorDmitry Goncharov <dgoncharov@users.sf.net>
Sun, 11 Sep 2022 02:42:28 +0000 (22:42 -0400)
committerPaul Smith <psmith@gnu.org>
Sun, 11 Sep 2022 02:42:28 +0000 (22:42 -0400)
* src/load.c (load_file): Update .LOADED if setup returns non-0.
* tests/scripts/features/load: Change the return value based on an
environment variable.  Ensure that returning -1 still adds to
.LOADED.  Also add a test that verifies that make doesn't try to
rebuild the loaded file if -1 is returned.

src/load.c
tests/scripts/features/load

index 263eb35790601334264e8f1ba52b8efb29e6189f..701ca4da729f389e17ddfdd6b8c5a9a34d5dcd2b 100644 (file)
@@ -211,8 +211,9 @@ load_file (const floc *flocp, const char **ldname, int noerror)
   /* Invoke the symbol.  */
   r = (*symp) (flocp);
 
-  /* If it succeeded, add the load file to the loaded variable.  */
-  if (r > 0)
+  /* If it succeeded, add the load file to the loaded variable.
+     Anything other than 0, including -1, is a success.  */
+  if (r)
     {
       size_t loadlen = strlen (loaded);
       char *newval = alloca (loadlen + strlen (*ldname) + 2);
index 6d1978a5bf025cb99195dc780a9e2c4567288899..b462ed9cca572031865bda5ea7bc73ab510e96a0 100644 (file)
@@ -19,11 +19,10 @@ unlink(qw(testload.c testload.so));
 
 open(my $F, '> testload.c') or die "open: testload.c: $!\n";
 print $F <<'EOF' ;
-#include <string.h>
-#include <stdio.h>
-
 #include "gnumake.h"
 
+char* getenv (const char*);
+
 int plugin_is_GPL_compatible;
 
 int testload_gmk_setup (gmk_floc *);
@@ -34,6 +33,8 @@ testload_gmk_setup (gmk_floc *pos)
 {
     (void)pos;
     gmk_eval ("TESTLOAD = implicit", 0);
+    if (getenv("TESTAPI_KEEP"))
+      return -1;
     return 1;
 }
 
@@ -42,6 +43,8 @@ explicit_setup (gmk_floc *pos)
 {
     (void)pos;
     gmk_eval ("TESTLOAD = explicit", 0);
+    if (getenv("TESTAPI_KEEP"))
+      return -1;
     return 1;
 }
 EOF
@@ -79,7 +82,7 @@ all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD)
 !,
               '', "pre= post=testload.so explicit\n");
 
-# TEST 4
+# TEST 3
 # Check multiple loads
 run_make_test(q!
 PRE := $(.LOADED)
@@ -90,7 +93,7 @@ all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD)
 !,
               '', "pre= post=testload.so implicit\n");
 
-# TEST 5
+# TEST 4
 # Check auto-rebuild of loaded file that's out of date
 utouch(-10, 'testload.so');
 touch('testload.c');
@@ -115,6 +118,32 @@ all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD)
 %.so: %.c ; @echo "rebuilding $@"; !.$sobuild,
               '', "rebuilding testload.so\npre= post=testload.so explicit\n");
 
+# sv 63044.
+# Test that the loaded shared object is present in .LOADED when the setup
+# routine returns -1.
+$ENV{TESTAPI_KEEP} = 1;
+run_make_test(q!
+PRE := $(.LOADED)
+load testload.so
+POST := $(.LOADED)
+all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD)
+!,
+              '--warn-undefined-variables', "pre= post=testload.so implicit\n");
+
+# Check that we don't auto-rebuild of loaded file that's out of date
+# if we return -1 from the setup
+utouch(-10, 'testload.so');
+touch('testload.c');
+
+$ENV{TESTAPI_KEEP} = 1;
+run_make_test(q!
+PRE := $(.LOADED)
+load ./testload.so
+POST := $(.LOADED)
+all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD)
+testload.so: testload.c ; @echo "rebuilding $@"; !.$sobuild,
+              '', "pre= post=testload.so implicit\n");
+
 unlink(qw(testload.c testload.so)) unless $keep;
 
 # This tells the test driver that the perl test script executed properly.