This might be rather a big favour request.
Would it be possible to augment the configure.com code that finds extensions
to correctly partition nonxs_extensions from known_extensions?
(being the rather bonkers way that Configure partitions XS and non-XS
extensions)
To properly split out dual life modules into ext, I think it's going to be
necessary to add a Makefile.SH/Makefile/makefile.mk/descrip_mms.template
rule to have mkppport run after the nonxs_ext are built, but in turn, it needs
to run before dynamic_ext are built, hence the need for a split.
I'm not sure how easy this is, because right now Configure does it this way:
$ls -1 $xxx $$.tmp;
if $contains \.xs$ $$.tmp /dev/null 21; then
known_extensions=$known_extensions $this_ext;
elif $contains \.c$ $$.tmp /dev/null 21; then
known_extensions=$known_extensions $this_ext;
elif $test $this_ext = IO/Compress; then
known_extensions=$known_extensions $this_ext;
elif $test -d $xxx; then
nonxs_extensions=$nonxs_extensions $this_ext;
fi;
$rm -f $$.tmp;
using file globbing in ext/, whereas configure.com does it by text processing
MANIFEST:
$ known_extensions =
$ xxx =
$ OPEN/READ CONFIG 'manifestfound'
$ext_loop:
$ READ/END_OF_FILE=end_ext/ERROR=end_ext CONFIG line
$ IF F$EXTRACT(0,4,line) .NES. ext/ .AND. -
F$EXTRACT(0,8,line) .NES. vms/ext/ THEN goto ext_loop
$ line = F$EDIT(line,COMPRESS)
$ line = F$ELEMENT(0, ,line)
$ IF F$EXTRACT(0,4,line) .EQS. ext/
$ THEN
$ xxx = F$ELEMENT(1,/,line)
$ IF F$SEARCH([-.ext]''xxx'.DIR;1) .EQS. THEN GOTO ext_loop
$ ENDIF
$ IF F$EXTRACT(0,8,line) .EQS. vms/ext/
$ THEN
$ xxx = F$ELEMENT(2,/,line)
$ IF F$SEARCH([-.vms.ext]''xxx'.DIR;1) .EQS. THEN GOTO ext_loop
$ xxx = VMS/ + xxx
$ ENDIF
$ IF xxx .EQS. DynaLoader THEN goto ext_loop ! omit
$!
$! (extspec = xxx) =~ tr!-!/!
$ extspec =
$ idx = 0
$ replace_dash_with_slash:
$ before = F$ELEMENT(idx, -, xxx)
$ IF before .EQS. - THEN goto end_replace_dash_with_slash
$ IF extspec .NES.
$ THEN
$ extspec = extspec + /
$ ENDIF
$ extspec = extspec + before
$ idx = idx + 1
$ goto replace_dash_with_slash
$
$ end_replace_dash_with_slash:
$
$ xxx = known_extensions
$ may_already_have_extension:
$ idx = F$LOCATE(extspec, xxx)
$ extlen = F$LENGTH(xxx)
$ IF idx .EQ. extlen THEN goto found_new_extension
$! But Flirble may just be part of Acme-Flirble
$ IF idx .GT. 0 .AND. F$EXTRACT(idx - 1, 1, xxx) .NES.
$ THEN
$ xxx = F$EXTRACT(idx + F$LENGTH(extspec) + 1, extlen, xxx)
$ GOTO may_already_have_extension
$ ENDIF
$! But Foo may just be part of Foo-Bar so check for equality.
$ xxx = F$EXTRACT(idx, extlen - idx, xxx)
$ IF F$ELEMENT(0, , xxx) .EQS. extspec
$ THEN
$ GOTO ext_loop
$ ELSE
$ xxx = F$EXTRACT(F$LENGTH(extspec) + 1, extlen, xxx)
GOTO may_already_have_extension
$ ENDIF
$!
$ found_new_extension:
$ known_extensions = known_extensions + ''extspec'
$ goto ext_loop
$end_ext:
$ close CONFIG
$ DELETE/SYMBOL xxx
$ DELETE/SYMBOL idx
$ DELETE/SYMBOL extspec
$ DELETE/SYMBOL extlen
$ known_extensions = F$EDIT(known_extensions,TRIM,COMPRESS)
If it were possible to make the above into a function, then partitioning
nonxs from XS would seem to be as simple as
Feed the function the equivalent of `grep \.xs MANIFEST` to find the XS
extensions
Feed the function MANIFEST to find all extensions
Iterate over the list of all extensions - everything that isn't an XS
extension, you put into nonxs_extensions
But I don't know if functions are possible. And I can't see an easy way to
fit any sort of does this contain the substring '.xs' logic cleanly into
the above code, without wholesale copy-paste of may_already_have_extension
into one that does lines containing '.xs', and one that does not.
(I'm not sure why the Configure shell code contains tests for .c too -
historical reasons?
Also, it looks like some code can go from the above, now that there are
no directories with XS code in vms/ext)
If VMS does partition into nonxs_extensions correctly, I think that this tweak
would be needed:
diff --git a/make_ext.pl b/make_ext.pl
index 507f047..cfc12c2 100644
--- a/make_ext.pl
+++ b/make_ext.pl
@@ -179,6 +179,7 @@ elsif ($is_VMS) {
$perl = $^X;
push @extspec, (split ' ', $Config{static_ext}) if $static;
push @extspec, (split ' ', $Config{dynamic_ext}) if $dynamic;
+push @extspec, (split ' ', $Config{nonxs_ext}) if $dynamic;
}
foreach my $spec (@extspec) {
Nicholas Clark