One of the most valuable enhancements RPG IV has over its predecessors is its ability to interpret CL compiler command parameters stored in the source member. This ability is found exclusively in RPG IV and does not require the purchase of any third-party tools.
Embedding compiler parameters serves two purposes: (1) It allows you or someone else to avoid the need to remember the compiler parameters when you're compiling the source member, and (2) it allows you to avoid prompting the compiler before submitting the compilation of the source member.
In RPG IV, compiler parameters may be embedded on the Header specification. Since the Header specification is open in positions 8 to 80, any compiler parameter may be specified. In addition, if you run out of room on one Header specification, simply start another one and continue to enter the desired keywords.
Before I describe some of the keywords you can specify on the Header specification, I need to describe how the Header specification is interpreted by the compiler.
Header Specification
The Header specification (officially referred to as the "Control specification") is the first source statement specified in an RPG program. The compiler needs a Header specification to control how the source member is compiled. But the Header specification is optional, so the compiler uses a default Header specification if none is specified in the source member itself.
The default Header specification may be stored in a data area named RPGLEHSPEC. This data area may appear in any library on your library list (that is, the library list in effect at the time you compile the source member). The data area must be type *CHAR, and it should be at least 80 bytes in length. It may be longer if it is necessary to specify additional keywords that take up more than 80 bytes.
To create a default Header specification data area named RPGLEHSPEC in QGPL with a length of 80 bytes, use the following CL command:
Once the data area is created, you may use the CHGDTAARA CL command to set the values of the various keywords whose settings you would like to standardize.
To set the values of the default keywords to use, specify them with the same syntax as the CHGCMDDFT command.
The downside of using a default data area is that you don't get the accumulated effect one might expect from such a feature. That is, if you use a default data area and a Header specification, only the Header specification applies, not both. This cumulative capability would be a nice feature, but for now it's only a future objective.
Another default Header specification is shipped with the RPG compiler. This one is named DFTLEHSPEC and is shipped in the QRPGLE library. This data area may be used instead of one of your own creation. Again, use the CHGDTAARA CL command to set the default compiler parameter values in that data area. For example:
The compiler searches for default CRTBNDRPG or CRTRPGMOD parameters in the following sequence:
1. A Header specification specified in the source member itself
2. The data area named RPGLEHSPEC somewhere on your library list
3. The data area named DFTLEHSPEC in QRPGLE
Once the compiler detects one of these things, it stops looking for the next item on the list. Therefore, if you specify a Header specification in your source code, neither of the data areas will be used to set compiler parameter defaults.
Setting RPG Compiler Defaults in Source
To specify the compiler parameters for any RPG IV source member, insert a Header specification at the top of the source member, and simply enter the keywords you wish to specify.
The keywords can be nearly any keywords from the CRTBNDRPG or CRTRPGMOD CL commands (with very few exceptions, one of which I'll discuss later in this article). However, you do not enter them the same way you would with the CL commands; because RPG IV is a programming language in itself, it has a set of valid literal values and special symbols; therefore, some of the values you specify must be specified as quoted values instead of simply text strings.
For example, the ACTGRP (activation group) parameter of the compiler commands would be specified as follows:
But on the CRTBNDRPG CL command, it would be specified without quotes:
One of the keywords that is not supported is the DBGVIEW keyword. This keyword may only be specified on the CRTBNDRPG and CRTxxxMOD commands. It would be helpful to be able to put this keyword in the Header specification and then condition it with compiler directives, but unfortunately, we cannot.
A keyword may be specified only once. However, you may specify multiple values for keywords when necessary. As with other areas of RPG IV, the colon (:) is used as the separator. For example, to specify three binding directory names, you'd do something like this:
There are three common mistakes developers make when specifying the values for compiler parameters:
1. They don't quote the parameter values.
2. They quote the parameter values but specify the value in lowercase.
3. They quote special values.
Here's an example of the first syntax error:
What's wrong? The value QC2LE is not known to RPG IV language, so it can't identify it. Therefore, the value must be enclosed in quotation marks.
Here's an example of the second syntax error:
What's wrong? Since the value is quoted, the system looks for the value QC2LE with a lowercase name. Since QC2LE is an uppercase object name, the system never locates it.
Here's an example of the third syntax error:
What's wrong? Sometimes, people get carried away with the quotes. They think either everything is quoted or nothing is quoted. The good rule of thumb is that when an asterisk is used, don't bother quoting the value. Of course, this doesn't apply to the EXTFILE and EXTMBR keywords on the File specification.
Using the Conditional Directives
You can take advantage of RPG IV's conditional compiler directives and have even more fun with Header specification keywords. By entering a statement as illustrated below, you can control which keywords are used when compiling:
..... /IF DEFINED(*CRTBNDRPG)
.....H DFTACTGRP(*NO)
..... /ENDIF
In this example, the /IF conditional compiler directive is used to test if the source member is being compiled with the CRTBNDRPG command (PDM option 14). If so, it inserts a Header specification that overrides the DFTACTGRP parameter. This allows you to "punch in" PDM option 14 on the source member to compile it.
The keywords that may be used on the Header specification are listed in IBM's RPG manual or in Table 2.4 on pages 38 to 43 in my book The Modern RPG IV Language, Third Edition. These keywords have the same purpose and function as the keywords of the CRTBNDRPG and CRTRPGMOD commands. When a keyword is used on the Header specification, the corresponding keyword of the CRTBNDRPG and CRTRPGMOD commands is ignored.
Using the compiler keyword parameters on the Header specification can save you a lot of time when you need to recompile a source member. You can avoid errors and parameter setting conflicts that can arise. When used in conjunction with the conditional directives, the Header specification is a powerful ally in compiling your RPG IV source members.
Bob Cozzi has been programming in RPG since 1978. Since then, he has written many articles and several books, including The Modern RPG Language --the most widely used RPG reference manual in the world. Bob is also a very popular speaker at industry events such as RPG World (www.rpgworld.com) and is the author of his own Web site, www.rpgiv.com, and of the RPG ToolKit (www.rpgiv.com/toolkit), an add-on library for RPG IV programmers.
LATEST COMMENTS
MC Press Online