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 2>&1; then known_extensions="$known_extensions $this_ext"; elif $contains "\.c$" $$.tmp > /dev/null 2>&1; 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