VX/MMS parses VMS / 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.
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.
Sector7 has an inbuild engine for XML to Linux/Windows 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/Windows mappings for the DCL verbs.
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.
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
!
! 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]
<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>