IBM Support

When building a program in SCLM, why is only one step, the binder, executing?

Question & Answer


Question

I have a language definition that has several build steps, including a compiler step and a binder (linkedit) step. SCLM should execute each requested translator, in order, provided the previous one completed successfully. Building a member with this language produces correct output the first time. However, when I build the member again, the input to the first translator is sent to the binder, not the translator requested for that step. For example, my assembler program is being processed by IEWL, instead of the assembler.

Answer

You might have an incorrect KEYREF=LOAD in the language definition. SCLM builds internal architecture definitions for every source module. The architecture is based off the KEYREF keywords in the language definition.

If the FLMALLOC statement for the SYSLMOD ddname has a KEYREF=LOAD keyword, like this:

    FLMALLOC  IOTYPE=P,KEYREF=LOAD,RECFM=U,LRECL=0,       X
        DIRBLKS=20,DDNAME=SYSLMOD,DFLTTYP=LOAD              
   

then the internal architecture definition is going to be an LEC, or Link Edit Control ARCHDEF.

Often the build produces an error like this:

 IEW2322I 1220  1    INCLUDE SLFVNW9Y(PRJ20612)              
 IEW2322I 1220  2   * program application                    
 IEW2322I 1220  3   prj20612 csect                            
 IEW2326E 1221 THE FOLLOWING INVALID RECORD HAS BEEN SEEN:    
          prj20612 csect    

In this case, the program source is being sent to the binder, instead of the assembler.

The error can occur for any language definition that compiles then link edits. Similar error messages display for COBOL, C, pascal, or any other translator executed before the binder.

To be sure whether or not this is your problem, check the build map. Use the M command from the SCLM Library Utility to look at the build map for the source member being built. . If the build map has

 Language . . . . : LECMAP

then the member will be built as if it is to be a load module.

To resolve the problem, change the language definition to eliminate the KEYREF=LOAD keyword.

For example, change the FLMALLOC for the SYSLMOD ddname to have KEYREF=OUTx, like this:

    FLMALLOC  IOTYPE=P,KEYREF=OUT3,RECFM=U,LRECL=0,       X
        DIRBLKS=20,DDNAME=SYSLMOD,DFLTTYP=LOAD                        

  

[{"Line of Business":{"code":"","label":""},"Business Unit":{"code":"BU054","label":"Systems w\/TPS"},"Product":{"code":"SSCVRUA","label":"SCLM for z\/OS"},"ARM Category":[{"code":"","label":""}],"Platform":[{"code":"PF035","label":"z\/OS"}],"Version":"All Version(s)"}]

Document Information

Modified date:
31 March 2021

UID

dwa1297490