On May 17, 2012, at 11:15 AM, Craig A. Berry wrote:

> 
> On May 16, 2012, at 8:34 AM, Nicholas Clark wrote:
> 
[some text deleted]

>> 9: The IA64 machine *initially* fails like this:
>> 
>> MCR PTAC$DKA0:[NCLARK.I.perl5160-RC2]miniperl.exe "-I[--.lib]" "-I[--.lib]" 
>> "-ME
>> xtUtils::Command" -e "cp" "--" DYNALOADER.OPT 
>> [--.LIB.AUTO.DYNALOADER]DYNALOADER
>> .OPT
>> %MMS-F-GWKNOACTS, Actions to update DL_VMS.C are unknown.
>> %MMS-F-GWKNOACTS, Actions to update DL_VMS.C are unknown.
> 
> The problem here is that MMK can infer that it needs to generate dl_vms.c 
> from dl_vms.xs, but MMS can't do that.
> 

Makefile.pl is currently placing the following lines in the MMS file:

.SUFFIXES :
.SUFFIXES : $(OBJ_EXT) .c .cpp .cxx .xs

and

.xs.c :
        $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs 
>$(MMS$TARGET)

and (for this particular instance)

dl_win32.c dl_aix.c dl_dld.c dl_vmesa.c dl_dllload.c dl_dyld.c dl_none.c 
dl_hpux.c dl_beos.c dl_mpeix.c dl_dlopen.c dl_next.c dl_symbian.c dl_vms.c : 
$(XSUBPPDEPS)

MMK then searches the list of suffixes that follow .c to see if it has a rule 
to build the .c file since no explicit action is given.  It finds the .xs.c 
rule and executes it.  MMS does not do this.

There are two ways to address this.

1. Instead of having makefile.pl write out the .xs.c line as a user-defined 
rule, write it out as an action line after the 3rd entry above so that it reads 
like this:

dl_win32.c dl_aix.c dl_dld.c dl_vmesa.c dl_dllload.c dl_dyld.c dl_none.c 
dl_hpux.c dl_beos.c dl_mpeix.c dl_dlopen.c dl_next.c dl_symbian.c dl_vms.c : 
$(XSUBPPDEPS)
        $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs 
>$(MMS$TARGET)

2. When makefile.pl writes out the .xs.c user-defined rule, have it add the 
following:

.DEFAULT :
        IF F$LOCATE("]XSUBPP","$+") .NE. F$LENGTH("$+") THEN $(XSUBPPRUN) 
$(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)

The second option has the added benefit of providing a null action for anything 
else that MMS can't figure out how to build which takes care of the "actions to 
build STATIC not found" error as well.

On an unrelated issue:

Can the code invoked by makefile.pl tell whether perl itself is being built or 
if a perl extension is being built?  If so, would it be possible to have the 
"install" part of the perl build process add the following files with their 
indicated contents to the directory PERL_ROOT:[LIB…CORE]?

__DECC_INCLUDE_EPILOGUE.H
#pragma names restore

__DECC_INCLUDE_PROLOGUE.H;1
#pragma names save
#pragma names uppercase
#pragma names truncated

This way, the makefile.pl for extensions can automatically add 
/names=(as_is,shortened) to the CC command line when building extensions.  This 
is a requirement to build a number of extensions, not only because they might 
use an external library with very long names but also because some programmers 
out there still think it is clever to use different routine/variable names that 
differ only in case.  Those two files will cause all files included in, or by, 
the […core]*.h files to be treated as if /names=(uppercase,truncated) had been 
specified.  The routine that converts .xs to .c already handles truncating any 
names that are part of perl so the shortened only takes effect for references 
to external libraries.

Alternatively, one could build perl with /names=shortened, and change the 
prologue file accordingly, and completely eliminate the process of manually 
shortening names.

Thoughts?

Mark Berryman


Reply via email to