Appendix A
Differences between MMK and DEC/MMS
MMK is patterned after DEC/MMS, but does not fully implement all DEC/MMS functionality and provides other extended functionality. This appendix lists some of the differences between MMK and DEC/MMS.
Besides the differences in features, there are some differences in processing between MMK and DEC/MMS which may lead to different results or syntax errors in MMK for description files which operate properly under DEC/MMS. If possible, please report any such differences to the author so that they can be fixed.
A.1. DEC/MMS Features Not Supported in MMK
MMK does not support the following DEC/MMS features:
MMK does not support FMS forms libraries or CDD/Repository libraries.
MMK does not honor the “; action” syntax on dependency rule lines that can be used with DEC/MMS. Make sure all actions are on separate lines.
MMK does not support all of the command qualifiers supported by DEC/MMS. In addition, the MMK's /GENERATION qualifier is completely different from DEC/MMS's /GENERATE qualifier.
MMK does not automatically load the MMS$RULES file if that logical name is defined or that file exists in the current directory; you must specify /RULES on the MMK command to have it loaded. Use the MMK_LOCAL_RULES or MMK_PERSONAL_RULES logical names to have rules automatically loaded by MMK.
A.2. MMK Extended Features
MMK includes the following features not found in DEC/MMS:
MMK gives you more options for rules files, and is set up to allow multiple rules files to be present. Rule file processing follows this sequence:
The default rules compiled into MMK are loaded automatically unless /NORULES_FILE is specified on the MMK command.
A site-defined local rules file is loaded automatically if the logical name MMK_LOCAL_RULES is defined (use /NOLOCAL_RULES to override).
If the /RULES_FILE qualifier is specified, any rules files listed there are loaded; if none are listed, the default is to load the file MMS$RULES.MMS (or the file pointed to by the logical name MMS$RULES).
If the /RULES_FILE qualifier is omitted, a personal rules file is loaded if the logical name MMK_PERSONAL_RULES is defined. MMS$RULES is not loaded in this case.
If /NORULES_FILE is specified, neither MMS$RULES nor the personal rules file is loaded.
These rules-processing features, coupled with the ability to redefine macros defined in rules files, make it easier to customize MMK's behavior when needed.
MMK includes support for the following special local macros:
$(MMS$SOURCE_LIST_SPACES) - source list with spaces as separators instead of commas.
$(MMS$CHANGED_LIST_SPACES) - list of changed sources with spaces as separators instead of commas.
$(MMS$SOURCE_NAME) - like $(MMS$TARGET_NAME), but for $(MMS$SOURCE).
$(MMS$TARGET_FNAME) - like $(MMS$TARGET_NAME), but does not include the device/directory specification, just the filename.
$(MMS$TARGET_MODULE) - name of the module being replaced in a text, help, macro, or object library.
MMK will display activity in the subprocess while action lines are being executed when you press CTRL/T.
MMK, in most cases, has more flexible syntax rules for its description files, allowing blanks where MMS does not (e.g., in library module specifications).
MMK pre-defines the macros __VAX__ for builds on VAX systems, __AXP__ for builds on Alpha systems, __I64__ for builds on IA64 systems, and __X86__ and __X86_64__ for builds on x86-64 systems.
MMK supports prefixed inference rules (described in Section 2.3, “Defining Inference Rules”).
When used with DEC/CMS, MMK will “double-infer” a dependency on a non-existent source file, if that file currently resides in a CMS library.
MMK includes a /DUMP qualifier for debugging problems with makefiles.
MMK provides a /GENERATION qualifier on the MMK command for specifying the default CMS generation to be used when elements are checked for revisions and fetched out of CMS.
MMK allows "generic" targets (those that do not refer to an actual file) to have null action lists. MMS requires all targets to have an action list.
MMK adds the ${name} syntax for deferring resolution of macros on the right-hand side of a macro definition.
MMK adds a generic string-substitution function for macro references.
You should avoid using these extended features if you need to maintain compatibility with DEC/MMS.
A.3. Other Differences
Besides the feature differences already mentioned, MMK operates somewhat differently from DEC/MMS in some of its processing. In most cases, these differences are not significant, but they are worth remembering if you need to port DEC/MMS description files to or from MMK.
MMK allows any rule, including built-in rules, to override the .DEFAULT actions. DEC/MMS lets .DEFAULT actions override built-in rules.
When a build action does not update a target, MMK will issue an information message, except for generic targets. DEC/MMS only issues such messages in certain cases.
MMK explicitly builds dependency rules for files on which library modules depend, even if those files are not mentioned in the description file. This may lead to MMK behaving differently from DEC/MMS, although if the description file is correct, the end result will be the same.
MMK parses comments and continuation lines differently, so that a hyphen at the end of a comment is not considered a continuation of the comment.
MMK is more lenient about applying inference rules. It only checks for a match on the suffix and, if present, the prefix. If you have a dependency with an explicit target and source that match by suffix (and possibly prefix), even if the base names do not match, the inference rule can be applied. MMS requires that base names match to apply an inference rule. Note that MMK's behavior may change to match MMS in a future release.
As other differences are brought to the author's attention, they will either be fixed or noted here.