| # -*-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; |