VX/MMS MMS to XML (make) - OpenVMS Migration


VX/MMS parses OpenVMS MMS files and emits an XML representation which can then be used to generate Linux make files and also execute MsMS scripts on Linux under VX/DCL (MMS to Linux).

In addition, VX/MMS can be used as a scanner for VMS code. VX/MMS reads the targets and dependencies, then opens each source file in the dependency list and extracts information required for esTImating the time and cost of a Linux migration (Currently Internal Use Only).

In addition, VX/MMS can 'package' up all of the used sources into a single container which them makes up the migration "set".

VX/MMS can be used with Sector7's CI migration capability.

Because of the nature of MMS, Sector7 has a special MMS/DCL parser which is not designed to be a full DCL syntax (which does not easily translate to anythig due to the symbol substitution). This means we our implementation of MMS DCL syntax is very customer driven.

Our migration toolset (after 32 years) is so festure rich that we can offer CI (continuous Integration) which means no code freeze and you can contnue to develop on VMS and 'press a button' and have a Linux version redy to test in minutes.

Oddly MMS is the latest product we have developed and in retrospect should have been on of the first (A) it was quite simple to write the parser and (b) for migration analysis, we can point VX/MMS (in scanner mode) to the VMS sources, VX/MMS will scan and analyze all the sources from the MMS dependencies, scan them for VMS enhancements and DCL/system service use and also layered products.


Learn More

XML

Vx/Mms can be used to generate build scripts for other non-make build systems.

The MMS file is parsed (requires that all MACRO'S are defined) and the MMS is emitted as XML.

The list of fully parsed DCL verbs is growing, this page will be updated every quarter.

Check the 'user frendly' BNF grammer at the bottom of this page for the latest updates.

 

 

XML to make

Sector7 has an inbuild engine for XML to Linux/UNIX make.

Targets and rules are simply translated to make syntax.

DCL verbs are translated to their Linux equivalents OR can be executed directly using Sector7's VX/DCL for Linux.

Vx/Mms uses an opton file with VMS to Linux/UNIX mappings for the DCL verbs.

 

MMS execution on Linux

Vx/MMS can also interpret the XML to enable the MMS to be executed directly.

This method uses Sector7's logical name handling capability and VX/DCL classes.

Especially designed for Continuous Integration with the Sector7 tool set, the rules are modified to run the appropisate Sector7 VMS language to ANSI language translators.

For Ci, all SecTOR7 translators will automatically convert 100% of the extended VMS syntax to ANSI syntax.

 

VERBS

COPY/RENAME/DELETE/PURGE

ACMS / ACMSADU Integrated with VX/ACMS (TDF,MDF,GDF,ADF to C++) and Runtime

REPOSITORY IntegRAted with VX/CDD

FORMS Integrated with VX/DECFORMS (IFDL to C++ and Runtime)

3GL's (CXX,C,COBOL etc) (VX/C, VX/CPP, VX/COBL< VX/FORTRAN, VX/PASCAL, VX/BASIC)

LINK

MESSAGE Compiler Integrated with VX/MSG Sector7 VMS message Compiler

Vx/Mms supported SYntax (check regularly for udates)

  1. TARGET : target_name {dependency_list } { dcl_statements }

  2. RULE : rule_name { dcl_statements }
    . IFDEF ident
    . ELSE
    . ELSEIF
    . ENDIF
    . SUFFIXES
    . SUFFIXES . { list of file extensions }
    MACRO = VALUE

  3. DCL Statements:
    @ filename {params}
    MC dcl_command
    ACMS/options filename/options
    BASIC/options filename/options
    CC/options { filelist/options }
    COBOL/options filename/options
    COPY/options { filelist/options }
    CXX/options filename/options
    CXXLINK/options { filelist/options }
    DELETE/options { filelist/options }
    FORMS/options [ TRANSLATE | EXTRACT ] { filelist/options }
    IF dcl_expression THEN dcl_statements
    LINK/options { filelist/options }
    ACMSADU { filelist/options }
    ACMSADU BUILD ident/options { filelist/options }
    SQL$MOD/options { filelist/options }
    SQL$PRE/optins { filelist/options }
    MESSAGE/options { filename/options }
    PIPE command options redirects
    PURGE/options filename_list
    RENAME/options { filelist/options }
    REPOSITORY OPERATOR @ filename/options
    REPOSITORY OPERATOR DEFINE FIELD filename/options repository_description .
    SORT/options { filelist/options }
    WAIT int
    WRITE SYS$OUTPUT string_literal

Cont...

  1. dcl_expression is standard VMS DCL syntax plus lexicals
    SYMBOL substitution is not currently performed

  2. REPOSITORY Clause:
    DATATYPE IS datatype_clause
    INITIAL_VALUE IS repo_value_clause
    BASED ON cdd
    DESCRIPTION IS comment

  3. DATATYPE Clause:
    TEXT SIZE IS integer CHARACTER(S)
    WORD
    SIGNED WORD
    UNSIGNED WORD
    LONGWORD
    SIGNED LONGWORD
    UNSIGNED LONGWORD
    ARRAY integer : integer DATATYPE IS datatype_clause

 

MMS

!
! SUFFIXES:
!

.suffixes : .EXE .ANA .OBJ .C .CPP .CXX .SQLMOD .SC .PC .FORM .IFDL

CC = CC
C_DEB_FLAGS = /DEBUG
CXX = CXX
FORMS = FORMS
SQLMOD = MC SQL$MOD
SQLPRE = MC SQL$PRE
CC_PREFIX_OPT = ALL
CC_EXTERN_OPT = RELAX
PRO_C_PREFIX_OPT = ALL
PRO_C_EXTERN_OPT = R

CXX_FLAGS = /FLOAT=G_FLOAT/EXTERN= $(CC_EXTERN_OPT)/OBJECT= $(MMS$TARGET_NAME).OBJ

CC_FLAGS = /FLOAT=G_FLOAT/EXTERN= $(CC_EXTERN_OPT)/OBJECT= $(MMS$TARGET_NAME).OBJ

CC_NAM_FLAGS = /FLOAT=G_FLOAT/NAMES=(AS_IS,SHORT)/EXTERN= $(CC_EXTERN_OPT)/OBJECT= $(MMS$TARGET_NAME).OBJ

PRE_C_FLAGS = /INC=(INC:,MQS_INCLUDE:)/NESTED=NONE/PREPROCESS_ONLY= $(MMS$TARGET_NAME).SC

PRO_C_FLAGS = /FL=G/EX= $(PRO_C_EXTERN_OPT)/OP=UN=1/INC=(INC:,MQS_INCLUDE:)/NE=NO/NOME/PREF= $(PRO_C_PREFIX_OPT)/OBJECT=OBJ:

FORMS_EXT_FLAGS = /OUTPUT= $(MMS$TARGET_NAME).OBJ

FORMS_TRA_FLAGS = /FLOAT=G_FLOAT/NOMEMBER/NOLIST/OUTPUT= $(MMS$TARGET_NAME).FORM

SQLMOD_FLAGS = /NOG_FLOAT/NOALIGN/NOEXTERNAL_GLOBALS/NOINITIALIZE_HANDLES/NOWARNING/OBJECT= $(MMS$TARGET_NAME).OBJ

SQLMOD_ALIAS_FLAGS = /NOG_FLOAT/NOALIGN/NOWARNING/CONNECT/OBJECT= $(MMS$TARGET_NAME).OBJ

SQLPRE_FLAGS = /G_F/SQLO=(NOEXTERNAL_GLOBALS,NOINITIALIZE_HANDLES,NOCONNECT)
SQLPRE_ALIAS_FLAGS =/G_F/SQLO=(NOEXTERNAL_GLOBALS,CONNECT)
!
! RULES:
!
.FORM.OBJ :
CC $(MMS$SOURCE) $(CC_FLAGS) $(C_DEB_FLAGS)
$(FORMS) EXTRACT OBJECT $(MMS$SOURCE) $(FORMS_EXT_FLAGS)

.IFDL.FORM :
$(FORMS) TRANSLATE $(MMS$SOURCE) $(FORMS_TRA_FLAGS)

.C.OBJ :
$(CC) $(MMS$SOURCE) $(CC_FLAGS) $(C_DEB_FLAGS)

.CPP.OBJ :
$(CXX) $(MMS$SOURCE) $(CXX_FLAGS) $(C_DEB_FLAGS)

.CXX.OBJ :
$(CXX) $(MMS$SOURCE) $(CXX_FLAGS) $(C_DEB_FLAGS)

.PC.SC :
$(CC) $(MMS$SOURCE) $(PRE_C_FLAGS)

.SC.OBJ :
$(SQLPRE) $(MMS$SOURCE)/CC $(SQLPRE_FLAGS) $(PRO_C_FLAGS) $(C_DEB_FLAGS)

.SQLMOD.OBJ :
$(SQLMOD) $(MMS$SOURCE) $(SQLMOD_FLAGS)

[64]

XML

<mms>

<action>
<suffixes><filename:E>.EXE</filename:E>
<filename:E>.ANA</filename:E>
<filename:E>.OBJ</filename:E>
<filename:E>.C</filename:E>
<filename:E>.CPP</filename:E>
<filename:E>.CXX</filename:E>
<filename:E>.SQLMOD</filename:E>
<filename:E>.SC</filename:E>
<filename:E>.PC</filename:E>
<filename:E>.FORM</filename:E>
<filename:E>.IFDL</filename:E></sufixes>
</action>

<rule><from>FORM</from><to>OBJ</to></rule>
<action>
<CC>
<filename_option>
<filename:F>$(MMS_SOURCE)</filename:F>
<option:eq><lhs>/FLOAT</lhs>
<rhs><var:ident>G_FLOAT</var:ident></rhs></option:eq>
<option:eq><lhs>/EXTERN</lhs>
<rhs><var:ident>RELAX</var:ident></rhs></option:eq>
<option:eq><lhs>/OBJECT</lhs>
<rhs><filename:NE>$(MMS$TARGET_NAME).OBJ</filename:NE></rhs></option:eq>
<option>/DEBUG</option>
</filename_option>
</CC>
</action>

<action>
<forms:extract:object><filename_option>
<filename:F>$(MMS_SOURCE)</filename:F>
<option:eq><lhs>/OUTPUT</lhs>
<rhs><filename:NE>$(MMS$TARGET_NAME).OBJ</filename:NE></rhs></option:eq>
</filename_option></forms:extract:object>
</action>

<rule><from>IFDL</from><to>FORM</to></rule>

<action>
<forms:translate><filename_option>
<filename:F>$(MMS_SOURCE)</filename:F>
<option:eq><lhs>/FLOAT</lhs>
<rhs><var:ident>G_FLOAT</var:ident></rhs></option:eq>
<option>/NOMEMBER</option>
<option>/NOLIST</option>
<option:eq><lhs>/OUTPUT</lhs><rhs>
<filename:NE>$(MMS$TARGET_NAME).FORM</filename:NE></rhs></option:eq>
</filename_option></forms:translate>
</action>

<rule><from>C</from><to>OBJ</to></rule>

<action>
<CC>
<filename_option>
<filename:F>$(MMS_SOURCE)</filename:F>
<option:eq><lhs>/FLOAT</lhs><rhs><var:ident>G_FLOAT</var:ident></rhs></option:eq>
<option:eq><lhs>/EXTERN</lhs><rhs><var:ident>RELAX</var:ident></rhs></option:eq>
<option:eq><lhs>/OBJECT</lhs><rhs><filename:NE>$(MMS$TARGET_NAME).OBJ</filename:NE></rhs></option:eq>
<option>/DEBUG</option>
</filename_option>
</CC>
</action>

<rule><from>CPP</from><to>OBJ</to></rule>

<action>
<CXX>
<filename_option>
<filename:F>$(MMS_SOURCE)</filename:F>
<option:eq><lhs>/FLOAT</lhs><rhs><var:ident>G_FLOAT</var:ident></rhs></option:eq>
<option:eq><lhs>/EXTERN</lhs><rhs><var:ident>RELAX</var:ident></rhs></option:eq>
<option:eq><lhs>/OBJECT</lhs><rhs><filename:NE>$(MMS$TARGET_NAME).OBJ</filename:NE></rhs></option:eq>
<option>/DEBUG</option>
</filename_option>
</CXX>
</action>

<rule><from>CXX</from><to>OBJ</to></rule>

<action>
<CXX>
<filename_option>
<filename:F>$(MMS_SOURCE)</filename:F>
<option:eq><lhs>/FLOAT</lhs><rhs><var:ident>G_FLOAT</var:ident></rhs></option:eq>
<option:eq><lhs>/EXTERN</lhs><rhs><var:ident>RELAX</var:ident></rhs></option:eq>
<option:eq><lhs>/OBJECT</lhs><rhs>
<filename:NE>$(MMS$TARGET_NAME).OBJ</filename:NE></rhs></option:eq>
<option>/DEBUG</option>
</filename_option>
</CXX>
</action>

<rule><from>PC</from><to>SC</to></rule>

<action>
<CC>
<filename_option>
<filename:F>$(MMS_SOURCE)</filename:F>
<option:eq:paren><lhs>/INC</lhs><rhs><filename:D>INC:</filename:D>
<filename:D>MQS_INCLUDE:</filename:D></rhs></option:eq:paren>
<option:eq><lhs>/NESTED</lhs><rhs><var:ident>NONE</var:ident></rhs></option:eq>
<option:eq><lhs>/PREPROCESS_ONLY</lhs><rhs>
<filename:NE>$(MMS$TARGET_NAME).SC</filename:NE></rhs></option:eq>
</filename_option>
</CC>
</action>

<rule><from>SC</from><to>OBJ</to></rule>

<action>
<mc>
<SQL$PRE>
<filename_option>
<filename:F>$(MMS_SOURCE)</filename:F>
<option>/CC</option>
<option>/G_F</option>
<option:eq:paren><lhs>/SQLO</lhs>
<rhs><var:ident>NOEXTERNAL_GLOBALS</var:ident><var:ident>NOINITIALIZE_HANDLES</var:ident>
<var:ident>NOCONNECT</var:ident></rhs></option:eq:paren>
<option:eq><lhs>/FL</lhs><rhs><var:ident>G</var:ident></rhs></option:eq>
<option:eq><lhs>/EX</lhs><rhs><var:ident>R</var:ident></rhs></option:eq>
<option:eq><lhs>/OP</lhs><rhs>
<assign><var:ident>UN</var:ident><eq></eq><var:int>1</var:int></assign>
</rhs></option:eq>
<option:eq:paren><lhs>/INC</lhs><rhs>
<filename:D>INC:</filename:D><filename:D>MQS_INCLUDE:</filename:D>
</rhs></option:eq:paren>
<option:eq><lhs>/NE</lhs><rhs><var:ident>NO</var:ident></rhs></option:eq>
<option>/NOME</option>
<option:eq><lhs>/PREF</lhs><rhs><var:ident>ALL</var:ident></rhs></option:eq>
<option:eq><lhs>/OBJECT</lhs>

<rhs><filename:D>OBJ:</filename:D></rhs></option:eq>
<option>/DEBUG</option>
</filename_option>
</SQL$PRE>
</mc>
</action>

<rule><from>SQLMOD</from><to>OBJ</to></rule>

<action>
<mc>
<SQL$MOD>
<filename_option>
<filename:F>$(MMS_SOURCE)</filename:F>


<option>/NOG_FLOAT</option>
<option>/NOALIGN</option>
<option>/NOEXTERNAL_GLOBALS</option>
<option>/NOINITIALIZE_HANDLES</option>
<option>/NOWARNING</option>
<option:eq><lhs>/OBJECT</lhs>
<rhs><filename:NE>$(MMS$TARGET_NAME).OBJ</filename:NE></rhs>
</option:eq>


</filename_option>
</SQL$MOD>
</mc>
</action>

</mms>