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

Reply via email to