| # -*-perl-*- | |
| $description = "Test the load operator."; | |
| $details = "Test dynamic loading of modules."; | |
| # Don't do anything if this system doesn't support "load" | |
| exists $FEATURES{load} or return -1; | |
| # First build a shared object | |
| # Provide both a default and non-default load symbol | |
| 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" | |
| int plugin_is_GPL_compatible; | |
| int | |
| testload_gmk_setup (gmk_floc *pos) | |
| { | |
| (void)pos; | |
| gmk_eval ("TESTLOAD = implicit", 0); | |
| return 1; | |
| } | |
| int | |
| explicit_setup (gmk_floc *pos) | |
| { | |
| (void)pos; | |
| gmk_eval ("TESTLOAD = explicit", 0); | |
| return 1; | |
| } | |
| EOF | |
| close($F) or die "close: testload.c: $!\n"; | |
| # Make sure we can compile | |
| # CONFIG_FLAGS are loaded from config-flags.pm and set by configure | |
| my $sobuild = "$CONFIG_FLAGS{CC} ".($srcdir? "-I$srcdir":'')." $CONFIG_FLAGS{CPPFLAGS} $CONFIG_FLAGS{CFLAGS} -shared -fPIC $CONFIG_FLAGS{LDFLAGS} -o testload.so testload.c"; | |
| my $clog = `$sobuild 2>&1`; | |
| if ($? != 0) { | |
| $verbose and print "Failed to build testload.so:\n$sobuild\n$_"; | |
| return -1; | |
| } | |
| # TEST 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"); | |
| # TEST 2 | |
| # Load using an explicit function | |
| run_make_test(q! | |
| PRE := $(.LOADED) | |
| load ./testload.so(explicit_setup) | |
| POST := $(.LOADED) | |
| all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD) | |
| !, | |
| '', "pre= post=testload.so explicit\n"); | |
| # TEST 4 | |
| # Check multiple loads | |
| run_make_test(q! | |
| PRE := $(.LOADED) | |
| load ./testload.so | |
| load testload.so(explicit_setup) | |
| POST := $(.LOADED) | |
| all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD) | |
| !, | |
| '', "pre= post=testload.so implicit\n"); | |
| # TEST 5 | |
| # Check auto-rebuild of loaded file that's out of date | |
| utouch(-10, 'testload.so'); | |
| touch('testload.c'); | |
| 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, | |
| '', "rebuilding testload.so\npre= post=testload.so implicit\n"); | |
| # TEST 5 | |
| # Check auto-rebuild of loaded file when it doesn't exist | |
| unlink('testload.so'); | |
| run_make_test(q! | |
| PRE := $(.LOADED) | |
| -load ./testload.so(explicit_setup) | |
| POST := $(.LOADED) | |
| all: ; @echo pre=$(PRE) post=$(POST) $(TESTLOAD) | |
| %.so: %.c ; @echo "rebuilding $@"; !.$sobuild, | |
| '', "rebuilding testload.so\npre= post=testload.so explicit\n"); | |
| unlink(qw(testload.c testload.so)) unless $keep; | |
| # This tells the test driver that the perl test script executed properly. | |
| 1; |