                          CMAKE 1.00 MANUAL


CMAKE 1.00 Contents

     Introduction                     Samples

     Getting Started                  Errors

     The Command Line

     The Make File

     The Configuration File

     Using CMAKE with Your Editor

     Optimizing Performance

     Exit Codes

     Technical Support                Copyright and Trademarks

Introduction to CMAKE

     CMAKE is a program maintenance utility designed especially for the
     Microsoft(R) C and Microsoft Windows(TM) programmer.  CMAKE is
     like a generic make facility in that it processes a make file in
     order to determine which commands need to be executed to renew a
     given program that is under development.  However, the make file
     for CMAKE is much simpler than that of a generic make utility.
     For most cases, user-supplied dependencies are not required.
     CMAKE will automatically determine which commands are required by
     deducing all dependencies directly from the commands themselves.

     Despite the fact that CMAKE must determine all dependencies for
     you, CMAKE executes faster than most generic make utilities
     running on a make file in which all dependencies have been
     explicitly specified.

     CMAKE currently supports the following commands: CL, LIB, LINK,
     MASM, RC, COPY, SET and REM.  The user may expand this list by
     defining additional commands in the CMAKE configuration file.

     CMAKE is a shareware program, written and maintained by John
     Greschak.  To become a registered user of CMAKE, send $25 to:

          John Greschak
          50 West 34th St. Apt. 14B8
          NY, NY 10001

     CMAKE was designed to run under MS-DOS(R).

Getting Started with CMAKE

     Creating a Make File

     Running CMAKE

     Interpreting the Output of CMAKE

     Error Messages

     How CMAKE Works

Creating a Make File for CMAKE

     Study the samples that have been included with CMAKE.  Hopefully,
     one of these sample programs may serve as a template for your make
     file.

     See: Samples

     If you stray from the style of the samples, you might have some
     difficulty because CMAKE does not recognize all possible command-
     line formats for each command.  For example, CMAKE requires that
     you use a response file with the commands, LIB and LINK.  To
     guarantee success, you should become familiar with the
     restrictions that CMAKE imposes on the commands that you will be
     using in your make files.

     See: Command-Line Restrictions

          CL
          COPY
          LIB
          LINK
          MASM
          RC/A
          RC/C
          RC/W

Running CMAKE

     Once you have created a make file, you will be ready to execute
     CMAKE.  To do this, enter the command:

     CMAKE /n make_file_name

     Alternatively, if your make file is named "makefile" and you
     are in your make-file's directory, you may omit the make-file
     name and enter the command:

     CMAKE /n

     The /n option will prevent CMAKE from executing any commands
     from the make file.  You should continue to use the /n option
     until CMAKE does not generate any error messages.

     See: Error Messages

     Once you have eliminated all CMAKE error messages, remove the /n
     option and execute CMAKE again.  This time CMAKE will execute all
     of the commands that are necessary to update your application.

     See: Interpreting the Output of CMAKE

     At this point, you should perform some simple tests to ensure that
     CMAKE will generate the correct list of required commands when you
     modify one of your source files.  (There are utility programs
     available that may be used to modify the time stamp of a given
     file.  A program such as this, which is usually called "touch",
     provides an efficient way to modify your source files.)  Modify
     one of your source files, execute CMAKE, and check to be sure that
     your application has been properly updated.  Repeat this process
     for different source files.

     If you are having difficulty in understanding why CMAKE is not
     updating your application properly, you might gain more insight
     into the cause of the problem by adding the /v option to the
     CMAKE command line.  For example, you could use the command:

     CMAKE /n /v make_file_name

     The use of the /v option will cause CMAKE to generate a verbose
     description of its activity.  This description contains detailed
     information concerning the processing of the make file and the
     configuration file (if you are using one).  With the /v option,
     CMAKE will list all of the time stamp comparisons that it performs
     in route to determining which commands in the make file are
     required.

     While you are debugging your make file, you might find it helpful
     to review the batch program, "makefile.bat", that CMAKE creates
     and executes.  (Note that when the /n option is used,
     "makefile.bat" is created but not executed.)

     Finally, you may wish to collect the output of CMAKE in a file and
     then review that file in you editor.  To do this, you may use the
     MS-DOS redirection character, '>'.  For example, the following
     command could be used to redirect the output of CMAKE to the file,
     "cmake.log":

     CMAKE >cmake.log

     See: Using CMAKE with Your Editor

Interpreting the Output of CMAKE

     As CMAKE processes a given make file, it sends information
     concerning its activity to standard output.  CMAKE supports both
     a concise and verbose format for this output.  The default format
     is concise.  The verbose format may be requested through the use
     of the /v CMAKE command-line option.  This topic describes the
     data that is contained in the concise/default format for CMAKE
     output.

     The first two lines of output give the current date and time, the
     CMAKE version number, and the copyright notice for CMAKE.

     The next line has the form:

     make_file_name >-CMAKE-> batch_file_name

     where make_file_name is the name of the make file (input file)
     that CMAKE is processing and batch_file_name is the full name of
     the batch program (output file), "makefile.bat", that CMAKE
     creates and executes after processing the given make file.

     This is followed by a list of all of the commands in the make file
     that must be executed.  Each line of this list has the following
     form:

     command_name make_file_line_number reason_why_command_is_required

     For example, the list might consist of the following four lines:

     cl           2  INC w.h > OBJ x.obj
     lib         41  OBJ x.obj > LIB y.lib
     link        51  LIB y.lib > EXE z.exe

     The first line shows that the CL command on line 2 of the make
     file is required because the include file, "w.h", is newer than
     the object file, "x.obj".  The second line shows that the LIB
     command on line 41 of the make file is required because the object
     file, "x.obj" is newer than the library file, "y.lib".  Finally,
     the third line of the list indicates that the LINK command on line
     51 of the make file is required because the library file, "y.lib"
     is newer than the executable file, "z.exe".

     This list is followed by a line that gives the amount of time used
     by CMAKE to create the batch program, "makefile.bat".

     A line is drawn after the execution time to separate the output of
     CMAKE from the output of the commands that CMAKE executes.

     One of the following messages is provided at the end of the output
     that is generated:

     ALL TARGETS ARE UP TO DATE

     This message indicates that CMAKE has determined that none of the
     commands in the make file need to be executed.

     ALL TARGETS WERE SUCCESSFULLY RENEWED

     This message indicates that CMAKE has determined that some of the
     commands in the make file were required and that all of these
     required commands were executed and returned zero (indicating
     success).

     FAILURE - SOME TARGETS WERE NOT RENEWED

     This indicates that some commands in the make file were required
     and executed.  However, one of the commands returned a nonzero
     value (indicating an error).  In this case, all of the required
     commands that follow the command that failed are not executed and
     CMAKE returns a nonzero value.

CMAKE Error Messages

     The following two formats are used for CMAKE error messages:

     fatal error Mnnnn: message
     file_name(line_number) : error Mnnnn: message

     Most of the error messages use the second format.  Many popular
     programmer's editors (e.g. BRIEF(R), Epsilon(TM), and the
     Microsoft Editor) are able to parse error messages in this form
     in order to place you in <file_name> at line 'line_number'.

     See: Using CMAKE with Your Editor
          CMAKE Errors

How CMAKE Works

     While CMAKE processes a given make file, it builds a batch program
     called, "makefile.bat".  When it is completed, "makefile.bat"
     consists of all of the commands from the make file that were
     determined (by CMAKE) to be "required".  After the make file has
     been fully processed, CMAKE executes "makefile.bat".

     CMAKE views a command in the make file as an entity that uses
     source files to create target files.  Generally speaking, a
     command will be required when one of the following conditions is
     true:

     1. At least one of the target files for the command does not
        exist.
     2. There is some source file for the command that is newer than
        some target file for the command.

     A command that is determined to be required, is appended to the
     batch program "makefile.bat".  Note that a required command will
     not be executed until CMAKE has processed the entire make file.

     It is often the case that the target file of a given command will
     serve as a source file for another command that occurs later in
     the make file.  For example, the target file of a CL command is an
     object file.  Usually, this object file will serve as a source
     file for a LINK command that occurs after the CL command in the
     make file.  If the CL command is required, then the LINK command
     that depends upon the object generated by the CL command, should
     also be required.  This overlapping of the target files of one
     command with the source files of another command causes a "chain
     reaction" of required commands.

     Since the required commands are not executed as they are found,
     but accumulated into the file, "makefile.bat" (for later use),
     CMAKE must keep track of all of the target files of each required
     command to ensure that the correct "chain reactions" occur.  In
     some sense, CMAKE simulates the execution of each required
     command.  It does this by creating a fresh "pseudofile" for every
     target file of a required command.  Whenever CMAKE attempts to
     find the time stamp of a particular file, it first searches the
     set of pseudofiles.  If the given file is not found among the
     pseudofiles, then CMAKE searches for the real/original version of
     the file.

The CMAKE Command Line

     Syntax

     CMAKE [Options]

     Options

     /?        Displays Command-Line Help
     /a        Displays Information about CMAKE
     /help     Displays Help on CMAKE
     /n        Suppresses Command Execution
     /o        Specifies the Path of "makefile.bat"
     /v        Select Verbose Diagnostic Output
     filename  Specifies the Make-File Name

     Example

     CMAKE /v /n /oc:\test c:\test\test.mak

Examples

     CMAKE

     This command will cause CMAKE to attempt to process a make file
     called, "makefile".  CMAKE will assume that "makefile" is located
     in the current directory.  A batch program called, "makefile.bat",
     will be created in the current directory and CMAKE will execute
     this program (provided the statement, "run_output_file = no", has
     not been given in the CMAKE configuration file).  CMAKE will
     use its concise output format to display information as it
     processes the make file.

     CMAKE /od:\temp

     This command will cause CMAKE to attempt to process a make file
     called, "makefile".  CMAKE will assume that "makefile" is located
     in the current directory.  A batch program called, "makefile.bat",
     will be created in the directory, "d:\temp", which has been
     supplied with the /o option.  This program will be executed
     (provided the statement, "run_output_file = no", has not been
     given in the CMAKE configuration file).  CMAKE will use its
     concise output format to display information as it processes the
     make file.

     CMAKE /n /v >d:\temp\cmake.log

     This command will cause CMAKE to attempt to process a make file
     called, "makefile".  CMAKE will assume that "makefile" is located
     in the current directory.  A batch program called, "makefile.bat",
     will be created in the current directory.  Since the /n has been
     specified, CMAKE will not execute "makefile.bat".  Since the /v
     has been specified, CMAKE will use its verbose output format to
     display information as it processes the make file.  The output
     from CMAKE will be directed to the file, "d:\temp\cmake.log".
     The combination of options given in this example might be used to
     debug a make file.

     CMAKE c:\mak\test.mak

     This command will cause CMAKE to attempt to process a make file
     called, "c:\mak\test.mak".  A batch program called,
     "makefile.bat", will be created in the current directory and CMAKE
     will execute this program (provided the statement,
     "run_output_file = no", has not been given in the CMAKE
     configuration file).  CMAKE will use its concise output format to
     display information as it processes the make file.

CMAKE Options

     Command-line options may be given in upper or lowercase.

     With the exception of the make-file name, options must be prefixed
     by a '/' or '-' character.

Display Command-Line Help for CMAKE (/?)

     Syntax:  /?

     The /? option is used to display command-line help.

Display Information about CMAKE (/a)

     Syntax:  /a

     The /a option is used to display information on how to contact the
     author of CMAKE and on how to become a registered user of CMAKE.

Display Help on CMAKE (/help)

     Syntax:  /help or /h

     The /help option is used to display the CMAKE help file you are
     reading.  If you would like to use this option, place the
     QuickHelp program, QH.EXE, in your current directory or PATH.

Suppress Command Execution by CMAKE (/n)

     Syntax:  /n

     The /n option suppresses the execution of commands.  This switch
     takes precedence over the Boolean variable, run_output_file, which
     may be used in the configuration file.  With this switch, the
     batch program, "makefile.bat", is created but not executed.  You
     might wish to use this option to help you debug your make file.

Specify the Path of "makefile.bat" (/o)

     Syntax:  /o

     The /o option is used to specify the path of "makefile.bat" (the
     batch program that CMAKE creates and executes).  When the /o
     option is omitted, "makefile.bat" is placed in the current
     directory.

Select Verbose Diagnostic Output from CMAKE (/v)

     Syntax:  /v

     The /v option is used to request the verbose format for CMAKE
     output.  When this option is used, CMAKE provides detailed
     information concerning the processing of the configuration file
     and make file.  You might wish to use this option to help you
     debug your make file.

Specify the Make-File Name (filename)

     Syntax:  filename

     The filename option is used to specify the make-file name.  If
     this option is omitted, CMAKE assumes that the make file is
     called, "makefile", and is located in the current directory.

The Make File for CMAKE

     Description

     Commands

          Intrinsic Commands

               CL    LIB   MASM  REM
               COPY  LINK  RC    SET

          User-Defined Commands

          Equivalent Commands

          Unrecognized Commands

     The if Statement

     Comments

Description of the Make File

     A make file lists the operations that are required to build a
     particular program.

     CMAKE processes a given make file to determine which commands must
     be executed in order to update a program that is under
     development.

     A make file for CMAKE consists of a mixture of commands, if
     statements, and comments.

Example

     /* Make File */

     cl /c /W4 hello.c
     cl /c /W4 world.c
     lib @message.lrf
     cl /c /W4 greeting.c
     link @greeting.lnk

     In the sample make file given above, "message.lrf" is a LIB
     response file that consists of the following lines:

     message.lib
     y
     -+hello.obj &
     -+world.obj ;

     and "greeting.lnk" is a LINK response file that consists of the
     following lines:

     greeting.obj
     greeting.exe /stack:2048
     NUL
     message.lib ;

Make-File Commands

     Make file commands may be divided into the following four classes:

          Intrinsic Commands
          User-Defined Commands
          Equivalent Commands
          Unrecognized Commands

     The method that CMAKE uses to determine if a given command is
     required is dictated by the class of the command.

Intrinsic Commands

     A make-file command is said to be "intrinsic" if CMAKE has some
     "built-in" knowledge of the how to determine whether or not the
     command is required.

     The intrinsic commands are: CL, LIB, LINK, MASM, RC, COPY, SET,
     and REM.

CL

     Description

     When is a CL Command Required?

     The CL Command Line

     How CMAKE Processes a C-Source File

     Switches

     Some Restrictions

     Error Handling

     Output from CMAKE

     Verbose Output from CMAKE

Description of CL

     CL is a program that is distributed with the Microsoft C
     Optimizing Compiler.  It provides a command-line interface to the
     compiler programs.

When is a CL Command Required?

     A given CL command will be required if any of the following
     conditions is true:

     1. The object file does not exist.
     2. The source file is newer than the object file.
     3. There is an include file that is newer than the object file.

     These conditions are checked in order.  If any condition is found
     to be true, the remaining conditions are not checked.

The CL Command Line

     Source-File Name

     Only one source-file name may be specified.  No global characters
     are allowed in the given source-file name.  The source-file name
     must be placed at the end of the command line.  No default
     extension is assumed for the source file.  If a path is not
     specified, it is assumed that the source file is located in the
     current directory.

     Object-File Name

     The base name of the object file is assumed to be the same as the
     base name of the source file and the object-file extension is
     assumed to be '.obj'.  The /Fo (or equivalently, -Fo) option may
     be used to specify the path of the object file.  If the /Fo option
     is used, the path that is given with this option must be
     terminated with a backslash.  If the /Fo option is not used, it is
     assumed that the object file is located in the current directory.

     Options

     Options may appear anywhere between the CL command name and the
     source-file name.  The /c option (compile but do not link) must be
     used.

Examples

     command:     cl /c /W3 test.c
     source file: current_directory\test.c
     object file: current_directory\test.obj

     command:     cl /c /W3 /Fo..\obj\ ..\c\test.c
     source file: ..\c\test.c
     object file: ..\obj\test.obj

How CMAKE Processes a C-Source File

     When the object file of a CL command exists, and it is newer than
     the source file, CMAKE will process the C-source file in order to
     determine whether or not there is an include file that is newer
     than the object file.  CMAKE will extract include-file names from
     the include statements that are given in the C-source file.

     CMAKE recognizes two forms of the include statement: local and
     system.

     Local-Include Statements

     The term "local-include statement" is used to refer to an include
     statement that has the form:

          #include "filename"

     and the file associated with such an include statement is said to
     be a "local-include file".

     System-Include Statements

     The term "system-include statement" is used to refer to an include
     statement that has the form:

          #include <filename>

     and the file associated with such an include statement is said to
     be a "system-include file".

     Sensitivity to Local- and System-Include Statements

     The "sensitivity to local-include statements" and the "sensitivity
     to system-include statements" may be thought of as Boolean state
     variables for CMAKE.  If the sensitivity to local-include
     statements is "on", and CMAKE encounters a local-include
     statement, CMAKE will check to see if the include file associated
     with the include statement is newer than the object file.
     Otherwise, if the sensitivity to local-include statements is
     "off", CMAKE will ignore the local-include statement.  Likewise,
     if the sensitivity to system-include statements is "on", and CMAKE
     encounters a system-include statement, CMAKE will check to see if
     the include file associated with the include statement is newer
     than the object file.  Otherwise, if the sensitivity to system-
     include statements is "off", CMAKE will ignore the system-include
     statement.

     By default, the sensitivity to local-include statements is "on",
     and the sensitivity to system-include statements is "off".

     The sensitivity to local-include statements and the sensitivity
     to system-include statements may be altered through the use of a
     variety of switches.

     For each source file, CMAKE uses the Boolean variables,
     c_include_""_on and c_include_<>_on, to initialize the sensitivity
     to local- and system-include statements, respectively.

     Within a given C-source file, any of the following C comments may
     be used to modify the sensitivity to local- or system-include
     statements:

     /* CMAKE - INCLUDE "" OFF */
     /* CMAKE - INCLUDE "" ON */
     /* CMAKE - INCLUDE <> OFF */
     /* CMAKE - INCLUDE <> ON */

     Locating Include Files

     If CMAKE does obtain an include-file name from an include
     statement, it will attempt to determine the directory in which
     the file is located.  If the file is a local-include file, CMAKE
     will look for the file in the directory in which the source file
     for the given CL command is located.  If the include file is not
     found in the source-file's directory, CMAKE will search the
     directories specified by the INCLUDE environment variable (if it
     is defined), one by one, from left to right.  On the other hand,
     if the file is a system-include file, CMAKE will only look for the
     file in the directories given by the INCLUDE environment variable.

     To prevent CMAKE from searching for local-include files in the
     source-file's directory, use the following statement in the
     configuration file:

     search_source_dir_for_includes = no

     Scanning Include Files for Include Statements

     By default, CMAKE does not scan include files for include
     statements.  To force CMAKE to scan include files for include
     statements, place the following statement in your configuration
     file:

     scan_include_files_for_includes = yes

     Alternatively, you may place the following commands anywhere
     within your make file (except within the body of an if statement)
     to achieve a "local" effect:

     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES ON
     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES OFF

     When a REM statement of this type is used, all of the CL commands
     that follow the statement will be affected.

     The End-of-Includes Comment

     If CMAKE encounters the comment:

     /* CMAKE - INCLUDE END */

     while scanning a C-source file, it will stop processing the file,
     i.e. CMAKE will not read any lines in the source file that occur
     after this comment.

     Although it is not required, you should place this comment after
     the last include statement in any C-source files that will be
     scanned by CMAKE.  If you do this, you will reduce the amount of
     time that CMAKE takes to execute.

     The Procedure Used to Examine a C-Source File

     For a given CL command, CMAKE uses the following process to
     scan the C-source file in order to determine whether or not there
     is an include file that is newer than the object file:

     A. Initialize the sensitivity to local-include statements
        and system-include statements.

     B. Read a line from the source file.

     C. If we are at the end of the source file

           Go to step G - there are no include files in this source
           file that are newer than the object file.

     D. Skip leading white space on the line.

     E. If the line begins with the comment
                /* CMAKE - INCLUDE "" ON */

                Enable the sensitivity to local-include statements.

        Else if the line begins with the comment
                /* CMAKE - INCLUDE "" OFF */

                Disable the sensitivity to local-include statements.

        Else if the line begins with the comment
                /* CMAKE - INCLUDE <> ON */

                Enable the sensitivity to system-include statements.

        Else if the line begins with the comment
                /* CMAKE - INCLUDE <> OFF */

                Disable the sensitivity to system-include statements.

        Else if the line begins with the comment
                /* CMAKE - INCLUDE END */

                Go to step G - there are no include files in this
                source file that are newer than the object file.

        Else if the line begins with the character, '#'

                1. Skip white space following the '#' character.

                2. If the next token is 'include'

                      a. Skip white space following the 'include'
                         token.

                      b. If (the next character is '"' and the
                         sensitivity to local includes is on) or (the
                         next character is '<' and the sensitivity to
                         system includes is on)

                            i.    Copy the include-file name.

                            ii.   If the include file is local and the
                                  configuration data specifies that we
                                  must search for include files in the
                                  source-file directory

                                     Search for the include file in the
                                     source-file directory (the full
                                     include-file name is obtained by
                                     prefixing the source-file path to
                                     the include-file name derived from
                                     the source file).

                             iii. If the include file has not yet been
                                  found

                                     Search for the include file in the
                                     paths given by the INCLUDE
                                     environment variable.

                             iv.  If the include file is newer than the
                                  object file

                                          Go to step G - there is an
                                          include file that is newer
                                          than the object file.

                                  Else if the configuration data
                                  specifies that we must scan include
                                  files for include statements

                                          Save the include-file name

     F. Go to step B

     G. If we must scan include files for include statements and an
        include file that is newer than the object file has not yet
        been found

           For each saved include file, repeat the process given above
           (beginning with step A) with the include file playing the
           role of the source file.  Continue until all saved include
           files have been examined or an include file that is newer
           than the object file is found.

Switches for CL

     The following switches may be used to affect the way in which
     CMAKE processes a CL command:

     /* CMAKE - INCLUDE END */

     C comment statement in C-source or -include files.  Used to
     indicate that there are no include statements after the comment.

     scan_include_files_for_includes

     Boolean variable set in the configuration file.  Used to indicate
     whether or not CMAKE should scan include files for include
     statements.  (Default: no).

     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES ON
     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES OFF

     Make file commands.  Used to indicate whether or not CMAKE should
     scan include files for include statements.  These commands take
     precedence over the Boolean variable,
     scan_include_files_for_includes, which may be set in the
     configuration file.

     search_source_dir_for_includes

     Boolean variable set in the configuration file.  Used to indicate
     whether or not CMAKE should look for local-include files in the
     source-file's directory before using the INCLUDE environment
     variable.  (Default: yes).

     c_include_""_on
     c_include_<>_on

     Boolean variables set in the configuration file.  Used to control
     the initial sensitivity for each source file to local- and system-
     include statements.  c_include_""_on (Default: yes).
     c_include_<>_on (Default: no)

     /* CMAKE - INCLUDE "" OFF */
     /* CMAKE - INCLUDE "" ON */
     /* CMAKE - INCLUDE <> OFF */
     /* CMAKE - INCLUDE <> ON */

     C comment statements in C-source or -include files.  Used to
     modify the sensitivity to local- and system-include statements.
     The effect of these switches is local.  They only affect the
     processing of the source file in which they are contained.  These
     switches take precedence over the Boolean variables,
     c_include_""_on and c_include_<>_on, which may be set in the
     configuration file.

Some Restrictions on CL

     Preprocessor Directives

     #include is the only preprocessor directive that CMAKE recognizes.
     One of the implications of this is that CMAKE will not ignore
     conditionally compiled include statements based upon whether or
     not a particular identifier has been defined (either with a
     #define statement or through the use of the /D CL command-line
     option).  For example, in the following section of source code, if
     the sensitivity to local-include statements is on, CMAKE will not
     skip the include statement - regardless of whether or not the
     identifier, INCLUDE_TEST_H, has been defined:

     #ifdef INCLUDE_TEST_H
        #include "test.h"
     #endif

     Any of the following approaches could be taken to instruct CMAKE
     to ignore this include statement:

     #ifdef INCLUDE_TEST_H
        /* CMAKE - INCLUDE "" OFF */
        #include "test.h"
        /* CMAKE - INCLUDE "" ON */
     #endif

     or

     #ifdef INCLUDE_TEST_H
     // #include "test.h"
     #endif

     or

     #ifdef INCLUDE_TEST_H
     /* #include "test.h" */
     #endif

     Include-File Names

     The full path of an include file may not be given in an include
     statement (i.e. the include-file name must not begin with a drive
     or a '\' character).  However, relative paths may be used (i.e.
     the include-file name may begin with dots (..) or a directory
     name).

Error Handling with CL

     If a CL command is required, CMAKE will add the CL command to the
     batch file, "makefile.bat".  In addition, CMAKE will insert the
     following command after the CL command:

     if errorlevel 1 goto failed

     This will ensure that if the CL command fails (i.e. returns a
     nonzero value), "makefile.bat" will terminate.

Output from CMAKE for CL

     Normally, CMAKE provides no information on the processing of a
     given CL command unless the command is required.  If the command
     is required, one of the following messages will appear:

     OBJ object_file Does Not Exist

     This indicates that <object_file> does not exist.

     SRC source_file > OBJ

     This indicates that <source_file> is newer than the object file.

     INC include_file > OBJ object_file

     This indicates that <include_file> is newer than <object_file>.

Examples

     cl          35  OBJ test.obj Does Not Exist
     cl          35  SRC test.c > OBJ
     cl          35  INC test.h > OBJ test.obj

Verbose Output from CMAKE for CL

     When the verbose output format is selected, CMAKE lists all of the
     time stamp comparisons that it makes in route to determining if a
     given CL command is required.

     Examples: CL Not Required
               CL Required

Example: CL Not Required

     cl /c /W3 test.c

           Command:      cl
           Parameters:   /c /W3 test.c
           Command Type: intrinsic
           Command ID:   0

           Source File: test.c
           Object File: test.obj

           Source File is older than Object File
           Include File test1.h is older than Object File
           Include File test2.h is older than Object File
           Include File test3.h is older than Object File

           * not required *

Example: CL Required

     cl /c /W3 test.c

           Command:      cl
           Parameters:   /c /W3 test.c
           Command Type: intrinsic
           Command ID:   0

           Source File: test.c
           Object File: test.obj

           Source File is older than Object File
           Include File test1.h is older than Object File
     ***** Include File test2.h is NEWER than Object File

           Modified Command Line:

     cl /c /W3 test.c
     if errorlevel 1 goto failed

           * REQUIRED *

COPY

     Description

     The COPY Command Line

     When is a COPY Command Required?

     Some Restrictions

     Error Handling

     Output from CMAKE

     Verbose Output from CMAKE

Description of COPY

     COPY is an internal MS-DOS command.  It is used to copy one or
     more files from one location to another.

The COPY Command Line

     The COPY command must be of the following form:

     copy source target

     Both <source> and <target> are required.  <source> and <target>
     may be a file or directory (but not a root directory).  If
     <source> (or <target>) is a file, and the path of the file is not
     specified, it is assumed that the file is located in the current
     directory.

When is a COPY Command Required?

     The conditions under which a given COPY command (of the form:
     copy source target) will be required, depend upon the "type" of
     the COPY command.  There are four possible types:

                 Ŀ
                   Type    <source>   <target>  
                 Ĵ
                  Type ff  file       file      
                  Type fd  file       directory 
                  Type df  directory  file      
                  Type dd  directory  directory 
                 

     Regardless of the "type" of the COPY command, if <target> does not
     exist, the COPY command will be required.  Otherwise, the
     conditions are as follows:

     Type ff: copy source_file target_file

     If the source file is newer than the target file, the COPY command
     will be required

     Type fd: copy source_file target_directory

     The target-file name is constructed from the target directory name
     and the source-file name.  If the target file does not exist, or
     if the source file is newer than the target file, the COPY command
     will be required.

     Type df: copy source_directory target_file

     The COPY command will always be required in this case.

     Type dd: copy source_directory target_directory

     If the source directory is empty, the COPY command will not be
     required.  Otherwise, for each file, <source_file>, in the source
     directory, the corresponding target-file name is constructed from
     <target_directory> and <source_file>.  If <target_file> does not
     exist, or if <source_file> is newer than <target_file>, the
     following COPY command will be required:

     copy source_file target_file

Some Restrictions on COPY

     Global Characters

     The source and target names may not contain the global characters,
     '*' and '?'.

     Concatenation

     CMAKE does not support the concatenation operator, '+', for the
     COPY command.

     Options

     Options (e.g. /A, /B, and /V) may only be placed after the target
     name.  White space must be placed between the target name and the
     first option.  The options, /A and /B, may not be used after the
     source name.

     Reserved Device Names

     The reserved device names: PRN, LPT1, LPT2, LPT3, CON, COM1, COM2,
     COM3, COM4, and AUX, may be used for source and target names.
     However, the results will be predictable.  Regardless of whether
     or not the source name is a reserved device name, if the target
     name is a reserved device name, the COPY command will not be
     required.  If the source name is a reserved device name, and the
     target name is not a reserved device name, the COPY command will
     be required.

Error Handling with COPY

     CMAKE will usually insert the following command into the batch
     file, "makefile.bat", after a required command:

     if errorlevel 1 goto failed

     However, this is not done in the case of the COPY command because
     the COPY command does not return a nonzero value when it fails.

Output from CMAKE for COPY

     Normally, CMAKE provides no information on the processing of a
     given COPY command unless the command is required.  If the command
     is required, one of the following messages will appear:

     TRG target_file Does Not Exist

     This indicates that <target_file> does not exist.

     SRC source_file > TRG target_file

     This indicates that <source_file> is newer than <target_file>.

     SRC source_dir is a Directory and TRG target_file is a File

     This indicates that the source of the COPY command is a directory
     and the target is a file.  (This form of the COPY command is
     always required.)

Examples

     copy        12  TRG test.trg Does Not Exist
     copy        12  SRC test.src > TRG test.trg
     copy        12  SRC \s is a Directory and test.trg is a File

Verbose Output from CMAKE for COPY

     When the verbose output format is selected, CMAKE lists all of the
     time stamp comparisons that it makes in route to determining if a
     given COPY command is required.

     In the following two examples, "\s" and "\t" are directories, and
     the files in the directory, "\s", are: "1.txt", "2.txt", "3.txt",
     "4.txt", and "5.txt".

     Examples: COPY Not Required
               COPY Required

Example: COPY Not Required

     copy \s \t

           Command:      copy
           Parameters:   \s \t
           Command Type: intrinsic
           Command ID:   4

           Source: \s
           Target: \t

           Source File \s\1.txt is older or equal to Target File \t\1.txt
           Source File \s\2.txt is older or equal to Target File \t\2.txt
           Source File \s\3.txt is older or equal to Target File \t\3.txt
           Source File \s\4.txt is older or equal to Target File \t\4.txt
           Source File \s\5.txt is older or equal to Target File \t\5.txt

           * not required *

Example: COPY Required

     copy \s \t

           Command:      copy
           Parameters:   \s \t
           Command Type: intrinsic
           Command ID:   4

           Source: \s
           Target: \t

     ***** Source File \s\1.txt is NEWER than Target File \t\1.txt
           Source File \s\2.txt is older or equal to Target File \t\2.txt
     ***** Target File \t\3.txt Does Not Exist
           Source File \s\4.txt is older or equal to Target File \t\4.txt
     ***** Source File \s\5.txt is NEWER than Target File \t\5.txt

           * REQUIRED *

     Note:

     In this example, the following commands would be written to the
     batch file, "makefile.bat":

     copy \s\1.txt \t\1.txt
     copy \s\3.txt \t\3.txt
     copy \s\5.txt \t\5.txt

LIB

     Description

     When is a LIB Command Required?

     The LIB Command Line

     Modified Command Line

     Error Handling

     Some Restrictions

     Output from CMAKE

     Verbose Output from CMAKE

Description of LIB

     LIB is a program that is distributed with the Microsoft C
     Optimizing Compiler and the Microsoft Macro Assembler.  It is used
     to create and maintain library files.

When is a LIB Command Required?

     A given LIB command will be required if any of the following
     conditions is true:

     1. The library file does not exist.
     2. A component file (object or library) is newer than the library
        file.

     These conditions are checked in order.  If any condition is found
     to be true, the remaining conditions are not checked.

The LIB Command Line

     Examples: A Library of Objects
               A Library of Libraries

     Command Line

     The library-file name, component files (objects or libraries), and
     options must be specified in a LIB response file.  The first non-
     white-space character that follows the LIB command name must be
     '@'.  This character must be followed by a response-file name.
     White space is allowed between the character, '@', and the
     response-file name.  The response-file name may be followed by
     white space or a semicolon.  If the path of the response file is
     not specified, it is assumed that the response file is located in
     the current directory.

     Response File

     The library-file name must be placed at the beginning of the first
     line of the response file.  White space may precede the library-
     file name.  No default extension is assumed for the library file.
     If the path of the library is not specified, it is assumed that
     the library is located in the current directory.  All LIB options
     must be placed after the library-file name.  White space must be
     used to separate the library-file name and the first option.

     The letter, 'y', must be placed on the second line of the
     response file.  This is used as the answer to the LIB prompt:
     "Library does not exist.  Create? (y/n)", in the case where the
     library does not exist.  White space may precede and follow the
     character, 'y'.

     The last section of the response file consists of the set of
     component-file names.  CMAKE accepts two formats for this list.
     The list may contain either a set of object files or a set of
     library files.  Regardless of the format used, each line in this
     section may contain only one file name.  Each file name must be
     preceded by an operation.  If the list contains a set of objects,
     each object-file name must be preceded by the "replace" command
     symbol, '-+'.  If the list contains a set of libraries, each
     library-file name must be preceded by the "add" command symbol,
     '+'.  White space may be placed before the command symbols,
     between the '-' and '+' characters of the '-+' command symbol, and
     between the command symbol and the component-file name.  No
     default extension is assumed for the component files.  If the path
     of a component file is not specified, it is assumed that the
     component file is located in the current directory.  Except for
     the last component in the list, each component-file name must be
     followed by the character, '&'.  White space is allowed between a
     component-file name and the character, '&'.  The last component-
     file name in the list of components should not be followed by the
     character, '&'.

     CMAKE ignores all lines in the response file that occur after the
     line that contains the last component-file name.

Example: A Library of Objects

     command: lib @test.lrf

     where "test.lrf" is a LIB response file with the following lines:

     test.lib /I
     y
     -+test1.obj &
     -+test2.obj ;

Example: A Library of Libraries

     command: lib @test.lrf

     where "test.lrf" is a LIB response file with the following lines:

     test.lib /I
     y
     +test1.lib &
     +test2.lib ;

Modified Command Line for LIB

     If a LIB command is required, CMAKE will add the LIB command to
     the batch file, "makefile.bat".

     If the library consists of a set of objects, CMAKE will create a
     new LIB response file that contains only those object files that
     are newer than the library.  The new LIB response file will have
     the same name as the original, except that the extension, '.clb',
     will be used in place of the original response-file extension.

     If the library consists of a set of component libraries,
     and the library (into which the components are to be placed)
     exists, CMAKE will insert the following command into the batch
     file, "makefile.bat", before the LIB command:

     erase library_file

     Note that in this case, since the library is a conglomerate of
     component libraries that are added (+) together, the library must
     be erased, and rebuilt from scratch.

Error Handling with LIB

     If a LIB command is required, CMAKE will insert the following
     command into the batch file, "makefile.bat", after the LIB
     command:

     if errorlevel 1 goto failed

     This will ensure that if the LIB command fails (i.e. returns a
     nonzero value), "makefile.bat" will terminate.

Some Restrictions on LIB

     Response-File Name

     If the response file consists of a list of objects, the extension
     of the LIB response-file name may not be '.clb'

     Cross-Reference-Listing File and Output Library

     If a cross-reference-listing file and output library file are
     specified in the LIB response file, they will not be included in
     the new response file that CMAKE creates in the case where the
     response file consists of a list of objects.

Output from CMAKE for LIB

     Normally, CMAKE provides no information on the processing of a
     given LIB command unless the command is required.  If the command
     is required, one of the following messages will appear:

     LIB library_file Does Not Exist

     This indicates that <library_file> does not exist.

     OBJ component_object_file > LIB library_file

     This indicates that <component_object_file> is newer than
     <library_file>.

     LIB component_library_file > LIB library_file

     This indicates that <component_library_file> is newer than
     <library_file>.

Examples

     lib         36  LIB test.lib Does Not Exist
     lib         36  OBJ test1.obj > LIB test.lib
     lib         36  LIB test1.lib > LIB test.lib

Verbose Output from CMAKE for LIB

     When the verbose output format is selected, CMAKE lists all of the
     time stamp comparisons that it makes in route to determining if a
     given LIB command is required.

     The next two examples illustrate the verbose output generated for
     cases where the LIB response file consists of a set of objects.
     For these examples, the LIB response file, "test.lrf", consists of
     the following lines:

     test.lib
     y
     -+test1.obj &
     -+test2.obj ;

     Examples: A Library of Objects: LIB Not Required
               A Library of Objects: LIB Required

     The next two examples illustrate the verbose output generated for
     cases where the LIB response file consists of a set of libraries.
     For these examples, the LIB response file, "test.lrf", consists of
     the following lines:

     test.lib
     y
     +test1.lib &
     +test2.lib ;

     Examples: A Library of Libraries: LIB Not Required
               A Library of Libraries: LIB Required

Example: A Library of Objects: LIB Not Required

     lib @test.lrf

           Command:      lib
           Parameters:   @test.lrf
           Command Type: intrinsic
           Command ID:   1

           Response File: test.lrf
           Library File:  test.lib

           Response-File Format: Update Object Modules

           Object File test1.obj is older than Library File
           Object File test2.obj is older than Library File

           * not required *

Example: A Library of Objects: LIB Required

     lib @test.lrf

           Command:      lib
           Parameters:   @test.lrf
           Command Type: intrinsic
           Command ID:   1

           Response File: test.lrf
           Library File:  test.lib

           Response-File Format: Update Object Modules

           Object File test1.obj is older than Library File
     ***** Object File test2.obj is NEWER than Library File

           New Response File test.clb Created

           Modified Command Line:

     lib @test.clb
     if errorlevel 1 goto failed

           * REQUIRED *

Example: A Library of Libraries: LIB Not Required

     lib @test.lrf

           Command:      lib
           Parameters:   @test.lrf
           Command Type: intrinsic
           Command ID:   1

           Response File: test.lrf
           Library File:  test.lib

           Response-File Format: Merge Libraries

           Component-Library File test1.lib is older than Library File
           Component-Library File test2.lib is older than Library File

           * not required *

Example: A Library of Libraries: LIB Required

     lib @test.lrf

           Command:      lib
           Parameters:   @test.lrf
           Command Type: intrinsic
           Command ID:   1

           Response File: test.lrf
           Library File:  test.lib

           Response-File Format: Merge Libraries

           Component-Library File test1.lib is older than Library File
     ***** Component-Library File test2.lib is NEWER than Library File

           Modified Command Line:

     erase test.lib
     lib @test.lrf
     if errorlevel 1 goto failed

           * REQUIRED *

LINK

     Description

     When is a LINK Command Required?

     The LINK Command Line

     Error Handling

     Output from CMAKE

     Verbose Output from CMAKE

Description of LINK

     LINK is a program that is distributed with the Microsoft C
     Optimizing Compiler and the Microsoft Macro Assembler.  It is used
     to build executable files and dynamic-link libraries.

When is a LINK Command Required?

     A given LINK command will be required if any of the following
     conditions is true:

     1. The executable file does not exist.
     2. A component-object file is newer than the executable file.
     3. A component-library file is newer than the executable file.
     4. The module-definition file is newer than the executable file.

     These conditions are checked in order.  If any condition is found
     to be true, the remaining conditions are not checked.

The LINK Command Line

     Examples: Linking Objects
               Linking with Libraries
               Using a Module-Definition File

     Command Line

     The executable-file name, component-object files, component-
     library files, module-definition file, and options must be
     specified in a LINK response file.  The first non-white-space
     character that follows the LINK command name must be '@'.  This
     character must be followed by a response-file name.  White space
     is allowed between the character, '@', and the response-file name.
     The response-file name may be followed by white space or a
     semicolon.  If the path of the response file is not specified, it
     is assumed that the response file is located in the current
     directory.

     Response File

     Each line of the response file may contain only one file name.
     White space may precede the file name given on any line.

     The first section of the response file must consist of a list of
     object files.  No default extension is assumed for the object
     files.  If the path of an object is not specified, it is assumed
     that the object is located in the current directory.  Except for
     the last object in the list, each object-file name must be
     followed by the character, '+'.  White space is allowed between an
     object-file name and the character, '+'.  The last object-file
     name in the list of objects must not be followed by the character,
     '+'.

     The line that follows the last object must begin with the name of
     the executable file.  LINK options may be placed on this line,
     after the executable-file name.  White space must be used to
     separate the executable-file name and the first option.  If a map
     file is not desired, there are no component libraries, and there
     is no module-definition file, a semicolon must be placed at the
     end of the line that contains the executable-file name.

     If a semicolon has not been used at the end of the executable-file
     line, the line that follows the executable name must contain the
     map-file name.  If there are no component libraries and there is
     no module-definition file, a semicolon must be placed at the end
     of the line that contains the map-file name.  If a map file is not
     desired, and there are component libraries or there is a module-
     definition file, either use NUL for the map-file name or leave the
     map-file line blank.

     If there are component libraries, they must be listed after the
     line that contains the map-file name.  No default extension is
     assumed for library files.  If the path of a library is not
     specified, it is assumed that the library is located in the
     current directory.  (CMAKE does not use the LIB environment
     variable to search for libraries.)  Except for the last library in
     the list, each library-file name must be followed by the
     character, '+'.  White space is allowed between the library-file
     name and the character,  '+'.  The last library-file name in the
     list of must not be followed by the character, '+'.  If there is
     no module-definition file, a semicolon must be placed at the end
     of the line that contains the last library-file name.

     If there is a module-definition file, the line that follows the
     last library must contain the module-definition-file name.  A
     semicolon may be placed at the end of the module-definition-file
     line.  However, the semicolon is not required in this case.

     CMAKE ignores all lines in the response file that occur after the
     line that contains the semicolon or the line that contains the
     module-definition-file name, whichever comes first.

Example: Linking Objects

     command: link @test.lnk

     where "test.lnk" is a LINK response file with the following lines:

     test1.obj +
     test2.obj +
     test3.obj
     test.exe /stack:8192 ;

     or, if a map file is desired:

     test1.obj +
     test2.obj +
     test3.obj
     test.exe /stack:8192
     test.map ;

Example: Linking with Libraries

     command: link @test.lnk

     where "test.lnk" is a LINK response file with the following lines:

     test1.obj +
     test2.obj +
     test3.obj
     test.exe /stack:8192
     NUL
     test1.lib +
     test2.lib ;

     or, if a map file is desired:

     test1.obj +
     test2.obj +
     test3.obj
     test.exe /stack:8192
     test.map
     test1.lib +
     test2.lib ;

Example: Using a Module-Definition File

     command: link @test.lnk

     where "test.lnk" is a LINK response file with the following lines:

     test1.obj +
     test2.obj +
     test3.obj
     test.exe /stack:8192
     NUL
     test1.lib +
     test2.lib
     test.def  ;

     or, if a map file is desired:

     test1.obj +
     test2.obj +
     test3.obj
     test.exe /stack:8192
     test.map
     test1.lib +
     test2.lib
     test.def  ;

Error Handling with LINK

     If a LINK command is required, CMAKE will add the LINK command to
     the batch file, "makefile.bat".  In addition, CMAKE will insert
     the following commands after the LINK command:

     if errorlevel 1 goto n_link_failed
     goto n_link_ok
     if exist executable_file erase executable_file
     goto failed

     This will ensure that if the LINK command fails (i.e. returns a
     nonzero value), the faulty executable that LINK may have created
     will be erased, and "makefile.bat" will terminate.  (Actually, in
     place of the prefix, 'n_', used in the batch file labels given
     above, CMAKE will use a numeric prefix (e.g. 2_link_failed) that
     is ensured to be unique across all required LINK commands.)

Output from CMAKE for LINK

     Normally, CMAKE provides no information on the processing of a
     given LINK command unless the command is required.  If the command
     is required, one of the following messages will appear:

     EXE executable_file Does Not Exist

     This indicates that <executable_file> does not exist.

     OBJ object_file > EXE executable_file

     This indicates that <object_file> is newer than <executable_file>.

     LIB library_file > EXE executable_file

     This indicates that <library_file> is newer than
     <executable_file>.

     DEF module_definition_file > EXE executable_file

     This indicates that <module_definition_file> is newer than
     <executable_file>.

Examples

     link        38  EXE test.exe Does Not Exist
     link        38  OBJ test.obj > EXE test.exe
     link        38  LIB test.lib > EXE test.exe
     link        38  DEF test.def > EXE test.exe

Verbose Output from CMAKE for LINK

     When the verbose output format is selected, CMAKE lists all of the
     time stamp comparisons that it makes in route to determining if a
     given LINK command is required.

     For both of the examples given below, the LINK response file,
     "test.lnk", is as follows:

     test.obj
     test.exe /stack:16384
     test.map
     test.lib
     test.def ;

     Examples: LINK Not Required
               LINK Required

Example: LINK Not Required

     link @test.lnk

           Command:      link
           Parameters:   @test.lnk
           Command Type: intrinsic
           Command ID:   2

           Response File:   test.lnk
           Executable File: test.exe

           Object File test.obj is older than Executable File
           Library File test.lib is older than Executable File
           Module-Definition File test.def is older than Executable File

           * not required *

Example: LINK Required

     link @test.lnk

           Command:      link
           Parameters:   @test.lnk
           Command Type: intrinsic
           Command ID:   2

           Response File:   test.lnk
           Executable File: test.exe

     ***** Object File test.obj is NEWER than Executable File

           Modified Command Line:

     link @test.lnk
     if errorlevel 1 goto 0_link_failed
     goto 0_link_ok
     :0_link_failed
     if exist test.exe erase test.exe
     goto failed
     :0_link_ok

           * REQUIRED *

MASM

     Description

     When is a MASM Command Required?

     The MASM Command Line

     How CMAKE Processes an Assembly-Language-Source File

     Switches

     Some Restrictions

     Error Handling

     Output from CMAKE

     Verbose Output from CMAKE

Description of MASM

     MASM is a program that is distributed with the Microsoft Macro
     Assembler.  In Macro Assembler versions prior to 6.00, MASM is the
     assembler itself.  In version 6.00 of the Macro Assemble, MASM
     provides a command-line interface to the assembler program,
     ML.EXE.

When is a MASM Command Required?

     A given MASM command will be required if any of the following
     conditions is true:

     1. The object file does not exist.
     2. The source file is newer than the object file.
     3. There is an include file that is newer than the object file.

     These conditions are checked in order.  If any condition is found
     to be true, the remaining conditions are not checked.

The MASM Command Line

     Source-File Name

     The source-file name must be placed before the first comma on the
     command line.  Only white space may be present between the source-
     file name and the comma that follows it.  No default extension is
     assumed for the source file.  If a path is not specified, it is
     assumed that the source file is located in the current directory.

     Object-File Name

     The object-file name must be specified.  It must be placed after
     the first comma on the command line.  Only white space may be
     present between the object-file name and the comma that precedes
     it.  No default extension is assumed for the object file.  If a
     path is not specified, it is assumed that the object file is
     located in the current directory.  The object-file name may be
     followed by a comma, semicolon, or white space.

     Options

     Options may not be placed between the source-file name and the
     first comma or between the first comma and the object-file name.

Examples

     command:     masm /W2 /V /Z test.asm,test.obj;
     source file: current_directory\test.asm
     object file: current_directory\test.obj

     command:     masm /W2 /V /Z ..\asm\test.asm,..\obj\test.obj;
     source file: ..\asm\test.asm
     object file: ..\obj\test.obj

How CMAKE Processes an Assembly-Language-Source File

     When the object file of a MASM command exists, and it is newer
     than the source file, CMAKE will process the assembly-language-
     source file in order to determine whether or not there is an
     include file that is newer than the object file.  CMAKE will
     extract include-file names from the include statements that are
     given in the assembly-language-source file.

     Sensitivity to Include Statements

     The "sensitivity to include statements" may be thought of as a
     Boolean state variable for CMAKE.  If the sensitivity to include
     statements is "on" and CMAKE encounters an include statement,
     CMAKE will check to see if the include file associated with the
     include statement is newer than the object file.  Otherwise, if
     the sensitivity to include statements is "off", CMAKE will ignore
     the include statement.

     By default, the sensitivity to include statements is "on".

     The sensitivity to include statements may be altered through the
     use of a variety of switches.

     For each source file, CMAKE uses the Boolean variable,
     asm_include_on, to initialize the sensitivity to include
     statements.

     Within a given assembly-language-source file, the following
     comments may be used to modify the sensitivity to include
     statements:

     ; CMAKE - INCLUDE OFF
     ; CMAKE - INCLUDE ON

     Locating Include Files

     If CMAKE does obtain an include-file name from an include
     statement, it will attempt to determine the directory in which
     the file is located.  First, CMAKE will look for the file in the
     current directory.  If the include file is not found in the
     current directory, CMAKE will look for the file in the directory
     in which the source file for the given MASM command is located.
     If the include file is not found in the source-file's directory,
     CMAKE will search the directories specified by the INCLUDE
     environment variable (if it is defined), one by one, from left to
     right.

     To prevent CMAKE from searching for include files in the current
     directory, use the following statement in the configuration file:

     search_current_dir_for_includes = no

     To prevent CMAKE from searching for include files in the source-
     file's directory, use the following statement in the configuration
     file:

     search_source_dir_for_includes = no

     Scanning Include Files for Include Statements

     By default, CMAKE does not scan include files for include
     statements.  To force CMAKE to scan include files for include
     statements, place the following statement in your configuration
     file:

     scan_include_files_for_includes = yes

     Alternatively, you may place the following commands anywhere
     within your make file (except within the body of an if statement)
     to achieve a "local" effect:

     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES ON
     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES OFF

     When a REM statement of this type is used, all of the MASM
     commands that follow the statement will be affected.

     The End-of-Includes Comment

     If CMAKE encounters the comment:

     ; CMAKE - INCLUDE END

     while scanning an assembly-language-source file, it will stop
     processing the file, i.e. CMAKE will not read any lines in the
     source file that occur after this comment.

     Although it is not required, you should place this comment after
     the last include statement in any assembly-language-source file
     that will be scanned by CMAKE.  If you do this, you will reduce
     the amount of time that CMAKE takes to execute.

     The Procedure Used to Examine an Assembly-Language-Source File

     For a given MASM command, CMAKE uses the following process to
     scan the assembly-language-source file in order to determine
     whether or not there is an include file that is newer than the
     object file:

     A. Initialize the sensitivity to include statements.

     B. Read a line from the source file.

     C. If we are at the end of the source file

           Goto step G - there are no include files in this source file
           that are newer than the object file.

     D. Skip leading white space on the line.

     E. If the line begins with the comment
                ; CMAKE - INCLUDE ON

                Enable the sensitivity to include statements.

        Else if the line begins with the comment
                ; CMAKE - INCLUDE OFF

                Disable the sensitivity to include statements.

        Else if the line begins with the comment
                ; CMAKE - INCLUDE END

                Go to step G - there are no include files in this
                source file that are newer than the object file.

        Else if the line begins with the token, 'include' (or
                'INCLUDE'), and the sensitivity to include statements
                is on

                1. Skip white space following the 'include' token.

                2. Copy the include-file name.

                3. If the configuration data specifies that we must
                   search for include files in the current directory

                      Search for the include file in the current
                      directory (the full include-file name is obtained
                      by prefixing the current directory to the
                      include-file name derived from the source file).

                4. If the include file has not yet been found and
                   the configuration data specifies that we must search
                   for include files in the source-file directory

                      Search for the include file in the source-file
                      directory (the full include-file name is obtained
                      by prefixing the source-file path to the include-
                      file name derived from the source file).

                5. If the include file has not yet been found

                      Search for the include file in the paths given by
                      the INCLUDE environment variable.

                6. If the include file is newer than the object file

                           Go to step G - there is an include file that
                           is newer than the object file.

                   Else if the configuration data specifies that we
                   must scan include files for include statements

                           Save the include-file name

     F. Go to step B

     G. If we must scan include files for include statements and an
        include file that is newer than the object file has not yet
        been found

           For each saved include file, repeat the process given above
           (beginning with step A) with the include file playing the
           role of the source file.  Continue until all saved include
           files have been examined or an include file that is newer
           than the object file is found.

Switches for MASM

     The following switches may be used to affect the way in which
     CMAKE processes a MASM command:

     ; CMAKE - INCLUDE END

     Assembly-language-comment statement in source or include files.
     Used to indicate that there are no include statements after the
     comment.

     scan_include_files_for_includes

     Boolean variable set in the configuration file.  Used to indicate
     whether or not CMAKE should scan include files for include
     statements.  (Default: no).

     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES ON
     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES OFF

     Make file commands.  Used to indicate whether or not CMAKE should
     scan include files for include statements.  These commands take
     precedence over the Boolean variable,
     scan_include_files_for_includes, which may be set in the
     configuration file.

     search_source_dir_for_includes

     Boolean variable set in the configuration file.  Used to indicate
     whether or not CMAKE should look for include files in the source-
     file's directory before using the INCLUDE environment variable.
     (Default: yes).

     search_current_dir_for_includes

     Boolean variable set in the configuration file.  Used to indicate
     whether or not CMAKE should look for include files in the current
     directory before using the INCLUDE environment variable.
     (Default: yes).

     asm_include_on

     Boolean variable set in the configuration file.  Used to control
     the initial sensitivity for each source file to include
     statements.  (Default: yes)

     ; CMAKE - INCLUDE OFF
     ; CMAKE - INCLUDE ON

     Assembly-language-comment statements in source or include files.
     Used to modify the sensitivity to include statements.  The effect
     of this switch is local.  It only affects the processing of the
     source file in which it is are contained.  This switch takes
     precedence over the Boolean variable, asm_include_on which may be
     set in the configuration file.

Some Restrictions on MASM

     Include Statements

     The full path of an include file may not be given in an include
     statement (i.e. the include-file name must not begin with a drive
     or a '\' character).  However, relative paths may be used (i.e.
     the include-file name may begin with dots (..) or a directory
     name).

Error Handling with MASM

     If a MASM command is required, CMAKE will add the MASM command to
     the batch file, "makefile.bat".  In addition, CMAKE will insert
     the following command after the MASM command:

     if errorlevel 1 goto failed

     This will ensure that if the MASM command fails (i.e. returns a
     nonzero value), "makefile.bat" will terminate.

Output from CMAKE for MASM

     Normally, CMAKE provides no information on the processing of a
     given MASM command unless the command is required.  If the command
     is required, one of the following messages will appear:

     OBJ object_file Does Not Exist

     This indicates that <object_file> does not exist.

     SRC source_file > OBJ

     This indicates that <source_file> is newer than the object file.

     INC include_file > OBJ object_file

     This indicates that <include_file> is newer than <object_file>.

Examples

     masm        37  OBJ test.obj Does Not Exist
     masm        37  SRC test.asm > OBJ
     masm        37  INC test.h > OBJ test.obj

Verbose Output from CMAKE for MASM

     When the verbose output format is selected, CMAKE lists all of the
     time stamp comparisons that it makes in route to determining if a
     given MASM command is required.

     Examples: MASM Not Required
               MASM Required

Example: MASM Not Required

     masm /W2 /V /Z test.asm,test.obj;

           Command:      masm
           Parameters:   /W2 /V /Z test.asm,test.obj;
           Command Type: intrinsic
           Command ID:   3

           Source File: test.asm
           Object File: test.obj

           Source File is older than Object File
           Include File test1.inc is older than Object File
           Include File test2.inc is older than Object File
           Include File test3.inc is older than Object File

           * not required *

Example: MASM Required

     masm /W2 /V /Z test.asm,test.obj;

           Command:      masm
           Parameters:   /W2 /V /Z test.asm,test.obj;
           Command Type: intrinsic
           Command ID:   3

           Source File: test.asm
           Object File: test.obj

           Source File is older than Object File
           Include File test1.inc is older than Object File
     ***** Include File test2.inc is NEWER than Object File

           Modified Command Line:

     masm /W2 /V /Z test.asm,test.obj;
     if errorlevel 1 goto failed

           * REQUIRED *

RC

     Description

     Operations

          RC/C - Compile a Resource-Script File

          RC/A - Add a Resource File to an Executable File

          RC/W - Add the Windows Version Stamp to a File

          RC/CA - Compile and Add a Resource File to an Executable File

Description of RC

     RC is a program that is distributed with the Microsoft Windows
     Software Development Kit.  It is known as the "Resource Compiler".

RC Operations

     The Resource Compiler may be used to perform any of the following
     four operations:

     Compile a Resource-Script File

     Compile a resource-script file to create a resource file.  We
     use the symbol, "RC/C", to represent an RC command that is used
     for this purpose.  (The suffix, '/C', stands for "Compile".)

     Add a Resource File to an Executable File

     Add a resource file to an executable file.  We use the symbol,
     "RC/A", to represent an RC command that is used for this purpose.
     (The suffix, '/A', stands for "Add".)

     Add the Windows Version Stamp to a File

     Add the Windows version stamp to a file generated by the linker.
     We use the symbol, "RC/W", to represent an RC command that is used
     for this purpose.  (The suffix, '/W', stands for "Windows".)

     Compile and Add a Resource File to an Executable File

     Compile a resource-script file to create a resource file, and add
     the resulting resource file to an executable file.  We use the
     symbol, "RC/CA", to represent an RC command that is used for this
     purpose.  (The suffix, '/CA', stands for "Compile and Add".)

     CMAKE supports the first three of these four operations.

RC/C

     Description                                 Helpful Hints

     The RC/C Command Line

     When is an RC/C Command Required?

     How CMAKE Processes a Resource-Script File

     Switches

     Some Restrictions

     Error Handling

     Output from CMAKE

     Verbose Output from CMAKE

Description of RC/C

     We use the symbol, "RC/C", to represent an RC command that is used
     to compile a resource-script file in order to create a resource
     file.  The suffix, '/C', stands for "Compile".

The RC/C Command Line

     Resource-Script-File Name

     The resource-script-file name must be the last command-line
     parameter.  No default extension is assumed for the resource-
     script file.  If the path of the resource-script file is not
     specified, it is assumed that the file is located in the current
     directory.

     If your editor has the capability to allow you to review compiler
     error message, and you use this feature, you should use the path
     separator, '/' (or '\\') (in place of the usual, '\'), in the
     resource-script-file name.  If this is not done, RC will drop the
     path separators from the resource-script-file name that it
     provides in error messages that pertain to that file.  The end
     result will be that your editor will be unable to open the
     resource-script file when an error occurs in that file.  CMAKE
     supports the use of, '/' and '\\', in place of the usual, '\', in
     this case.  However, the path separator, '\', should be used in
     all other paths that are specified in the make file.  (The problem
     described above is present in the "Microsoft Windows Resource
     Compiler Version 3.00 (dated 6/1/90)".  More recent versions of
     the Resource Compiler may or may not have this problem.)

     Resource-File Name

     The /fo option may be used to specify the name of the resource
     file.  If this option is used, the resource-file-name extension
     must be specified; and the path of the resource file must be
     specified, if the file is not located in the current directory.

     If the /fo option is not used, the resource-file name is derived
     from the resource-script-file name by replacing the resource-
     script-file-name extension with '.res'.

     Options

     Options may appear anywhere between the RC command name and the
     resource-script-file name.  The /r option (compile) must be used.
     The /r option may not be combined with another single letter
     option.  The options, /r and /fo, are not case sensitive, and '-'
     may be used in place of '/'.

Examples

     command:              rc /v /r test.rc
     resource-script file: current_directory\test.rc
     resource file:        current_directory\test.res

     command:              rc /r /fo..\res\test.res ..\\rc\\test.rc
     resource-script file: ..\rc\test.rc
     resource file:        ..\res\test.res

When is an RC/C Command Required?

     A given RC/C command will be required if any of the following
     conditions is true:

     1. The resource file does not exist.
     2. The resource-script file is newer than the resource file.
     3. There is an include file or included resource (e.g. an icon,
        bitmap, cursor, font, or user-defined resource) that is newer
        than the resource file.

How CMAKE Processes a Resource-Script File

     When the resource file of an RC/C command exists, and it is newer
     than the resource-script file, CMAKE will process the resource-
     script file in order to determine whether or not there is an
     include file or an included resource (e.g. an icon, bitmap,
     cursor, font, or user-defined resource) that is newer than the
     resource file.  CMAKE will extract include-file names from
     the include statements and resource-include statements that are
     given in the resource-script file.

     CMAKE recognizes two forms of the include statement: local and
     system.  CMAKE also recognizes resource-include statements.

     Local-Include Statements

     The term "local-include statement" is used to refer to an include
     statement that has the form:

          #include "filename"

     and the file associated with such an include statement is said to
     be a "local-include file".

     System-Include Statements

     The term "system-include statement" is used to refer to an include
     statement that has the form:

          #include <filename>

     and the file associated with such an include statement is said to
     be a "system-include file".

     Resource-Include Statements

     The term "resource-include statement" is used to refer to a
     statement that has the form:

          resource_name_id resource_type_id [options] filename

     and the file associated with such a statement is said to be a
     "resource-include file" or an "included resource".  (Note that
     the documentation for the Microsoft Windows Software Development
     Kit refers to these statements as "single-line" statements.)  Some
     examples of resource-include statements are:

          myicon ICON myicon.ico
          mybitmap BITMAP mybmap.bmp
          myfont FONT myfont.fnt
          mycursor CURSOR mycur.cur
          10 400 mytext.txt

     Sensitivity to Local-, System-, and Resource-Include Statements

     The "sensitivity to local-include statements", the "sensitivity to
     system-include statements", and the "sensitivity to resource-
     include statements" may be thought of as Boolean state variables
     for CMAKE.

     If the sensitivity to local-include statements is "on", and CMAKE
     encounters a local-include statement, CMAKE will check to see if
     the include file associated with the include statement is newer
     than the object file.  Otherwise, if the sensitivity to local-
     include statements is "off", CMAKE will ignore the local-include
     statement.  Similar statements may be made to describe the role of
     the sensitivity to "system-" include statements and the
     sensitivity to "resource-" include statements.

     By default, the sensitivity to local-include statements is "on",
     the sensitivity to system-include statements is "off", and the
     sensitivity to resource-include statements is "on".

     The sensitivity to local-, system-, and resource-include
     statements may be altered through the use of a variety of
     switches.

     For each source file, CMAKE uses the Boolean variables,
     rc_include_""_on, rc_include_<>_on, and rc_include_resource_on to
     initialize the sensitivity to local-, system-, and resource-
     include statements, respectively.

     Within a given resource-script file, any of the following C-style
     comments may be used to modify the sensitivity to local-, system-,
     or resource-include statements:

     /* CMAKE - INCLUDE "" OFF */
     /* CMAKE - INCLUDE "" ON */
     /* CMAKE - INCLUDE <> OFF */
     /* CMAKE - INCLUDE <> ON */
     /* CMAKE - INCLUDE RESOURCE OFF */
     /* CMAKE - INCLUDE RESOURCE ON */

     Locating Include Files

     If CMAKE does obtain an include-file name from an include
     statement, it will attempt to determine the directory in which
     the file is located.  If the file is a local-include file or a
     resource-include file, CMAKE will look for the file in the current
     directory.  If the include file is not found in the current
     directory, CMAKE will search the directories specified by the
     INCLUDE environment variable (if it is defined), one by one, from
     left to right.  On the other hand, if the file is a system-include
     file, CMAKE will only look for the file in the directories given
     by the INCLUDE environment variable.

     To prevent CMAKE from searching for local-include files and
     resource-include files in the current directory, use the following
     statement in the configuration file:

     search_current_dir_for_includes = no

     Scanning Include Files for Include Statements

     By default, CMAKE does not scan include files for include
     statements.  To force CMAKE to scan local-include files and
     system-include files for include statements, place the following
     statement in your configuration file:

     scan_include_files_for_includes = yes

     Alternatively, you may place the following commands anywhere
     within your make file (except within the body of an if statement)
     to achieve a "local" effect:

     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES ON
     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES OFF

     When a REM statement of this type is used, all of the RC/C
     commands that follow the statement will be affected.

     The End-of-Includes Comment

     If CMAKE encounters the comment:

     /* CMAKE - INCLUDE END */

     while scanning a resource-script file, it will stop processing the
     file, i.e. CMAKE will not read any lines in the file, that occur
     after this comment.  To learn how this switch may be used to
     affect the way in which CMAKE processes the resource-script file,

     See: Helpful Hints for RC/C

     The Procedure Used to Examine a Resource-Script File

     For a given RC/C command, CMAKE uses the following process to
     scan the resource-script file in order to determine whether or not
     there is an include file that is newer than the resource file:

     A. Initialize the sensitivity to local-include statements,
        system-include statements, and resource-include statements.

     B. Read a line from the resource-script file.

     C. If we are at the end of the resource-script file

           Goto step G - there are no include files or included
           resources in this resource-script file that are newer than
           the resource file.

     D. Skip leading white space on the line.

     E. If the line begins with the character, '/'

                If the line begins with the comment
                        /* CMAKE - INCLUDE "" ON */

                        Enable the sensitivity to local-include
                        statements.

                Else if the line begins with the comment
                        /* CMAKE - INCLUDE "" OFF */

                        Disable the sensitivity to local-include
                        statements.

                Else if the line begins with the comment
                        /* CMAKE - INCLUDE <> ON */

                        Enable the sensitivity to system-include
                        statements.

                Else if the line begins with the comment
                        /* CMAKE - INCLUDE <> OFF */

                        Disable the sensitivity to system-include
                        statements.

                Else if the line begins with the comment
                        /* CMAKE - INCLUDE RESOURCE ON */

                        Enable the sensitivity to resource-include
                        statements.

                Else if the line begins with the comment
                        /* CMAKE - INCLUDE RESOURCE OFF */

                        Disable the sensitivity to resource-include
                        statements.

                Else if the line begins with the comment
                        /* CMAKE - INCLUDE END */

                        Go to step G - there are no include files or
                        included resources in this resource-script file
                        that are newer than the resource file.

        Else if the line begins with the character, '#'

                1. Skip white space following the '#' character.

                2. If the next token is 'include'

                      a. Skip white space following the 'include'
                         token.

                      b. If (the next character is '"' and the
                         sensitivity to local includes is on) or (the
                         next character is '<' and the sensitivity to
                         system includes is on)

                            i.   Copy the include-file name.

                            ii.  If the include file is local and the
                                 configuration data specifies that we
                                 must search for include files in the
                                 current directory

                                    Search for the include file in the
                                    current directory (the full
                                    include-file name is obtained by
                                    prefixing the current directory to
                                    the include-file name derived from
                                    the resource-script file).

                            iii. If the include file has not yet been
                                 found

                                    Search for the include file in the
                                    paths given by the INCLUDE
                                    environment variable.

                            iv.  If the include file is newer than the
                                 resource file

                                         Go to step G - there is an
                                         include file that is newer
                                         than the resource-script file.

                                 Else if the configuration data
                                 specifies that we must scan include
                                 files for include statements

                                         Save the include-file name.

        Else if the sensitivity to resource includes is on

                1. Skip to the end of the line or to the first '
                   occurrence of, '//' or '/*', whichever comes first.

                2. Copy the file name of the included resource from the
                   previous token (convert any occurrences of, '\\' and
                   '/', in the file name, to '\').

                3. If the configuration data specifies that we must
                   search for include files in the current directory

                      Search for the included resource in the current
                      directory (the full file name for the included
                      resource is obtained by prefixing the current
                      directory to the resource-include-file name
                      derived from the resource-script file).

                4. If the included resource has not yet been found

                      Search for the included resource in the paths
                      given by the INCLUDE environment variable.

                5. If the included resource is newer than the
                   resource file

                      Go to step G - there is an included resource that
                      is newer than the resource file.

     F. Go to step B

     G. If we must scan include files for include statements and an
        include file or included resource that is newer than the
        resource file has not yet been found

           For each saved (local- or system-) include file, repeat the
           process given above (beginning with step A) with the include
           file playing the role of the resource-script file.  Continue
           until all saved include files have been examined, or an
           include file is found that is newer than the resource file.

Switches for RC/C

     The following switches may be used to affect the way in which
     CMAKE processes an RC/C command:

     /* CMAKE - INCLUDE END */

     C-style comment statement in resource-script file or (local- or
     system-) include files.  Used to indicate that there are no
     local-, system-, or resource-include statements after the comment.

     scan_include_files_for_includes

     Boolean variable set in the configuration file.  Used to indicate
     whether or not CMAKE should scan include files for include
     statements.  (Default: no).

     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES ON
     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES OFF

     Make file commands.  Used to indicate whether or not CMAKE should
     scan include files for include statements.  These commands take
     precedence over the Boolean variable,
     scan_include_files_for_includes, which may be set in the
     configuration file.

     search_current_dir_for_includes

     Boolean variable set in the configuration file.  Used to indicate
     whether or not CMAKE should look for local- and resource-include
     files in the current directory, before using the INCLUDE
     environment variable.
     (Default: yes).

     rc_include_""_on
     rc_include_<>_on
     rc_include_resource_on

     Boolean variables set in the configuration file.  Used to control
     the initial sensitivity for each resource-script file to local-,
     system-, and resource-include statements.  rc_include_""_on
     (Default: yes).  rc_include_<>_on (Default: no).
     rc_include_resource_on (Default: yes).

     /* CMAKE - INCLUDE "" OFF */
     /* CMAKE - INCLUDE "" ON */
     /* CMAKE - INCLUDE <> OFF */
     /* CMAKE - INCLUDE <> ON */
     /* CMAKE - INCLUDE RESOURCE OFF */
     /* CMAKE - INCLUDE RESOURCE ON */

     C-style comment statements in resource-script file or (local- or
     system-) include files.  Used to modify the sensitivity to local-,
     system-, and resource-include statements.  The effect of these
     switches is local.  They only affect the processing of the file
     in which they are contained.  These switches take precedence over
     the Boolean variables, rc_include_""_on, rc_include_<>_on, and
     rc_include_resource_on, which may be set in the configuration
     file.

Some Restrictions on RC/C

     Preprocessor Directives

     #include is the only preprocessor directive that CMAKE recognizes.
     One of the implications of this is that CMAKE will not ignore
     conditionally compiled include statements based upon whether or
     not a particular identifier has been defined (either with a
     #define statement or through the use of the /D RC command-line
     option).  For example, in the following section of source code, if
     the sensitivity to local-include statements is on, CMAKE will not
     skip the include statement - regardless of whether or not the
     identifier, INCLUDE_TEST_H, has been defined:

     #ifdef INCLUDE_TEST_H
        #include "test.h"
     #endif

     Any of the following approaches could be taken to instruct CMAKE
     to ignore this include statement:

     #ifdef INCLUDE_TEST_H
        /* CMAKE - INCLUDE "" OFF */
        #include "test.h"
        /* CMAKE - INCLUDE "" ON */
     #endif

     or

     #ifdef INCLUDE_TEST_H
     // #include "test.h"
     #endif

     or

     #ifdef INCLUDE_TEST_H
     /* #include "test.h" */
     #endif

     Include-File Names

     The full path of a local-, system-, or resource-include file may
     not be given in an include statement (i.e. the include-file name
     must not begin with a drive or a '\' character).  However,
     relative paths may be used (i.e.  the include-file name may begin
     with dots (..) or a directory name).

     Note that if a path is used in the file name of an included
     resource, '/' or '\\' must be used in place of the usual path
     separator, '\'.  For example, you would use

     myicon ICON "..\\ico\\myicon.ico"

     or

     myicon ICON "../ico/myicon.ico"

     in place of

     myicon ICON "..\ico\myicon.ico"

     This restriction is imposed by the Resource Compiler, itself.
     (The behavior described above was observed in the "Microsoft
     Windows Resource Compiler Version 3.00 (dated 6/1/90)".  More
     recent versions of the Resource Compiler may or may not behave
     this way.)

Error Handling with RC/C

     If an RC/C command is required, CMAKE will add the RC/C command to
     the batch file, "makefile.bat".  In addition, CMAKE will insert
     the following command after the RC/C command:

     if errorlevel 1 goto failed

     This will ensure that if the RC/C command fails (i.e. returns a
     nonzero value), "makefile.bat" will terminate.

Output from CMAKE for RC/C

     Normally, CMAKE provides no information on the processing of a
     given RC/C command unless the command is required.  If the command
     is required, one of the following messages will appear:

     RES resource_file Does Not Exist

     This indicates that <resource_file> does not exist.

     SRC resource_script_file > RES

     This indicates that <resource_script_file> is newer than the
     resource file.

     INC include_file > RES resource_file

     This indicates that <include_file> is newer than <resource_file>.

Examples

     rc          35  RES test.res Does Not Exist
     rc          35  SRC test.rc > RES
     rc          35  INC test.h > RES test.res
     rc          35  INC test.ico > RES test.res

Verbose Output from CMAKE for RC/C

     When the verbose output format is selected, CMAKE lists all of the
     time stamp comparisons that it makes in route to determining if a
     given RC/C command is required.

     Examples: RC/C Not Required
               RC/C Required

Example: RC/C Not Required

     rc /v /r test.rc

           Command:      rc
           Parameters:   /v /r test.rc
           Command Type: intrinsic
           Command ID:   6

           Operation: Compile

           Resource-Script File: test.rc
           Resource File:        test.res

           Resource-Script File is older than Resource File
           Include File test1.h is older than Resource File
           Include File test2.h is older than Resource File
           Include File test.ico is older than Resource File

           * not required *

Example: RC/C Required

     rc /v /r test.rc

           Command:      rc
           Parameters:   /v /r test.rc
           Command Type: intrinsic
           Command ID:   6

           Operation: Compile

           Resource-Script File: test.rc
           Resource File:        test.res

           Resource-Script File is older than Resource File
           Include File test1.h is older than Resource File
           Include File test2.h is older than Resource File
     ***** Include File test.ico is NEWER than Resource File

           Modified Command Line:

     rc /v /r test.rc
     if errorlevel 1 goto failed

           * REQUIRED *

Helpful Hints for RC/C

     Controlling Resource-Script File Processing

     When the sensitivity to resource-include statements is "on", CMAKE
     assumes that each line that it reads from the resource-script
     file, that does not begin with, '/' or '#' (and is not blank), is
     a resource-include statement.

     But generally, not every line in a resource-script file, that does
     not begin with, '#' or '/', will be a resource-include statement
     (there will usually be some multiple-line statements such as MENU
     or DIALOG statements present in the resource-script file as well).

     To prevent CMAKE from misinterpreting a line in the resource-
     script file as a resource-include statement, you could place all
     of your include statements at the top of the resource-script file,
     and place the following comment in your script file after the
     section that contains the include statements:

     /* CMAKE - INCLUDE END */

     More specifically, you could take the following approach:

     1. If a heading (consisting of comments) is desired in the
        resource-script file, begin each comment line with, '//'
        or '/*'.
     2. Place all #include statements and statements that include
        resources (such as icons, bitmaps, cursors, fonts, and user-
        defined resources) after any comments placed at the top of
        the resource-script file.
     3. Place the comment, "/* CMAKE - INCLUDE END */", after the
        section of the resource-script file that contains the #include
        statements and statements that are used to include resources.

     When the sensitivity to resource-include statements is "off",
     CMAKE ignores all lines in the resource-script file that do not
     begin with, "#include" or "/* CMAKE -".  Thus, CMAKE will not
     misinterpret any lines in the resource-script file as resource-
     include statements, when the sensitivity to resource-include
     statements is "off".  To take advantage of this fact, you could
     use the following switches in your resource-script file:

     /* CMAKE - INCLUDE RESOURCE OFF */
     /* CMAKE - INCLUDE RESOURCE ON */

     These switches may be used to turn the sensitivity to resource-
     include statements, "off" and "on", respectively.

RC/A

     Description

     The RC/A Command Line

     When is an RC/A Command Required?

     Error Handling

     Output from CMAKE

     Verbose Output from CMAKE

Description of RC/A

     We use the symbol, "RC/A", to represent an RC command that is used
     to add a resource file to an executable file.  The suffix, '/A',
     stands for "Add".

The RC/A Command Line

     Resource-File Name

     The resource-file name must be the last or second-to-last command
     -line parameter.  The resource-file name must have the extension,
     '.res'.  If the path of the resource file is not specified, it is
     assumed that the resource file is located in the current
     directory.

     Executable-File Name

     If the resource-file name is the last command-line parameter,
     the executable-file name is derived from the resource-file name
     by replacing the file extension, '.res', with '.exe'.

     If the resource-file name is the second to last command-line
     parameter, the executable-file name must be the last command-line
     parameter.  In this case, no default extension will be assumed for
     the executable file.  If the path of the executable file is not
     specified, it will be assumed that the executable file is located
     in the current directory.

     CMAKE does not recognize the /fe option which may be used to
     rename the executable file.

Examples

     command:         rc /v test.res
     resource file:   current_directory\test.res
     executable file: current_directory\test.exe

     command:         rc /v ..\res\test.res ..\exe\test.exe
     resource file:   ..\res\test.res
     executable file: ..\exe\test.exe

When is an RC/A Command Required?

     A given RC/A command will be required if any of the following
     conditions is true:

     1. A previous make-file command for which the executable file is a
        target (e.g. LINK), is required.
     2. A previous make-file command for which the resource file is a
        target (e.g. RC/C), is required.

     These conditions are checked in order.  If any condition is found
     to be true, the remaining conditions are not checked.

Error Handling with RC/A

     If an RC/A command is required, CMAKE will add the RC/A command to
     the batch file, "makefile.bat".  In addition, CMAKE will insert
     the following commands after the RC/A command:

     if errorlevel 1 goto n_rc_failed
     goto n_rc_ok
     if exist executable_file erase executable_file
     goto failed

     This will ensure that if the RC/A command fails (i.e. returns a
     nonzero value), the faulty executable file will be erased, and
     "makefile.bat" will terminate.  (Actually, in place of the prefix,
     'n_', used in the batch file labels given above, CMAKE will use a
     numeric prefix (e.g. 2_rc_failed) that is ensured to be unique
     across all required RC commands.)

Output from CMAKE for RC/A

     Normally, CMAKE provides no information on the processing
     of a given RC/A command unless the command is required.  If the
     command is required, one of the following messages will appear:

     EXE executable_file Has Been Updated

     This indicates that a previous make-file command for which
     <executable_file> is a target file (e.g. LINK), is required.

     RES resource_file Has Been Updated

     This indicates that a previous make-file command for which
     <resource_file> is a target file (e.g. RC/C), is required.

Examples

     rc          37  EXE test.exe Has Been Updated
     rc          37  RES test.res Has Been Updated

Verbose Output from CMAKE for RC/A

     When the verbose output format is selected, CMAKE lists all of the
     time stamp comparisons that it makes in route to determining if a
     given RC/A command is required.

     Examples: RC/A Not Required
               RC/A Required

Example: RC/A Not Required

     rc /v test.res test.exe

           Command:      rc
           Parameters:   /v test.res test.exe
           Command Type: intrinsic
           Command ID:   6

           Operation: Add Resource To Executable

           Resource File:   test.res
           Executable File: test.exe

           Executable File Has Not Been Updated
           Resource File Has Not Been Updated

           * not required *

Example: RC/A Required

     rc /v test.res test.exe

           Command:      rc
           Parameters:   /v test.res test.exe
           Command Type: intrinsic
           Command ID:   6

           Operation: Add Resource To Executable

           Resource File:   test.res
           Executable File: test.exe

           Executable File Has Not Been Updated
     ***** Resource File Has Been Updated

           Modified Command Line:

     rc /v test.res test.exe
     if errorlevel 1 goto 0_rc_failed
     goto 0_rc_ok
     :0_rc_failed
     if exist test.exe erase test.exe
     goto failed
     :0_rc_ok

           * REQUIRED *

RC/W

     Description

     The RC/W Command Line

     When is an RC/W Command Required?

     Error Handling

     Output from CMAKE

     Verbose Output from CMAKE

Description of RC/W

     We use the symbol, "RC/W", to represent an RC command that is used
     to add the Windows version stamp to a file.  The suffix, '/W',
     stands for "Windows".

The RC/W Command Line

     We refer the file to which we would like to add the Windows
     version stamp, as the "target file".

     Target-File Name

     The target-file name must be the last command-line parameter.  If
     there are two or more command-line parameters, the second to last
     command-line parameter must be an option.  No default extension is
     assumed for the target file.  The target file may not have the
     extension, '.res'.  If the path of the target file is not
     specified, it is assumed that the target file is located in the
     current directory.

Examples

     command:     rc /v test.exe
     target file: current_directory\test.exe

     command:     rc /v ..\dll\test.dll
     target file: ..\dll\test.dll

     command:     rc /v ..\drv\test.drv
     target file: ..\drv\test.drv

When is an RC/W Command Required?

     A given RC/W command will be required if the target file of the
     RC/W command is also the target of a previous make-file command
     that is required.

Error Handling with RC/W

     If an RC/W command is required, CMAKE will add the RC/W command to
     the batch file, "makefile.bat".  In addition, CMAKE will insert
     the following commands after the RC/W command:

     if errorlevel 1 goto n_rc_failed
     goto n_rc_ok
     if exist target_file_name erase target_file_name
     goto failed

     This will ensure that if the RC/W command fails (i.e. returns a
     nonzero value), the faulty target file of RC/W will be erased, and
     "makefile.bat" will terminate.  (Actually, in place of the prefix,
     'n_', used in the batch file labels given above, CMAKE will use a
     numeric prefix (e.g. 2_rc_failed) that is ensured to be unique
     across all required RC commands.)

Output from CMAKE for RC/W

     Normally, CMAKE provides no information on the processing of a
     given RC/W command unless the command is required.  If the command
     is required, the following message will appear:

     TRG target_file Has Been Updated

     This indicates that a previous make-file command for which
     <target_file> is a target file (e.g. LINK), is required.

Examples

     rc          39  TRG test.dll Has Been Updated

Verbose Output from CMAKE for RC/W

     When the verbose output format is selected, CMAKE lists all of the
     time stamp comparisons that it makes in route to determining if a
     given RC/W command is required.

     Examples: RC/W Not Required
               RC/W Required

Example: RC/W Not Required

     rc /v test.dll

           Command:      rc
           Parameters:   /v test.dll
           Command Type: intrinsic
           Command ID:   6

           Operation: Add Windows Version Stamp

           Target File: test.dll

           Target File Has Not Been Updated

           * not required *

Example: RC/W Required

     rc /v test.dll

           Command:      rc
           Parameters:   /v test.dll
           Command Type: intrinsic
           Command ID:   6

           Operation: Add Windows Version Stamp

           Target File: test.dll

     ***** Target File Has Been Updated

           Modified Command Line:

     rc /v test.dll
     if errorlevel 1 goto 1_rc_failed
     goto 1_rc_ok
     :1_rc_failed
     if exist test.dll erase test.dll
     goto failed
     :1_rc_ok

           * REQUIRED *

RC/CA

     CMAKE does not support this operation.

REM

     Description

     REM is an MS-DOS command.  It is used to add comments to DOS batch
     programs.

     When is a REM Command Required?

     REM commands are never required.

     The REM Command Line

     CMAKE imposes no restrictions on the REM command.

     Switches

     The following two REM commands have a special meaning to CMAKE:

     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES ON
     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES OFF

     These commands may be used to indicate whether or not CMAKE should
     scan C, assembly-language, and resource-script include files for
     include statements.  These switches remain in effect until the end
     of the make file or until another such REM switch is encountered.
     These commands take precedence over the Boolean variable,
     scan_include_files_for_includes, which may be set in the
     configuration file.

     Output from CMAKE

     Normally, CMAKE provides no information on the processing of REM
     commands.

     Verbose Output from CMAKE

     When the verbose output format is selected, CMAKE will list each
     REM command and indicate that the command is not required.

     For example, if the command, "rem TEST.EXE", is used in the make
     file, CMAKE will generate the following output:

     rem TEST.EXE

           Command:      rem
           Parameters:   TEST.EXE
           Command Type: intrinsic (comment)

           * not required *

SET

     Description

     SET is an internal MS-DOS command.  It is used to display, set, or
     remove MS-DOS environment variables.

     When is a SET Command Required?

     SET commands are always required.

     The SET Command Line

     CMAKE supports the following two forms of the SET command:

     set
     set environment_variable_name=environment_variable_value

     Error Handling

     Ordinarily, CMAKE will insert the following command into the batch
     file, "makefile.bat", after a command that is required:

     if errorlevel 1 goto failed

     However, this is not done for the SET command because the SET
     command does not return a nonzero value when it fails.

     Output from CMAKE

     Normally, CMAKE provides the following information for every SET
     command:

     always required

     For example, if there is a SET command on line 10 of the make
     file, CMAKE will generate the following output:

     set         10  always required

     Verbose Output from CMAKE

     When the verbose output format is selected, CMAKE will list each
     SET command and indicate that the command is required.

     For example, if the command, "set include=..\h;c:\c\include",
     is used in the make file, CMAKE will generate the following
     output:

     set include=..\h;c:\c\include

           Command:      set
           Parameters:   include=..\h;c:\c\include
           Command Type: intrinsic
           Command ID:   5

           Environment Variable Name:  INCLUDE
           Environment Variable Value: ..\h;c:\c\include

           * REQUIRED *

User-Defined Commands

     Description

     When is a User-Defined Command Required?

     The Command Line for a User-Defined Command

     How CMAKE Processes the Command Line of a User-Defined Command

     Predefined Pseudofiles

     Error Handling

     Output from CMAKE

     Verbose Output from CMAKE

Description of User-Defined Commands

     User-defined commands are commands that the user has added to
     CMAKE's vocabulary through the use of command-definition
     statements in the configuration file.  A command-definition
     statement instructs CMAKE on how to determine if a given user-
     defined command is required.

     See: Command-Definition Statements

When is a User-Defined Command Required?

     A given user-defined command will be required if one of the
     following conditions is true:

     1. At least one target file does not exist.
     2. There is a source file that is newer than some target file.

The Command Line for a User-Defined Command

     White space must follow all source and target-file names.

How CMAKE Processes the Command Line of a User-Defined Command

     The source and target files for a given user-defined command are
     extracted from the command line by using the command-definition
     configuration statement for the user-defined command.  In a way,
     the command-definition statement serves as a "prototype" for the
     user-defined command (similar to the way in which a function
     declaration can serve as a "prototype" for a given C language
     function).  The command-definition statement provides a list of
     stationary parameters and a list of floating parameters.
     Usually, each stationary and floating parameter is used to specify
     the format for a particular source or target file will be given on
     the command line for the user-defined command.  Each stationary
     and floating parameter will be of the form

                 parameter_prefix%file_type_code

     where file_type_code indicates whether the file is a source file
     or target file (note that the file may also be specified as
     neutral), and parameter_prefix is the prefix that will precede the
     file name on the command line (note that the parameter prefix may
     be null).

     For each command-line parameter, CMAKE scans the list of floating
     parameters (from left to right) until a floating parameter is
     found that has a prefix that matches the beginning of the current
     command-line parameter.  If a matching floating parameter is not
     found, the prefix of the current stationary parameter is compared
     with the beginning of the current command-line parameter.  (The
     current stationary parameter is the first stationary parameter in
     the list of stationary parameters that has not yet been used to
     obtain a file name from the command line.)  (CMAKE considers a
     null prefix to be a match for anything.)

     If a matching floating or stationary parameter is not found, the
     command-line parameter is skipped.  Otherwise, the file type
     (source, target, or neutral) is obtained from the file type code
     ('s', 't', or 'n') at the end of the matching stationary or
     floating parameter.  If the file is a neutral file, the command-
     line parameter is skipped.  If the file is a source or target
     file, CMAKE obtains the time stamp for the file.  (Actually, if it
     has already been established that the user-defined command is
     required (i.e. there is a target file that does not exist, or
     there is a source file that is newer that some target file), CMAKE
     will not obtain the time stamp of the file.)

     The process described above is carried out for each command-line
     parameter, until either

     1. all command-line parameters have been examined, or
     2. the list of floating parameters is empty and all stationary
        parameters have been used to obtain a file name from the
        command line.

Predefined Pseudofiles for User-Defined Commands

     "start.psf"

     The file name, "start.psf", may be used as a source or target file
     within any user-defined command.  You may think of "start.psf" as
     a file that is created just before CMAKE begins processing the
     make file.  The sole purpose of "start.psf" is to mark this point
     in time.  (We refer to "start.psf" as a pseudofile because this
     file is never actually created.)

Examples

     For each example given below, it is assumed that the following
     command-definition statement has been provided in the
     configuration file:

     command_definition : newcmd sp[%s %t]

     Using "start.psf" as a Source File

     The following command:

     newcmd start.psf test.trg

     will be required only if there are no required commands that occur
     before it for which "test.trg" is a target file.

     Using "start.psf" as a Target File

     The following command:

     newcmd test.src start.psf

     will be required only if there is a required command that occurs
     before it for which "test.src" is a target file.

Error Handling with User-Defined Commands

     If a user-defined command is required, CMAKE will add the user-
     defined command to the batch file, "makefile.bat".  In addition,
     CMAKE will insert the following command after the user-defined
     command:

     if errorlevel 1 goto failed

     This will ensure that if the user-defined command fails (i.e.
     returns a nonzero value), "makefile.bat" will terminate.

Output from CMAKE for User-Defined Commands

     Normally, CMAKE provides no information on the processing of a
     given user-defined command unless the command is required.  If the
     command is required, one of the following messages will appear:

     TRG target_file Does Not Exist

     This indicates that <target_file> does not exist.

     SRC source_file > TRG target_file

     This indicates that <source_file> is newer than <target_file>.

Examples

     cmd1        21  TRG test.trg Does Not Exist
     cmd2        22  SRC test.src > TRG test.trg

Verbose Output from CMAKE for User-Defined Commands

     For a user-defined command, if the verbose output format is
     selected, CMAKE will list all of the source, target, and neutral
     files that are derived from the command line.  For each file
     listed, CMAKE will indicate which stationary or floating parameter
     was used to obtain the file.

     For each example given below, it is assumed that the following
     command-definition statement has been provided in the
     configuration file:

     command_definition : newcmd sp[%s %s] fp[/o%t]

     Examples: User-Defined Command Not Required
               User-Defined Command Required

Example: User-Defined Command Not Required

     newcmd /otest.trg test1.src test2.src

           Command:      newcmd
           Parameters:   /otest.trg test1.src test2.src
           Command Type: user defined
           Command ID:   2

           Target File:  test.trg (floating parameter 1)
           Source File:  test1.src (stationary parameter 1)
           Source File:  test2.src (stationary parameter 2)

           Source Files are older than Target Files

           * not required *

Example: User-Defined Command Required

     newcmd /otest.trg test1.src test2.src

           Command:      newcmd
           Parameters:   /otest.trg test1.src test2.src
           Command Type: user defined
           Command ID:   2

           Target File:  test.trg (floating parameter 1)
           Source File:  test1.src (stationary parameter 1)
           Source File:  test2.src (stationary parameter 2)

     ***** Source File test2.src is NEWER than Target File test.trg

           Modified Command Line:

     newcmd /otest.trg test1.src test2.src
     if errorlevel 1 goto failed

           * REQUIRED *

Equivalent Commands

     Description

     How CMAKE Processes an Equivalent Command

     Output from CMAKE

     Verbose Output from CMAKE

Description of Equivalent Commands

     Equivalent commands are commands that the user has added to
     CMAKE's vocabulary through the use of command-equivalence
     statements in the configuration file.  A command-equivalence
     statement specifies that a given command should be treated exactly
     like another given intrinsic or user-defined command.

     See: Command-Equivalence Statements

How CMAKE Processes an Equivalent Command

     A given command that has been defined to be equivalent to some
     intrinsic or user-defined command (referred to here as the
     equivalent command) is treated exactly like the equivalent
     command.  That is to say:

     1. The command will be required if and only if the equivalent
        command is required.
     2. Any restrictions that apply to the equivalent command will also
        apply to the given command.
     3. Any error handling (e.g. "if errorlevel 1 goto failed") that is
        used with the equivalent command, will also be used with the
        given command.

Output from CMAKE for Equivalent Commands

     Normally, the output for CMAKE for the given command will be
     identical to that of the equivalent command, except that the given
     command name will appear in place of the equivalent-command name.

Verbose Output from CMAKE for Equivalent Commands

     The verbose output format for a given command will be identical to
     that of the equivalent command, except that the name and type
     (intrinsic or user-defined) of the equivalent command will be
     provided.

     For each example given below, it is assumed that the following
     command-equivalence statement has been provided in the
     configuration file:

     command_equivalence : spasm = masm

     Examples: Equivalent Command Not Required
               Equivalent Command Required

Example: Equivalent Command Not Required

     spasm /W2 /V /Z test.asm,test.obj;

           Command:      spasm
           Parameters:   /W2 /V /Z test.asm,test.obj;
           Command Type: equivalent (equivalent to intrinsic command: masm)
           Command ID:   7

           Source File: test.asm
           Object File: test.obj

           Source File is older than Object File

           * not required *

Example: Equivalent Command Required

     spasm /W2 /V /Z test.asm,test.obj;

           Command:      spasm
           Parameters:   /W2 /V /Z test.asm,test.obj;
           Command Type: equivalent (equivalent to intrinsic command: masm)
           Command ID:   7

           Source File: test.asm
           Object File: test.obj

     ***** Source File is NEWER than Object File

           Modified Command Line:

     spasm /W2 /V /Z test.asm,test.obj;
     if errorlevel 1 goto failed

           * REQUIRED *

Unrecognized Commands in the Make File

     Description

     Unrecognized commands are the commands that are not intrinsic,
     user-defined, or equivalent.

     When is an Unrecognized Command Required?

     Unrecognized commands are always required.

     The Command Line for an Unrecognized Command

     CMAKE imposes no restrictions on the command line of an
     unrecognized command.

     Error Handling

     Since unrecognized commands are required (unconditionally), CMAKE
     will add each unrecognized command to the batch file,
     "makefile.bat".  CMAKE does not insert any error handling commands
     (e.g. "if errorlevel 1 goto failed") after an unrecognized
     command.  Thus, "makefile.bat" will not terminate when an
     unrecognized command fails.

     Output from CMAKE

     Normally, CMAKE provides the following information for every
     unrecognized command:

     unrecognized

     For example, if an unrecognized command called, "whatcmd", is used
     in the make file, CMAKE will provide the following output:

     whatcmd     21  unrecognized

     Verbose Output from CMAKE

     When the verbose output format is selected, CMAKE will list each
     unrecognized command and indicate that the command is required.

     For example, if the command, "whatcmd test.src test.trg", is used
     in the make file, and "whatcmd" is an unrecognized command, CMAKE
     will generate the following output:

     whatcmd test.src test.trg

           Command:      whatcmd
           Parameters:   test.src test.trg
           Command Type: unrecognized

           * REQUIRED *

The if Statement

     Description

     Syntax

     When are the Commands in the Body of an if Statement Required?

     Predefined Pseudofiles

     Error Handling

     Output from CMAKE

     Verbose Output from CMAKE

Description of the if Statement

     The if statement is used in a make file to explicitly specify
     source/target file dependencies.  It is an extension of the
     target/dependent description blocks which are used with most
     generic make utilities.

Syntax of the if Statement

     An if statement has one of the following general forms:

     if (   target_file_1             if (   target_file_1
            target_file_2                    target_file_2
            ...                              ...
            target_file_m                    target_file_m
          < source_file_1                  < source_file_1
            source_file_2                    source_file_2
            ...                              ...
            source_file_n )                  source_file_n )
                                   
        command                          {
                                         command_1
                                         command_2
                                         ...
                                         command_r
                                         }

     Within the if statement, white space is ignored (except between
     file names, where it is required).  The target-file names must be
     listed before the source-file names, and the character, '<', must
     be used to separate the set of target-file names from the set of
     source-file names.  Each command within the body of an if
     statement must appear on a separate line.  The brackets ({}) are
     required only in the case where the body of the if statement
     consists of more than one command.

Examples

     /*****************************************************************
     *  The brackets, '{' and '}', are optional when the body of an
     *  if statement consists of only one command:
     *****************************************************************/

     if ( 1.trg < 1.src 2.src )
        echo  hello

     /*****************************************************************
     *  The brackets, '{' and '}', are required when the body of an
     *  if statement consists of more than one command:
     *****************************************************************/

     if ( 1.trg 2.trg < 1.src 2.src )
        {
        echo  hello
        echo  world
        }

     /*****************************************************************
     *  Since white space is ignored, the lists of source- and target-
     *  file names may be given in a variety of formats:
     *****************************************************************/

     if
        (
          1.trg
                2.trg
                      < 1.src
                              2.src
                                    )
                                      {
                                      echo  hello
                                      echo  world
     }

     /*****************************************************************
     *  You may not place the closing bracket, '}', at the end of the
     *  last command in the body of an if statement.  The following
     *  example shows an unacceptable location for the closing bracket:
     *****************************************************************/

     if ( 1.trg < 1.src )
        {
        echo  hello }

     /*****************************************************************
     *  In this last example, CMAKE would assume that the closing
     *  bracket, '}', is part of the ECHO command line.
     *****************************************************************/

When are the Commands in the Body of an if Statement Required?

     The commands within the body of a given if statement will be
     required if one of the following conditions is true:

     1. At least one target file does not exist.
     2. There is a source file that is newer than some target file.

Examples

     if ( 1.trg < 1.src 2.src )
        {
        echo  These echo commands will be required if the target file,
        echo  "1.trg", does not exist, or at least one of the source
        echo  files, "1.src" and "2.src", is newer than the target
        echo  file, "1.trg".
        }

     if ( 1.trg 2.trg < 1.src 2.src )
        {
        echo  These echo commands will be required if any of the
        echo  following conditions is true:
        echo.
        echo  1. The target file, "1.trg", does not exist.
        echo  2. The target file, "2.trg", does not exist.
        echo  3. The source file, "1.src", is newer than "1.trg".
        echo  4. The source file, "1.src", is newer than "2.trg".
        echo  5. The source file, "2.src", is newer than "1.trg".
        echo  6. The source file, "2.src", is newer than "2.trg".
        }

Predefined Pseudofiles for the if Statement

     "start.psf"

     The file name, "start.psf", may be used as a source or target file
     within any if statement.  You may think of "start.psf" as a file
     that is created just before CMAKE begins processing the make file.
     The sole purpose of "start.psf" is to mark this point in time.
     (We refer to "start.psf" as a pseudofile because this file is
     never actually created.)

Examples

     Using "start.psf" as a Source File

     if (   test.trg
          < start.psf )

        {
        echo  These echo commands will be required only if there are no
        echo  required commands that occur before this if statement for
        echo  which "test.trg" is a target file.
        }

     Using "start.psf" as a Target File

     if (   start.psf
          < test.src  )

        {
        echo  These echo commands will be required only if there is a
        echo  required command that occurs before this if statement for
        echo  which "test.src" is a target file.
        }

Error Handling with the if Statement

     If the commands within the body of a given if statement are
     required, CMAKE will add all of the commands to the batch file,
     "makefile.bat".  In addition, CMAKE will insert the following
     command after each required command:

     if errorlevel 1 goto failed

     This will ensure that if any command within the body of the if
     statement fails (i.e. returns a nonzero value), "makefile.bat"
     will terminate.

Output from CMAKE for the if Statement

     Normally, CMAKE provides no information on the processing of a
     given if statement unless the commands within the body of the if
     statement are required.  If the commands are required, each of the
     commands within the body of the if statement will be listed with
     one of the following messages:

     TRG target_file Does Not Exist

     This indicates that <target_file> does not exist.

     SRC source_file > TRG target_file

     This indicates that <source_file> is newer than <target_file>.

Examples

     cmd         21  TRG test.trg Does Not Exist
     cmd         21  SRC test.src > TRG test.trg

Verbose Output from CMAKE for the if Statement

     For each example given below, it is assumed that the following
     if statement has been given in the make file:

     if (   test1.trg test2.trg
          < test1.src test2.src test3.src )

        {
        echo hello
        echo good bye
        }

     Examples: Commands Not Required
               Commands Required

Example: Commands Not Required

     if (...)

           Target File: test1.trg
           Target File: test2.trg
           Source File: test1.src
           Source File: test2.src
           Source File: test3.src

           Source Files are older than Target Files

           * not required *

Example: Commands Required

     if (...)

           Target File: test1.trg
           Target File: test2.trg
           Source File: test1.src
           Source File: test2.src
           Source File: test3.src

     ***** Source File test3.src is NEWER than Target File test1.trg

           Modified Command Line(s):

     echo hello
     if errorlevel 1 goto failed
     echo good bye
     if errorlevel 1 goto failed

           * REQUIRED *

Comments in the Make File

     C-style comments (/* */) and C++-style comments (//) may be used
     to annotate a make file.  A comment is treated as a single white-
     space character, but is otherwise ignored.

     The comment delimiters, /* and //, are not permitted after the
     command name on a command line.

Examples

     Suppose that we have a make file that consists of the following
     two commands:

     cl /c /W4 hello.c
     cl /c /W4 world.c

     We could "comment out" the command, "cl /c /W4 world.c", by adding
     comment delimiters around the command:

     cl /c /W4 hello.c
     /*cl /c /W4 world.c*/

     Another acceptable approach would be:

     cl /c /W4 hello.c
     /*
     cl /c /W4 world.c
     */

     We could also use a C++-style comment to obtain the same result:

     cl /c /W4 hello.c
     // cl /c /W4 world.c

     An unacceptable way to "comment out" the command,
     "cl /c /W4 world.c", would be:

     cl /c /W4 hello.c /*
     cl /c /W4 world.c
     */

     In this case, CMAKE would assume that the comment delimiter, '/*',
     is part of the command, "cl /c /W4 hello.c".  In fact, since '/*'
     is the last token on the command line, '/*' would be taken to be
     the source-file name for the CL command!

     Another unacceptable comment would be:

     cl /c /W4 hello.c  // This is an unacceptable comment
     cl /c /W4 world.c

     In this case, CMAKE would take the word, "comment", to be the
     source-file name of the command, "cl /c /W4 hello.c".

The CMAKE Configuration File

     Description

     How CMAKE Locates the Configuration File

     The Section Tag

     Statements

          Comments

          Assignment Statements

          Command-Definition Statements

          Command-Equivalence Statements

Description of the Configuration File

     A configuration file may be used with CMAKE in order to alter
     default switch settings, define new commands, and set up command
     equivalences.  You may execute CMAKE without a configuration file
     if you are satisfied with the default settings and do not need to
     enlarge CMAKE's command table.

Example

     ; cmake.cfg - CMAKE configuration file

     [CMAKE]

     ; Assignment statements
     scan_include_files_for_includes = no
     search_source_dir_for_includes = yes
     search_current_dir_for_includes = yes
     c_include_""_on = yes
     c_include_<>_on = no
     asm_include_on = yes
     rc_include_""_on = yes
     rc_include_<>_on = no
     rc_include_resource_on = yes
     run_output_file = yes
     display_output_file_commands = no
     display_execution_time = yes

     ; Command-definition statements
     command_definition : sort sp[<%s >%t]

     ; Command-equivalence statements
     command_equivalence : find = sort

How CMAKE Locates the Configuration File

     When CMAKE begins, it attempts to locate and load its
     configuration file.  CMAKE uses the following process to locate
     the configuration file:

     1. If the environment variable, CMAKE_CFG, is defined, its value
        is used for the configuration-file name.
     2. If the environment variable, CMAKE_CFG, is not defined, or the
        configuration file given by, CMAKE_CFG, does not exist,
        CMAKE looks for the file, "cmake.cfg", in the current
        directory.
     3. If "cmake.cfg" is not found in the current directory, CMAKE
        looks for "cmake.cfg" in the directory in which CMAKE.EXE is
        located.
     4. If "cmake.cfg" is not found in the directory in which CMAKE.EXE
        is located, CMAKE assumes that there is no configuration file,
        and as a result, will use default settings for all Boolean
        variables.

     Note that the environment variable, CMAKE_CFG, should not be
     defined with a SET command in the make file because CMAKE loads
     the configuration file before it begins processing the make file.

     Verbose Output from CMAKE

     When the verbose output format is selected, CMAKE lists the
     locations where it attempts to find the configuration file.  It
     will also indicate whether or not the configuration file has been
     found.

     Example:

     CMAKE_CFG Environment Variable: CMAKE_CFG is undefined
     Current Directory:              c:\test\cmake.cfg does not exist
     CMAKE.EXE Directory:            configuration file c:\c\cmake.cfg found

The CMAKE Section Tag in the Configuration File

     CMAKE ignores all lines in the configuration until a line is found
     that begins with the section tag, [CMAKE].  CMAKE will process all
     lines that follow the section tag, until a line is found that
     begins with '[' (indicating the beginning of another section in
     the configuration file) or the end-of-file is reached.

     Because of the use of section tags, the configuration data for
     CMAKE may be placed in a file that contains initialization
     data for other applications.  For example, the configuration data
     for CMAKE could be placed in the file, "tools.ini", which is used
     with the Microsoft Editor or in the file, "win.ini", which is used
     with Microsoft Windows.  Bear in mind that if the configuration
     data for CMAKE is placed at the end of a long file, CMAKE will
     become sluggish.

Configuration-File Statements

     The configuration data for CMAKE consists of single-line
     statements.

     Leading white space is ignored on every line of the configuration
     file.

Comments in the Configuration File

     CMAKE ignores any line in the configuration file that begins with
     the character, ';'.

Assignment Statements in the Configuration File

     Syntax

     Boolean Variables

     Verbose Output from CMAKE

Syntax of Assignment Statements

     Assignment statements have the following form:

     Boolean_variable_name = value

     where 'Boolean_variable_name' is the name of a Boolean variable
     and 'value' must be either yes or no.  White space is ignored
     between the variable name and the value.

Boolean Variables

     scan_include_files_for_includes

     search_source_dir_for_includes
     search_current_dir_for_includes

     c_include_""_on
     c_include_<>_on

     asm_include_on

     rc_include_""_on
     rc_include_<>_on
     rc_include_resource_on

     run_output_file

     display_output_file_commands
     display_execution_time

scan_include_files_for_includes

     Indicates whether or not CMAKE should scan include files for
     include statements.  The following commands, which may be used in
     the make file, take precedence over this Boolean variable:

     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES ON
     REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES OFF

     Default: no

search_source_dir_for_includes

     Indicates whether or not CMAKE should look for include files in
     the source-file's directory before using the INCLUDE environment
     variable.

     Default: yes

search_current_dir_for_includes

     Indicates whether or not CMAKE should look for include files in
     the current directory before using the INCLUDE environment
     variable.

     Default: yes

c_include_""_on

     Controls the initial sensitivity to local-include statements, for
     each C-source file.  Within a given C-source file, the following
     comments may be used to override the value of this Boolean
     variable:

     /* CMAKE - INCLUDE "" OFF */
     /* CMAKE - INCLUDE "" ON */

     Default: yes

c_include_<>_on

     Controls the initial sensitivity to system-include statements, for
     each C-source file.  Within a given C-source file, the following
     comments may be used to override the value of this Boolean
     variable:

     /* CMAKE - INCLUDE <> OFF */
     /* CMAKE - INCLUDE <> ON */

     Default: no

asm_include_on

     Controls the initial sensitivity to include statements, for each
     assembly-language-source file.  Within a given assembly-language-
     source file, the following comments may be used to override the
     value of this Boolean variable:

     ; CMAKE - INCLUDE OFF
     ; CMAKE - INCLUDE ON

     Default: yes

rc_include_""_on

     Controls the initial sensitivity to local-include statements, for
     each resource-script file.  Within a given resource-script file,
     the following comments may be used to override the value of this
     Boolean variable:

     /* CMAKE - INCLUDE "" OFF */
     /* CMAKE - INCLUDE "" ON */

     Default: yes

rc_include_<>_on

     Controls the initial sensitivity to system-include statements, for
     each resource-script file.  Within a given resource-script file,
     the following comments may be used to override the value of this
     Boolean variable:

     /* CMAKE - INCLUDE <> OFF */
     /* CMAKE - INCLUDE <> ON */

     Default: no

rc_include_resource_on

     Controls the initial sensitivity to resource-include statements,
     for each resource-script file.  Within a given resource-script
     file, the following comments may be used to override the value of
     this Boolean variable:

     /* CMAKE - INCLUDE RESOURCE OFF */
     /* CMAKE - INCLUDE RESOURCE ON */

     Default: yes

run_output_file

     Determines whether or not the batch file, "makefile.bat", is to be
     executed.  The command-line option, /n, takes precedence over this
     Boolean variable.

     Default: yes

display_output_file_commands

     Controls whether or not the commands in the batch file,
     "makefile.bat", are displayed as they are executed.  Note that the
     output from each executed command is always displayed.  This
     switch only determines whether or not the commands themselves are
     also displayed.  The value of this variable is irrelevant if the
     variable, run_output_file, is 'no'.

     Default: no

display_execution_time

     Controls whether or not CMAKE reports its execution time.  This
     time is the number of seconds that it takes CMAKE to create the
     batch file, "makefile.bat".  It does not include the time required
     to execute this batch file.  This time is displayed in the both
     the concise and verbose CMAKE output formats.

     Default: yes

Verbose Output from CMAKE for Assignment Statements

     When the verbose output format is selected, CMAKE will list each
     assignment statement that it finds in the configuration file.

     For example, if the assignment statement,
     "search_source_dir_for_includes = no", is used in the
     configuration file, CMAKE will generate the following output:

     search_source_dir_for_includes = no

           Command:      search_source_dir_for_includes
           Parameters:   no
           Command Type: assignment
           Command ID:   0

Command-Definition Statements

     Command-definition statements may be used to expand CMAKE's
     command table.  Each command-definition statement provides
     information on how to determine when a particular command is
     required.  The command-definition statement tells CMAKE which
     files, listed in the command's parameters, are source files (i.e.
     files that the command uses), and which files are target files
     (i.e. files that the command creates)

     Syntax

     The general form of the command-definition configuration statement
     is:

     command_definition : command_name sp[...] fp[...]

     White space between 'command_definition' and the command name is
     ignored.

     The command name is required.  Command names may be up to 8
     characters long and should not include-file-name extensions such
     as '.bat', '.com', or '.exe'.  Command names are not case
     sensitive.  There must be space between the command name and 'sp'
     (or between the command name and 'fp', if 'sp' is omitted).

     sp[...] and fp[...] are used to specify stationary (sp) and
     floating (fp) command parameters, respectively.  The stationary
     parameters of a command are those that always appear in a certain
     position on the command line.  Generally, floating parameters are
     those parameters that are identified by a certain option prefix
     (e.g. -fo), and may appear anywhere on the command line.  sp[...]
     and fp[...] are both optional and may appear in any order.  Each
     may be used at most once in a command-definition statement.
     The brackets, '[' and ']', are required.  A space may not be
     placed between 'sp' or 'fp' and the opening bracket, '['.  White
     space is not required between the closing bracket, ']', and 'sp'
     or 'fp' that follows the bracket.

     The stationary and floating parameters are specified with a
     parameter description string of tokens, where each token must be
     of the form:

          parameter_prefix%file_type_code

     The parameter description string may be up to 20 characters long.
     White space placed before the first token and after the last token
     of the parameter description string is ignored.  Space must be
     placed between any two tokens.

     The parameter prefix is optional.  If a prefix is given, it must
     begin with a non-white-space character and cannot contain the
     character, '%'.  The parameter prefix may contain white space.

     The file type delimiter, '%', is required.

     The file type codes are single character codes used to indicate
     whether a file is a source file, target file, or neutral.  The
     valid file type codes are

          's' (source)
          't' (target)
          'n' (neutral)

     White space may not be placed between the file type delimiter,
     '%', and file type code.

     The subsection entitled, "User-Defined Commands", under "The Make
     File" section of this help file describes exactly how CMAKE uses a
     command-definition statement to determine if a given command is
     required.

     See: User-Defined Commands

Examples

     Example 1

     Consider the command, IMPLIB.  (IMPLIB is a utility that is
     distributed with the Microsoft C Optimizing Compiler.  It is used
     to create import libraries.)  The syntax of the IMPLIB command is:

     IMPLIB  import_library  module_definition_file

     Implib uses the module-definition file to create an import
     library.

     Without a command-definition statement for IMPLIB, CMAKE will not
     recognize the IMPLIB command.  In this case, since unrecognized
     commands are always required, IMPLIB would always be required.

     The following command-definition statement could be used to tell
     CMAKE that the IMPLIB command should only be required when the
     module-definition file is newer than the import library file.

     command_definition : implib sp[%t %s]

     This statement tells CMAKE that the IMPLIB command has two
     stationary parameters (sp), and that the first stationary
     parameter gives the name of the target file that IMPLIB creates
     (%t), and the second stationary parameter gives the name of the
     source file that IMPLIB uses (%s).

     Example 2

     Suppose the following command-definition statement is included
     in the configuration file:

     command_definition : cmd1 fp[/FI%s /FO%t]

     With this command definition in place, the following command
     (which would be placed in the make file):

     CMD1 /A /FOtest.obj /B /FItest.c /C

     will only be required when "test.obj" does not exist, or when
     "test.c" is newer than "test.obj".

     Example 3

     Not all programs allow us to specify the names of all their source
     and target files on the command line.

     For the sake of discussion, let REVERSE be a program that
     reverses a given text file.  Further, suppose that the output of
     the REVERSE is always called, "reversed.txt".  For example, the
     command:

     REVERSE test.txt

     would generate the file, "reversed.txt", which would be the
     reversed version of "test.txt".

     Since REVERSE is an unrecognized command, REVERSE will always be
     required.  We might wish to have the REVERSE command only be
     required when "test.txt" is newer than "reversed.txt".

     Since CMAKE cannot deduce the source and target files names from
     the REVERSE command line, we could not use a command-definition
     statement (for REVERSE) for this purpose.

     However, we could create a batch file called, "rev.bat", with the
     following command:

     REVERSE %1

     and supply the command-definition statement:

     command_definition : rev sp[%s %t]

     With this batch file and command definition in place, we could use
     the following command in place of reverse in our make file:

     REV test.txt reversed.txt

     This command will only be required when "reversed.txt" does not
     exist, or when "test.txt" is newer than "reversed.txt".

     Other Examples

     command_definition : sort sp[<%s >%t]
     command_definition : rp sp[%s %t %s]
     command_definition : compare sp[%s %s >%t]

Command-Equivalence Statements

     Like command-definition statements, command-equivalence statements
     may be used to expand CMAKE's command table.  A command-
     equivalence statement tells CMAKE that a particular command should
     be processed as if it were another command.

     Syntax

     The general form of the command-equivalence configuration
     statement is:

     command_equivalence : command_name = equivalent_command_name

     White space between 'command_equivalence' and the command name is
     ignored.  Both the command and equivalent-command names are
     required.  The names may be up to 8 characters long and should not
     include-file-name extensions such as '.bat', '.com', or '.exe'.
     The command names are not case sensitive.  White space between
     the command name and equivalent-command name is ignored.

     The equivalent-command name must be either an intrinsic command
     (e.g.  CL, LINK, LIB, MASM,...), or a user-defined command that
     has been defined in a previous command-definition statement.

     See: Equivalent Commands

Example

     Suppose that for some reason you choose to use a linker called,
     NEWLINK, in place of LINK.  If NEWLINK's command-line interface is
     the same as LINK, you could use the following command-equivalence
     statement to tell CMAKE that the NEWLINK command should be handled
     as if it were a LINK command:

     command_equivalence : newlink = link

Using CMAKE with Your Editor

     BRIEF  Epsilon  The Microsoft Editor

     After you execute CMAKE, you should review the output of CMAKE to
     determine if CMAKE (or one of the commands that CMAKE has
     executed), has failed or generated a warning message.  To perform
     this review, you may redirect the output of CMAKE to a log file,
     and load the log file into your editor.  Many programmer's editors
     (e.g. BRIEF, Epsilon, and the Microsoft Editor) provide a
     mechanism to efficiently view all compiler error messages.  These
     editors interpret the log file in order to place you at the
     location in a source file where an error has occurred.  Using this
     technique, you can view all errors messages and correct the
     problems as you go.

     CMAKE uses a standard format for its error messages.  Any editor
     that can interpret the error messages that are generated by the
     program, CL, will be able to interpret the error messages that are
     generated by CMAKE.

Using CMAKE with BRIEF

     What is BRIEF?

     Running CMAKE from BRIEF

     Running CMAKE from DOS and Viewing Error Messages with BRIEF

     Running CMAKE in a Batch File from BRIEF

     Helpful Hints

What is BRIEF?

     BRIEF is a programmer's editor that is available from Solution
     Systems.  It supports a C-like macro language and is distributed
     with many useful macros.

Running CMAKE from BRIEF

     First, you should create an appropriate set of environment
     variables of the form:

          BC[ext]="!CMAKE"

     If you would like to able to execute CMAKE while you are editing a
     file that has one of the extensions: '.c', '.h', '.mak', or
     '.lnk'; you could create the following set of environment
     variables:

          BCC="!CMAKE"
          BCH="!CMAKE"
          BCMAK="!CMAKE"
          BCLNK="!CMAKE"

     The character, '!', is used to indicate that we would like to see
     warning messages, even when CMAKE and all the commands that CMAKE
     executes, are successful (i.e. return zero).

     Run BRIEF and edit a file with an extension for which you have
     created an environment variable.

     To execute CMAKE, use the compile buffer command (Alt-F10).

     After CMAKE is done, you will be placed at the source-file
     location of the first error (if there are any errors).  The error
     message will be displayed in the message area at the bottom of the
     screen.

     Use the next_error command (Ctrl-n) to view additional error
     messages.

     Use the next_error 1 command (Ctrl-p) to pop up the error window.
     From this window, you may select any error that you would like to
     review.

     The Error-Log File

     If an error is found during compilation, BRIEF will create an
     error-log file.  The error-log-file name will be derived from the
     edited-file name by replacing the extension with '.err'.  For
     example, if you were editing a file called, "c:\h\test.h", when
     you initiated a compile, and there are errors, BRIEF will create an
     error-log file called, "c:\h\test.err".

     The error-log file is a system buffer that you may not edit.

     If you exit BRIEF and then restart BRIEF, you may edit the error-
     log file and use the next_error and next_error 1 commands to view
     the errors from the earlier session.

     If no errors are found, BRIEF will not create an error-log file.

Running CMAKE from DOS and Viewing Error Messages with BRIEF

     Create a batch file with the following commands:

          CMAKE >log.err
          B log.err -mnext_error

     Run the batch file from DOS.

     If there are any errors, you will be placed at the source-file
     location of the first error.  The error message will be displayed
     in the message area at the bottom of the screen.

     Use the next_error command (Ctrl-n) to view additional error
     messages.

     Use the next_error 1 command (Ctrl-p) to pop up the error window.
     From this window, you may select any error that you would like to
     review.

Running CMAKE in a Batch File from BRIEF

     Create a batch file, "run.bat", of the form:

          <batch commands>
          CMAKE >log.err
          <batch commands>

     Record the following keystroke macro:

          F7                             Remember
          F10 dos "run.bat"              Execute Command
          <press any key>                To return from DOS
          Alt-e "log.err"                edit_file
          Ctrl-p                         next_error 1
          Enter                          enter
          F10                            Remember

     This macro will execute the batch file, "run.bat", and load the
     log file, "log.err", into BRIEF.

     You may use Alt-F8 and Alt-F7 to save and load the macro,
     respectively.

     Use F8 to playback the macro.

     Use the next_error command (Ctrl-n) to view each error message.

     If the next_error command is included in the macro, you will be
     placed at the location of the first error (if there are any
     errors).  However, the message area will not show the message of
     the first error.  The message, "Playback successful", will overlay
     the error message.

Helpful Hints for BRIEF Users

     Disk Swapping

     Viewing Previous Errors

     Modifying BRIEF

     Viewing the Error-Log File

Disk Swapping with BRIEF

     If you will be executing CMAKE from within BRIEF, you should use
     the flag, M, to enable disk swapping.  This will provide more
     memory for CMAKE and the programs that CMAKE executes.  This flag
     may be added to the BFLAGS environment variable.  For example:

          BFLAGS=-bi120k7l256Mru100za -mJPG -mrestore
                             ^

Viewing Previous Errors with BRIEF

     A macro consisting of the key strokes, (Ctrl-p UpArrow Enter),
     could be used to view the previous error.

Modifying BRIEF

     The BRIEF macro file, "errorfix.cb", controls the way in which
     BRIEF handles the error-log file.  You may change this macro to
     suit your needs.

     For example see: Viewing the Error-Log File

Viewing the Error-Log File with BRIEF

     Most of the error messages that are listed in the error-log file
     will be of the form:

          file_name(line_number) : message

     When the file name in the error message does not begin with a
     drive letter, '/', or '\', BRIEF prefixes the path of the error-
     log file to the file name.  Because of this, if you use relative
     paths or no paths (vs. absolute paths) on your file names, you
     will have to place the error-log file in the directory from which
     you execute CMAKE.  If you would prefer to place the error file
     into another directory, make the following changes to the routine,
     "_error_info", in the BRIEF macro file, "errorfix.cb":

     1. Replace
                string  error_text;
        With
                string  error_text, curdir_string;

     2. Replace
                file_name = add_to_path (substr (base_name, 1, rindex
                base_name, substr (base_name, 3, 1)) - 1), error_file);
        With
                getwd("", curdir_string);
                file_name = add_to_path ( curdir_string , error_file );

     With this change in place, when the file name in the error message
     does not begin with a drive letter, '/', or '\', BRIEF will
     prefix the current directory to the file name.

Using CMAKE with Epsilon

     What is Epsilon?

     Running CMAKE from Epsilon

     Running CMAKE from DOS and Viewing Error Messages with Epsilon

     Running CMAKE in a Batch File from Epsilon

     Helpful Hints

What is Epsilon?

     Epsilon is a powerful programmer's editor that is available from
     Lugaru Software, Ltd.

Running CMAKE from Epsilon

     Execute CMAKE with the make command:

          (C-U) (C-X m) CMAKE

     After CMAKE is done, you will be placed at the source-file
     location of the first error message (if there are any errors).
     The error message will be displayed on the dialog line at the
     bottom of the screen.

     Use next_error (C-X C-N) to view additional error messages.

     To execute CMAKE again, use the make command (C-X m) (without any
     arguments).

     To establish CMAKE as your default make command for future Epsilon
     sessions, use the write_state command (C-F-3).  If you do this,
     the next time you execute Epsilon, you will be able to use the
     make command (C-X m) (without any arguments) to invoke CMAKE.

Running CMAKE from DOS and Viewing Error Messages with Epsilon

     Record the following macro:

          C-X (                          start_kbd_macro
          C-X C-B process                select_buffer
          C-X C-V error.log              visit_file
          F-2 process_mode               named_command
          C-X C-N                        next_error
          C-X )                          end_kbd_macro

          C-X A-N view_log               name_kbd_macro
          C-F-3                          write_state

     Create a batch file with the following commands:

          CMAKE >error.log
          Epsilon -rview_log

     Run the batch file from DOS.

     If there are any errors, you will be placed at the source-file
     location of the first error.  The error message will be displayed
     on the dialog line at the bottom of the screen.

     Use next_error (C-X C-N) to view additional error messages.

Running CMAKE in a Batch File from Epsilon

     Create a batch file, "run.bat", of the form:

          <batch commands>
          CMAKE
          <batch commands>

     Execute the batch file, "run.bat", with the following make
     command:

          (C-U) (C-X m) run.bat

     After "run.bat" is done, you will be placed at the source-file
     location of the first error (if there are any errors).  The error
     message will be displayed on the dialog line at the bottom of the
     screen.

     Use next_error (C-X C-N) to view additional error messages.

     To execute CMAKE again, use the make command (C-X m) (without any
     arguments).

     To establish "run.bat" as your default make command for future
     Epsilon sessions, use the write_state command (C-F-3).  If you do
     this, the next time you execute Epsilon, you will be able to use
     the make command (C-X m) (without any arguments) to invoke
     "run.bat".

Helpful Hints for Epsilon Users

     Increasing Speed

     Viewing Previous Errors

     Clearing the Process Buffer

     Viewing the Error-Log File

Increasing Speed with Epsilon

     If you will be executing CMAKE from within Epsilon, you should use
     the -fs option to instruct Epsilon to use a RAM drive path for
     swap files.  This flag may be added to the EPSILON environment
     variable.  For example:

          SET EPSILON=-fsd:\temp

Viewing Previous Errors with Epsilon

     To view the previous error quickly, you may record the following
     macro:

          C-X (                          start_kbd_macro
          C-U -1 C-X C-N                 next_error
          C-X )                          end_kbd_macro

          C-X A-N previous_error         name_kbd_macro
          F-4 previous_error C-X C-P     bind_to_key
          C-F-3                          write_state

     This macro should be recorded after you have invoked CMAKE with
     the make command, and generated some errors.

Clearing the Epsilon Process Buffer

     The variable, clear_process_buffer, is 0 by default.  To purge
     the process buffer before each make call, set this variable to a
     nonzero value.  You may do this with the following commands:

          F-8 clear_process_buffer 1     set_variable
          C-F-3                          write_state

     If you do not set the variable, clear_process_buffer, to a nonzero
     value, all error messages from all make calls will accumulate in
     your error log.

Viewing the Error-Log File with Epsilon

     Most of the error messages that are listed in the error-log file
     will be of the form:

          file_name(line_number) : message

     When the file name in the error message does not begin with a
     drive letter, '/', or '\', Epsilon prefixes the current directory
     to the file name.  Because of this, if you use relative paths or no
     paths (vs. absolute paths) on your file names, you should view the
     error-log file from the directory from which you executed CMAKE.

Using CMAKE with The Microsoft Editor

     What is the Microsoft Editor?

     The TMP Environment Variable

     Running CMAKE from the Microsoft Editor

     Running CMAKE from DOS and Viewing Errors with the Microsoft Editor

     Running CMAKE in a Batch File from the Microsoft Editor

     Helpful Hints

What is the Microsoft Editor?

     The Microsoft Editor is a programmer's editor that was distributed
     with the Microsoft C Optimizing Compiler Version 5.1 and the
     Microsoft Macro Assembler Version 5.1.  It consists of a single
     executable, M.EXE (and a supporting initialization file called,
     "tools.ini").  The Microsoft Editor is a powerful (and fast) tool
     that supports macros and extensions which may be coded in C.

The TMP Environment Variable for the Microsoft Editor

     You should set the environment variable, TMP, to establish the
     location of the error-log file "m.msg".  (The error-log file used
     by the Microsoft Editor is always called, "m.msg".)

Running CMAKE from the Microsoft Editor

     First, you should add an appropriate set of commands of the form:

          extmake:[ext] CMAKE

     to the file, "tools.ini".  If you would like to able to execute
     CMAKE while you are editing a file that has one of the extensions:
     '.c', '.h', '.mak', '.lnk', or '.msg'; you could use the following
     set of commands in the your "tools.ini" file:

          extmake:c   CMAKE
          extmake:h   CMAKE
          extmake:mak CMAKE
          extmake:lnk CMAKE
          extmake:msg CMAKE

     Run the Microsoft Editor and edit a file with an extension for
     which you have added an "extmake" command to your "tools.ini"
     file.

     To execute CMAKE, use Arg Compile (Alt+A Shift+F3) or Argcompile
     (F5).

     After CMAKE is done, you will be placed at the source-file
     location of the first error (if there are any errors).  The error
     message will be displayed on the dialog line at the bottom of the
     screen.

     Use Compile (Shift+F3) to view additional error messages.

Running CMAKE from DOS and Viewing Errors with the Microsoft Editor

     Create a batch file with the following commands:

          CMAKE >%TMP%\m.msg
          M %TMP%\m.msg

     Run the batch file from DOS.

     Use Compile (Shift+F3) (repeatedly) to view each error message.

     Note that if "/e compile" is added to the Microsoft Editor command
     line, you will be placed at the location of the first error (if
     there are any errors), but the error message will not appear on
     the dialog line.  The Microsoft copyright message will overlay the
     error message.

Running CMAKE in a Batch File from the Microsoft Editor

     Create a batch file, "run.bat", with the following commands:

          <batch commands>
          CMAKE >m.msg
          <batch commands>

     Define the following macro in your "tools.ini" file:

          run:=Arg "run.bat" Shell Arg "$TMP:m.msg" Setfile
          run:Alt+R

     This macro will execute the batch file, "run.bat", and load the
     log file, "m.msg", into the Microsoft Editor.

     Use Alt+R to playback the macro.

     Use Compile (Shift+F3) (repeatedly) to view each error message.

     You may use the following alternative macro, if you would like to
     avoid having to manually execute the first Compile command after
     executing the macro:

          run:=Arg Arg "dummy" Compile
               Arg "run.bat" Shell
               Arg "$TMP:m.msg" Setfile Compile

     where "dummy" is a file that does not exist.  (Remember that when
     you add this macro to the file, "tools.ini", the entire macro
     definition must be specified on one line.)  If this macro is used,
     you will be placed at the location of the first error (if there
     are any errors).  The sequence, Arg Arg "dummy" Compile, is used
     to reset the Microsoft Editor error message pointer to the
     "bottom" of the list, so that the final Compile in the "run" macro
     will bring us to the "top" of the error list.

Helpful Hints for Users of the Microsoft Editor

     Increasing Speed

     A Macro to Select the Error-Log File

     Viewing the Error-Log File

Increasing Speed with the Microsoft Editor

     To increase speed, set the TMP environment variable to a path on
     a RAM drive.

A Macro to Select the Error-Log File with the Microsoft Editor

     The following macro may be used to select the error-log file,
     "m.msg":

          select_msg:=Arg "$TMP:m.msg" Setfile
          select_msg:Shift+F2

Viewing the Error-Log File with the Microsoft Editor

     Most of the error messages that are listed in the error-log file
     will be of the form:

          file_name(line_number) : message

     When the file name in the error message does not begin with a
     drive letter, '/', or '\', the Microsoft Editor prefixes the
     current directory to the file name.  Because of this, if you use
     relative paths or no paths (vs. absolute paths) on your file
     names, you should view the error-log file from the directory from
     which you executed CMAKE.

Optimizing Performance

     Overview

     Use the End-of-Includes Comment in Your Source Files

     Help CMAKE Find Include Files Quickly

     Have CMAKE Put "makefile.bat" on a RAM Drive

     Avoid Using the Verbose Output Format for CMAKE

     Redirect CMAKE Output to a File on a RAM Drive

     Do Not Have CMAKE Scan Include Files for Includes Unnecessarily

     Do Not Have CMAKE Check System-Include Dependencies Unnecessarily

     Help CMAKE Find Configuration Data Quickly

Overview of Optimization Techniques for CMAKE

     There are a number of techniques that may be used to increase the
     speed of CMAKE.  Most of these techniques involve setting switches
     to ensure that CMAKE does not do more work than is necessary.

     The execution time that is provided by CMAKE may be used to help
     you determine how to achieve the best performance in a given
     situation.

Use the End-of-Includes Comment in Your Source Files

     Place all include statements at the top of your source files.  The
     following comments should be placed within each source file, after
     the section that contains the include statements:

                 Ŀ
                  File Types          Comment           
                 Ĵ
                  .c .h .rc   /* CMAKE - INCLUDE END */ 
                  .asm        ; CMAKE - INCLUDE END     
                 

     CMAKE stops processing a given source file when an appropriate
     "end-of-includes" comment is reached.  Note that for resource-
     script files ('.rc'), the comment should be placed after all
     include statements and resource-include statements (i.e.  ICON,
     BITMAP, CURSOR, FONT, or user-defined resource statements).

     For many applications, if these comments are used, the execution
     time for CMAKE will be reduced by 50%.

Help CMAKE Find Include Files Quickly

     If all of your application's source files and include files are
     located in the directory from which you execute CMAKE, the include
     files will be found quickly.

     On the other hand, if you use the INCLUDE environment variable to
     specify the location of your application's include files, there
     will be a danger that CMAKE will waste time by first looking in
     the wrong directories too often before finally locating each
     include file.

     If you do not keep your include files in the source directory or
     current directory, add the following statements to your
     configuration file to insure that CMAKE will not search these
     directories for include files:

          search_current_dir_for_includes = no
          search_source_dir_for_includes = no

     For many applications, if you eliminate unnecessary searches of
     the source directory and current directory, the execution time for
     CMAKE will be reduced by 15%.

     You could also place all of your include files in a single
     directory, and list this directory first in your INCLUDE
     environment variable.  For many applications, if this technique is
     used, the execution time for CMAKE will be reduced by 50%.

     If you do not wish to place all of your application's include
     files into a single directory, you should arrange the directories
     in you INCLUDE environment variable so that the directories that
     contain most of your application's include files are listed first.
     Depending upon your situation, you might be able to save even
     more time by adding "set INCLUDE" statements to your make file in
     order to rearrange the directories "on the fly" in a way that is
     optimal for each module.

Have CMAKE Put "makefile.bat" on a RAM Drive

     After analyzing your make file, CMAKE creates and executes the
     batch program, "makefile.bat".  You might wish to use the CMAKE
     command-line option, /o,  to instruct CMAKE to place the file,
     "makefile.bat", on a RAM drive path.  For example, if "d:\temp"
     is a path on a RAM drive, you could execute CMAKE with the
     following command:

     CMAKE /od:\temp

     Alternatively, if the environment variable, TEMP, is set to
     "d:\temp", you could use the following command in a batch file to
     execute CMAKE:

     CMAKE /o%TEMP%

     (In these examples, we have assumed that the make file is located
     in the current directory and is called, "makefile").

Avoid Using the Verbose Output Format for CMAKE

     The verbose output format (which is enabled with the /v option)
     is a useful debugging tool.  However, since it is quite detailed,
     the execution time for CMAKE might double when the verbose output
     format is selected.

Redirect CMAKE Output to a File on a RAM Drive

     If you will be redirecting the output from CMAKE to a file, place
     that file on a RAM drive.  For example, if "d:\temp" is a path on
     a RAM drive, you could execute CMAKE with the following command:

     CMAKE >d:\temp\cmake.log

     Alternatively, if the environment variable, TEMP, is set to
     "d:\temp", you could use the following command in a batch file to
     execute CMAKE:

     CMAKE >%TEMP%\cmake.log

     (In these examples, we have assumed that the make file is located
     in the current directory and is called, "makefile".)

Do Not Have CMAKE Scan Include Files for Includes Unnecessarily

     By default, CMAKE does not scan include files for include
     statements.  This default behavior may be altered by adding the
     following statement to your configuration file:

          scan_include_files_for_includes = yes

     If you enable this switch, the execution time for CMAKE could
     quadruple!  You could reduce the impact of enabling this switch by
     using "end-of-includes" comments within your include files, or, if
     the use of include statements within include files is limited to
     only a few files, you could enable this switch as needed, by using
     the following statements in your make file:

          REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES ON
          REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES OFF

Do Not Have CMAKE Check System-Include Dependencies Unnecessarily

     By default, CMAKE ignores system-include statements.  If you
     modify system-include files, you will not want CMAKE to ignore
     these statements (at least not all of them).  To instruct CMAKE to
     check system-include file dependencies, you could add the
     following statements to your configuration file:

          c_include_<>_on = yes
          rc_include_<>_on = yes

     If you enable these switches, the execution time for CMAKE could
     double.  A more efficient approach would be to use the following
     comments in your source files, as needed:

              Ŀ
               File Types             Comment              
              Ĵ
               .c .h .rc   /* CMAKE - INCLUDE <> ON/OFF */ 
              

Help CMAKE Find Configuration Data Quickly

     If you place the configuration data for CMAKE at the end of a long
     file that is shared by other applications (e.g. "win.ini"), CMAKE
     will have to scan the entire file until it reaches the section
     tag, [CMAKE].  This could add a few seconds to the execution time
     for CMAKE.  To eliminate the time it takes CMAKE to locate its
     configuration data, put the data at the top of a shared file, or
     in its own file (e.g. "cmake.cfg").

CMAKE Exit Codes

     If an error occurs before the batch program, "makefile.bat", is
     executed, CMAKE will terminate and return one of the following
     exit codes:

     EXIT CODE  MEANING
     
          0     Success
       9659     CMAKE Command-Line Error
       9660     Unable to Load Configuration Data
       9661     Make File Not Found
       9662     Unable to Create "makefile.bat"
       9663     Unable to Create Predefined Pseudofile "start.psf"
       9664     Unable to Process some Make-File Command or Statement
       9665     A Token in the Make File was Truncated
       9666     Nested Comments were Found in the Make File
       9667     Out of Memory
       9668     Unable to Flush Standard-Output-File Buffer
       9669     Unable to Run "makefile.bat"
       9670     Unable to Run QH.EXE

     If the batch program, "makefile.bat", is executed and one of the
     commands in "makefile.bat" fails (i.e. returns a nonzero value),
     CMAKE will return the value that was returned by the command
     that failed.

Technical Support for CMAKE

     You may contact the author of CMAKE (John Greschak) at

          [70744,1417] (CompuServe(R))

          212-947-1327 (Work/Home)

          50 West 34th St. Apt. 14B8
          NY, NY 10001

Samples

     Microsoft C Optimizing Compiler

     Microsoft Windows Software Development Kit

     Microsoft Macro Assembler

     The MS-DOS COPY Command

     The if Statement

     Command-Definition Statements

     Command-Equivalence Statements

     The Configuration File

Microsoft C Optimizing Compiler Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     This sample demonstrates how to use CMAKE to maintain a DOS
     application that is built with the programs: CL, LIB, and LINK.

     Note the Following:

     1. The commands (and comments) in the make file.  CMAKE will
        deduce all dependencies from these commands.

        See: When is a CL Command Required?
             When is a LIB Command Required?
             When is a LINK Command Required?

     2. The format of the LIB response file, "message.lrf".  CMAKE
        requires that a response file (of a particular form) be used
        with the LIB command.

        See: The LIB Command Line

     3. The format of the LINK response file, "greeting.lnk".  CMAKE
        requires that a response file (of a particular form) be used
        with the LINK command.

        See: The LINK Command Line

     4. The use and placement of the comment

        /* CMAKE - INCLUDE END */

        in the files, "hello.c", "world.c", and "greeting.c".

        In these files, this comment is placed after all #include
        statements.  Although this comment is not required in C-source
        files, it serves as an end-of-file mark for CMAKE, and thus
        prevents CMAKE from searching the entire source file for
        #include statements.

        See: Use the End-of-Includes Comment in Your Source Files
             Switches for CL
             How CMAKE Processes a C-Source File

Microsoft C Optimizing Compiler Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /*****************************************************************
     *                           MAKEFILE
     *
     *  PURPOSE: Build the following modules:
     *
     *           "hello.obj"  "message.lib"   "greeting.exe"
     *           "world.obj"  "greeting.obj"
     *
     *  NOTE: None of the comments in this make file are required.
     *        They have been provided to help you understand how CMAKE
     *        handles each command.  In other words, this make file
     *        could be reduced down to the following five commands:
     *
     *        cl /c /W4 hello.c
     *        cl /c /W4 world.c
     *        lib @message.lrf
     *        cl /c /W4 greeting.c
     *        link @greeting.lnk
     *
     *****************************************************************/

     /*****************************************************************
     *                           HELLO.OBJ
     *
     *  The following CL command will be executed only when one of the
     *  following conditions is true:
     *
     *  1. "hello.obj" does not exist.
     *  2. "hello.c" is newer than "hello.obj".
     *  3. "hello.h" is newer than "hello.obj".
     *
     *****************************************************************/

     cl /c /W4 hello.c

     /*****************************************************************
     *                           WORLD.OBJ
     *
     *  The following CL command will be executed only when one of the
     *  following conditions is true:
     *
     *  1. "world.obj" does not exist.
     *  2. "world.c" is newer than "world.obj".
     *  3. "world.h" is newer than "world.obj".
     *
     *****************************************************************/

     cl /c /W4 world.c

     /*****************************************************************
     *                          MESSAGE.LIB
     *
     *  The following LIB command will be executed only when one of the
     *  following conditions is true:
     *
     *  1. "message.lib" does not exist.
     *  2. "hello.obj" is newer than "message.lib".
     *  3. "world.obj" is newer than "message.lib".
     *
     *  Actually, only those objects that are newer than the library,
     *  "message.lib", will be added to the library.  For example,
     *  suppose "message.lib" exists, "hello.obj" is newer than
     *  "message.lib", and "world.obj" is older than "message.lib".
     *  In this case, only "hello.obj" must be added to the library,
     *  "message.lib".  Thus, in this case, CMAKE would execute the
     *  following command:
     *
     *  lib @message.clb
     *
     *  where "message.clb" consists of the following lines:
     *
     *  message.lib
     *  -+hello.obj ;
     *
     *****************************************************************/

     lib @message.lrf

     /*****************************************************************
     *                         GREETING.OBJ
     *
     *  The following CL command will be executed only when one of the
     *  following conditions is true:
     *
     *  1. "greeting.obj" does not exist.
     *  2. "greeting.c" is newer than "greeting.obj".
     *  3. "hello.h" is newer than "greeting.obj".
     *  4. "world.h" is newer than "greeting.obj".
     *  5. "greeting.h" is newer than "greeting.obj".
     *
     *****************************************************************/

     cl /c /W4 greeting.c

     /*****************************************************************
     *                         GREETING.EXE
     *
     *  The following LINK command will be executed only when one of
     *  the following conditions is true:
     *
     *  1. "greeting.exe" does not exist.
     *  2. "greeting.obj" is newer than "greeting.exe".
     *  3. "message.lib" is newer than "greeting.exe".
     *
     *****************************************************************/

     link @greeting.lnk

Microsoft C Optimizing Compiler Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /* greeting.c - Program to print "Hello World" */

     #include "hello.h"
     #include "world.h"
     #include "greeting.h"
     /* CMAKE - INCLUDE END */

     int main ( void )

     {
     print_hello ( ) ;

     print_world ( ) ;

     return ( 0 ) ;
     }

Microsoft C Optimizing Compiler Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /* greeting.h - Header file for greeting.c */

     int main ( void ) ;

Microsoft C Optimizing Compiler Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /* hello.c - Function to print "Hello" */

     #include <stdio.h>
     #include "hello.h"
     /* CMAKE - INCLUDE END */

     void print_hello ( void )

     {
     printf ( "Hello\n" ) ;
     }

Microsoft C Optimizing Compiler Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /* hello.h - Header file for hello.c */

     void print_hello ( void ) ;

Microsoft C Optimizing Compiler Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /* world.c - Function to print "World" */

     #include <stdio.h>
     #include "world.h"
     /* CMAKE - INCLUDE END */

     void print_world ( void )

     {
     printf ( "World\n" ) ;
     }

Microsoft C Optimizing Compiler Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /* world.h - Header file for world.c */

     void print_world ( void ) ;

Microsoft C Optimizing Compiler Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     message.lib
     y
     -+hello.obj &
     -+world.obj ;

Microsoft C Optimizing Compiler Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     greeting.obj
     greeting.exe /stack:2048
     NUL
     message.lib ;

Microsoft Windows Software Development Kit Sample

     readme.txt  hw.c  hw.rc   hw.ico  hw.lnk
     makefile    hw.h  hw.dlg  hw.def

     This sample demonstrates how to use CMAKE to maintain a Microsoft
     Windows application that is built with the programs: CL, RC, and
     LINK.

     Note the Following:

     1. The commands (and comments) in the make file.  CMAKE will
        deduce all dependencies from these commands.

        See: When is a CL Command Required?
             When is an RC/C Command Required?
             When is an RC/A Command Required?
             When is a LINK Command Required?

     2. The format of the LINK response file, "hw.lnk".  CMAKE requires
        that a response file (of a particular form) be used with the
        LINK command.

        See: The LINK Command Line

        Since CMAKE does not use the LIB environment variable, the
        paths of the Windows libraries, "libw.lib" and "slibcew.lib"
        must be provided.

     3. The use and placement of the comment

        /* CMAKE - INCLUDE END */

        in the files, "hw.c" and "hw.rc".

        In the file, "hw.c", this comment is placed after all #include
        statements.  Although this comment is not required in C-source
        files, it serves as an end-of-file mark for CMAKE, and thus
        prevents CMAKE from searching the entire source file for
        #include statements.

        See: Use the End-of-Includes Comment in Your Source Files
             Switches for CL
             How CMAKE Processes a C-Source File

        In the file, "hw.rc", this comment is placed after all #include
        statements and resource-include statements (i.e. ICON, BITMAP,
        CURSOR, FONT, or user-defined resource statements).  This
        comment is required in this file.

        See: Helpful Hints for RC/C
             Switches for RC/C
             How CMAKE Processes a Resource-Script File
             Use the End-of-Includes Comment in Your Source Files

Microsoft Windows Software Development Kit Sample

     readme.txt  hw.c  hw.rc   hw.ico  hw.lnk
     makefile    hw.h  hw.dlg  hw.def

     /*****************************************************************
     *                           MAKEFILE
     *
     *  PURPOSE: Build the following modules:
     *
     *           "hw.res"  "hw.exe"
     *           "hw.obj"
     *
     *  NOTE: None of the comments in this make file are required.
     *        They have been provided to help you understand how CMAKE
     *        handles each command.  In other words, this make file
     *        could be reduced down to the following four commands:
     *
     *        rc /r hw.rc
     *        cl /c /AS /Gsw /Oas /Zpe hw.c
     *        link @hw.lnk
     *        rc hw.res
     *
     *****************************************************************/

     /*****************************************************************
     *                            HW.RES
     *
     *  The following RC compile command will be executed only when one
     *  of the following conditions is true:
     *
     *  1. "hw.res" does not exist.
     *  2. "hw.rc" is newer than "hw.res".
     *  3. "hw.h" is newer than "hw.res".
     *  4. "hw.ico" is newer than "hw.res".
     *  5. "hw.dlg" is newer than "hw.res".
     *
     *****************************************************************/

     rc /r hw.rc

     /*****************************************************************
     *                            HW.OBJ
     *
     *  The following CL command will be executed only when one of the
     *  following conditions is true:
     *
     *  1. "hw.obj" does not exist.
     *  2. "hw.c" is newer than "hw.obj".
     *  3. "hw.h" is newer than "hw.obj".
     *
     *****************************************************************/

     cl /c /AS /Gsw /Oas /Zpe hw.c

     /*****************************************************************
     *                            HW.EXE
     *
     *  The following LINK command will be executed only when one of
     *  the following conditions is true:
     *
     *  1. "hw.exe" does not exist.
     *  2. "hw.obj" is newer than "hw.exe".
     *  3. "c:\windev\lib\libw.lib" is newer than "hw.exe".
     *  4. "c:\windev\lib\slibcew.lib" is newer than "hw.exe".
     *  5. "hw.def" is newer than "hw.exe".
     *
     *****************************************************************/

     link @hw.lnk

     /*****************************************************************
     *                     ADD HW.RES TO HW.EXE
     *
     *  The following RC command (used to add the resource file,
     *  "hw.res", to the executable file, "hw.exe") will be executed
     *  only when one of the following conditions is true:
     *
     *  1. The previous RC command used to build, "hw.res", was
     *     executed.
     *  2. The previous LINK command used to build, "hw.exe", was
     *     executed.
     *
     *****************************************************************/

     rc hw.res

Microsoft Windows Software Development Kit Sample

     readme.txt  hw.c  hw.rc   hw.ico  hw.lnk
     makefile    hw.h  hw.dlg  hw.def

     /* hw.c - Microsoft Windows program with "Hello World" icon */

     #include <windows.h>
     #include "hw.h"
     /* CMAKE - INCLUDE END */

     HANDLE hInst ;

     int PASCAL WinMain ( HANDLE hInstance     ,
                          HANDLE hPrevInstance ,
                          LPSTR  lpCmdLine     ,
                          int    nCmdShow        )

     {
     WNDCLASS wc      ;
     HWND     hWnd    ;
     MSG      message ;

     if ( ! hPrevInstance )

        {
        wc.style = NULL ;

        wc.lpfnWndProc = MainWndProc ;

        wc.cbClsExtra = 0 ;

        wc.cbWndExtra = 0 ;

        wc.hInstance = hInstance ;

        wc.hIcon = LoadIcon ( hInstance    ,
                              "HelloWorld"   ) ;

        wc.hCursor = LoadCursor ( NULL      ,
                                  IDC_ARROW   ) ;

        wc.hbrBackground = GetStockObject ( WHITE_BRUSH ) ;

        wc.lpszMenuName =  "HWMenu" ;

        wc.lpszClassName = "HWWClass" ;

        if ( ! ( RegisterClass ( & wc ) ) )

           {
           return ( FALSE ) ;
           }
        }

     hInst = hInstance ;

     if ( ! ( hWnd = CreateWindow ( "HWWClass"           ,
                                    "Sample Program"     ,
                                    WS_OVERLAPPEDWINDOW  ,
                                    CW_USEDEFAULT        ,
                                    CW_USEDEFAULT        ,
                                    CW_USEDEFAULT        ,
                                    CW_USEDEFAULT        ,
                                    NULL                 ,
                                    NULL                 ,
                                    hInstance            ,
                                    NULL                   ) ) )

        {
        return ( FALSE ) ;
        }

     else

        {
        ShowWindow ( hWnd     ,
                     nCmdShow   ) ;

        UpdateWindow ( hWnd ) ;
        }

     while ( GetMessage ( & message ,
                          NULL      ,
                          NULL      ,
                          NULL        ) )
           {
           TranslateMessage ( & message ) ;

           DispatchMessage ( & message ) ;
           }

     return ( message
                .wParam ) ;
     }


     long FAR PASCAL MainWndProc ( HWND     hWnd    ,
                                   unsigned message ,
                                   WORD     wParam  ,
                                   LONG     lParam    )

     {
     FARPROC lpProcAbout ;

     switch ( message )

            {
            case WM_COMMAND :

                 if (    wParam
                      == IDM_ABOUT )

                    {
                    lpProcAbout = MakeProcInstance ( About ,
                                                     hInst   ) ;

                    DialogBox ( hInst       ,
                                "AboutBox"  ,
                                hWnd        ,
                                lpProcAbout   ) ;

                     FreeProcInstance ( lpProcAbout ) ;

                     break ;
                     }

                 else

                     {
                     return ( DefWindowProc ( hWnd    ,
                                              message ,
                                              wParam  ,
                                              lParam    ) ) ;
                     }

            case WM_DESTROY :

                 PostQuitMessage ( 0 ) ;

                 break ;

            default :

                 return ( DefWindowProc ( hWnd    ,
                                          message ,
                                          wParam  ,
                                          lParam    ) ) ;

                 break ;
            }

     return ( NULL ) ;
     }


     BOOL FAR PASCAL About ( HWND     hDlg    ,
                             unsigned message ,
                             WORD     wParam  ,
                             LONG     lParam    )

     {
     switch ( message )

            {
            case WM_INITDIALOG :

                 return ( TRUE ) ;

            case WM_COMMAND :

                 if (    (    wParam
                           == IDOK   )
                      || (    wParam
                           == IDCANCEL ) )

                    {
                    EndDialog ( hDlg ,
                                TRUE   ) ;

                    return ( TRUE ) ;
                    }

                 break ;
            }

     return ( FALSE ) ;
     }

Microsoft Windows Software Development Kit Sample

     readme.txt  hw.c  hw.rc   hw.ico  hw.lnk
     makefile    hw.h  hw.dlg  hw.def

     /* hw.h - Header file for hw.c */

     #define IDM_ABOUT 100

     int PASCAL WinMain ( HANDLE ,
                          HANDLE ,
                          LPSTR  ,
                          int      ) ;

     long FAR PASCAL MainWndProc ( HWND     ,
                                   unsigned ,
                                   WORD     ,
                                   LONG       ) ;

     BOOL FAR PASCAL About ( HWND     ,
                             unsigned ,
                             WORD     ,
                             LONG       ) ;

Microsoft Windows Software Development Kit Sample

     readme.txt  hw.c  hw.rc   hw.ico  hw.lnk
     makefile    hw.h  hw.dlg  hw.def

     /* hw.rc - Resource-script file for hw.exe */

     #include <windows.h>
     #include "hw.h"

     HelloWorld ICON hw.ico

     #include "hw.dlg"
     /* CMAKE - INCLUDE END */

     HWMenu MENU
     BEGIN
         POPUP        "&Help"
         BEGIN
             MENUITEM "&About...", IDM_ABOUT
         END
     END

Microsoft Windows Software Development Kit Sample

     readme.txt  hw.c  hw.rc   hw.ico  hw.lnk
     makefile    hw.h  hw.dlg  hw.def

     /* hw.dlg - "About" dialog box */

     ABOUTBOX DIALOG LOADONCALL
                     MOVEABLE
                     DISCARDABLE
                     23  ,
                     18  ,
                     144 ,
                     45

     CAPTION "About"

     STYLE   WS_BORDER
           | WS_CAPTION
           | WS_DLGFRAME
           | WS_SYSMENU
           | DS_MODALFRAME
           | WS_POPUP

     BEGIN

         CONTROL "Sample Program" ,
                 -1               ,
                 "static"         ,
                   SS_CENTER
                 | WS_GROUP
                 | WS_CHILD       ,
                 17               ,
                 7                ,
                 122              ,
                 8

         CONTROL "OK"               ,
                 1                  ,
                 "button"           ,
                   BS_DEFPUSHBUTTON
                 | WS_GROUP
                 | WS_TABSTOP
                 | WS_CHILD         ,
                 61                 ,
                 22                 ,
                 32                 ,
                 14

         CONTROL "HelloWorld" ,
                 -1           ,
                 "static"     ,
                   SS_ICON
                 | WS_CHILD   ,
                 19           ,
                 12           ,
                 16           ,
                 21

     END

Microsoft Windows Software Development Kit Sample

     readme.txt  hw.c  hw.rc   hw.ico  hw.lnk
     makefile    hw.h  hw.dlg  hw.def

     "hw.ico" is the icon file for the "Hello World" icon.

Microsoft Windows Software Development Kit Sample

     readme.txt  hw.c  hw.rc   hw.ico  hw.lnk
     makefile    hw.h  hw.dlg  hw.def

     ; hw.def - Module-definition file for hw.exe

     NAME         HelloWorld

     DESCRIPTION  'Sample Program'

     EXETYPE      WINDOWS

     STUB         'WINSTUB.EXE'

     CODE         PRELOAD MOVEABLE DISCARDABLE
     DATA         PRELOAD MOVEABLE MULTIPLE

     HEAPSIZE     1024
     STACKSIZE    5120

     EXPORTS
                  MainWndProc @1
                  About       @2

Microsoft Windows Software Development Kit Sample

     readme.txt  hw.c  hw.rc   hw.ico  hw.lnk
     makefile    hw.h  hw.dlg  hw.def

     hw.obj
     hw.exe /nod
     NUL
     c:\windev\lib\libw.lib    +
     c:\windev\lib\slibcew.lib
     hw.def ;

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     This sample demonstrates how to use CMAKE to maintain a DOS
     application that is built with the programs: MASM, CL, LIB, and
     LINK.

     Note the Following:

     1. The commands (and comments) in the make file.  CMAKE will
        deduce all dependencies from these commands.

        See: When is a MASM Command Required?
             When is a CL Command Required?
             When is a LIB Command Required?
             When is a LINK Command Required?

     2. The format of the LIB response file, "message.lrf".  CMAKE
        requires that a response file (of a particular form) be used
        with the LIB command.

        See: The LIB Command Line

     3. The format of the LINK response file, "greeting.lnk".  CMAKE
        requires that a response file (of a particular form) be used
        with the LINK command.

        See: The LINK Command Line

     4. The use and placement of the comment

        ; CMAKE - INCLUDE END

        in the files, "a_hello.asm" and "a_world.asm".

        In these files, this comment is placed after all include
        statements.  Although this comment is not required in assembly-
        language-source files, it serves as an end-of-file mark for
        CMAKE, and thus prevents CMAKE from searching the entire source
        file for include statements.

        See: Use the End-of-Includes Comment in Your Source Files
             Switches for MASM
             How CMAKE Processes an Assembly-Language-Source File

     5. The use and placement of the comment

        /* CMAKE - INCLUDE END */

        in the files, "hello.c", "world.c", and "greeting.c".

        In these files, this comment is placed after all #include
        statements.  Although this comment is not required in C-source
        files, it serves as an end-of-file mark for CMAKE, and thus
        prevents CMAKE from searching the entire source file for
        #include statements.

        See: Use the End-of-Includes Comment in Your Source Files
             Switches for CL
             How CMAKE Processes a C-Source File

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     /*****************************************************************
     *                           MAKEFILE
     *
     *  PURPOSE: Build the following modules:
     *
     *           "a_hello.obj" "hello.obj" "message.lib" "greeting.exe"
     *           "a_world.obj" "world.obj" "greeting.obj"
     *
     *  NOTE: None of the comments in this make file are required.
     *        They have been provided to help you understand how CMAKE
     *        handles each command.  In other words, this make file
     *        could be reduced down to the following seven commands:
     *
     *        masm /W2 /V /Z a_hello.asm,a_hello.obj;
     *        masm /W2 /V /Z a_world.asm,a_world.obj;
     *        cl /c /W4 hello.c
     *        cl /c /W4 world.c
     *        lib @message.lrf
     *        cl /c /W4 greeting.c
     *        link @greeting.lnk
     *
     *****************************************************************/

     /*****************************************************************
     *                          A_HELLO.OBJ
     *
     *  The following MASM command will be executed only when one of
     *  the following conditions is true:
     *
     *  1. "a_hello.obj" does not exist.
     *  2. "a_hello.asm" is newer than "a_hello.obj".
     *  3. "hello.inc" is newer than "a_hello.obj".
     *
     *****************************************************************/

     masm /W2 /V /Z a_hello.asm,a_hello.obj;

     /*****************************************************************
     *                          A_WORLD.OBJ
     *
     *  The following MASM command will be executed only when one of
     *  the following conditions is true:
     *
     *  1. "a_world.obj" does not exist.
     *  2. "a_world.asm" is newer than "a_world.obj".
     *  3. "world.inc" is newer than "a_world.obj".
     *
     *****************************************************************/

     masm /W2 /V /Z a_world.asm,a_world.obj;

     /*****************************************************************
     *                           HELLO.OBJ
     *
     *  The following CL command will be executed only when one of the
     *  following conditions is true:
     *
     *  1. "hello.obj" does not exist.
     *  2. "hello.c" is newer than "hello.obj".
     *  3. "hello.h" is newer than "hello.obj".
     *
     *****************************************************************/

     cl /c /W4 hello.c

     /*****************************************************************
     *                           WORLD.OBJ
     *
     *  The following CL command will be executed only when one of the
     *  following conditions is true:
     *
     *  1. "world.obj" does not exist.
     *  2. "world.c" is newer than "world.obj".
     *  3. "world.h" is newer than "world.obj".
     *
     *****************************************************************/

     cl /c /W4 world.c

     /*****************************************************************
     *                          MESSAGE.LIB
     *
     *  The following LIB command will be executed only when one of the
     *  following conditions is true:
     *
     *  1. "message.lib" does not exist.
     *  2. "a_hello.obj" is newer than "message.lib".
     *  3. "a_world.obj" is newer than "message.lib".
     *  4. "hello.obj" is newer than "message.lib".
     *  5. "world.obj" is newer than "message.lib".
     *
     *  Actually, only those objects that are newer than the library,
     *  "message.lib", will be added to the library.  For example,
     *  suppose "message.lib" exists, "a_hello.obj" is newer than
     *  "message.lib", and "message.lib" is newer than "a_world.obj",
     *  "hello.obj", and "world.obj".  In this case, only "a_hello.obj"
     *  must be added to the library, "message.lib".  Thus, in this
     *  case, CMAKE would execute the following command:
     *
     *  lib @message.clb
     *
     *  where "message.clb" consists of the following lines:
     *
     *  message.lib
     *  -+a_hello.obj ;
     *
     *****************************************************************/

     lib @message.lrf

     /*****************************************************************
     *                         GREETING.OBJ
     *
     *  The following CL command will be executed only when one of the
     *  following conditions is true:
     *
     *  1. "greeting.obj" does not exist.
     *  2. "greeting.c" is newer than "greeting.obj".
     *  3. "a_hello.h" is newer than "greeting.obj".
     *  4. "a_world.h" is newer than "greeting.obj".
     *  5. "greeting.h" is newer than "greeting.obj".
     *
     *****************************************************************/

     cl /c /W4 greeting.c

     /*****************************************************************
     *                         GREETING.EXE
     *
     *  The following LINK command will be executed only when one of
     *  the following conditions is true:
     *
     *  1. "greeting.exe" does not exist.
     *  2. "greeting.obj" is newer than "greeting.exe".
     *  3. "message.lib" is newer than "greeting.exe".
     *
     *****************************************************************/

     link @greeting.lnk

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     /* greeting.c - Program to print "Hello World" */

     #include "a_hello.h"
     #include "a_world.h"
     #include "greeting.h"
     /* CMAKE - INCLUDE END */

     int main ( void )

     {
     a_print_hello ( ) ;

     a_print_world ( ) ;

     return ( 0 ) ;
     }

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     /* greeting.h - Header file for greeting.c */

     int main ( void ) ;

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     ; a_hello.asm - Function to call C function to print "Hello"

     TITLE  hello.asm
     DOSSEG
     .MODEL SMALL,C

     .CODE

     include hello.inc
     ; CMAKE - INCLUDE END

     a_print_hello PROC
       call print_hello
       ret
     a_print_hello ENDP

     END

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     /* a_hello.h - Header file for a_hello.asm */

     void a_print_hello ( void ) ;

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     ; a_world.asm - Function to call C function to print "World"

     TITLE  world.asm
     DOSSEG
     .MODEL SMALL,C

     .CODE

     include world.inc
     ; CMAKE - INCLUDE END

     a_print_world PROC
       call print_world
       ret
     a_print_world ENDP

     END

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     /* a_world.h - Header file for a_world.asm */

     void a_print_world ( void ) ;

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     /* hello.c - Function to print "Hello" */

     #include <stdio.h>
     #include "hello.h"
     /* CMAKE - INCLUDE END */

     void print_hello ( void )

     {
     printf ( "Hello\n" ) ;
     }

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     /* hello.h - Header file for hello.c */

     void print_hello ( void ) ;

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     ; hello.inc - Include file for hello.c

     EXTRN C print_hello : PROC

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     /* world.c - Function to print "World" */

     #include <stdio.h>
     #include "world.h"
     /* CMAKE - INCLUDE END */

     void print_world ( void )

     {
     printf ( "World\n" ) ;
     }

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     /* world.h - Header file for world.c */

     void print_world ( void ) ;

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     ; world.inc - Include file for world.c

     EXTRN C print_world : PROC

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     message.lib
     y
     -+a_hello.obj &
     -+a_world.obj &
     -+hello.obj   &
     -+world.obj   ;

Microsoft Macro Assembler Sample

     readme.txt  a_hello.asm  hello.c    world.c    message.lrf
     makefile    a_hello.h    hello.h    world.h    greeting.lnk
     greeting.c  a_world.asm  hello.inc  world.inc
     greeting.h  a_world.h

     greeting.obj
     greeting.exe /stack:2048
     NUL
     message.lib ;

COPY Command Sample

     readme.txt  src\1.src  src\more\3.src
     makefile    src\2.src

     This sample demonstrates how CMAKE handles the COPY command.

     Note the Following:

     1. The commands (and comments) in the make file.  CMAKE will
        deduce all dependencies from these commands.

        See: COPY

COPY Command Sample

     readme.txt  src\1.src  src\more\3.src
     makefile    src\2.src

     /*****************************************************************
     *                           MAKEFILE
     *
     *  PURPOSE: Copy some files.
     *
     *  NOTE: None of the comments in this make file are required.
     *        They have been provided to help you understand how CMAKE
     *        handles each command.  In other words, this make file
     *        could be reduced down to the following four commands:
     *
     *        copy src\1.src trg\1.trg
     *        copy src\more\3.src trg
     *        copy src trg\12.trg
     *        copy src trg
     *
     *****************************************************************/

     /*****************************************************************
     *                       COPY FILE TO FILE
     *
     *  The following COPY command will be executed only when one of
     *  the following conditions is true:
     *
     *  1. "trg\1.trg" does not exist.
     *  2. "src\1.src" is newer than "trg\1.trg".
     *
     *****************************************************************/

     copy src\1.src trg\1.trg

     /*****************************************************************
     *                    COPY FILE TO DIRECTORY
     *
     *  The following COPY command will be executed only when one of
     *  the following conditions is true:
     *
     *  1. "trg\3.src" does not exist.
     *  2. "src\more\3.src" is newer than "trg\3.src".
     *
     *****************************************************************/

     copy src\more\3.src trg

     /*****************************************************************
     *                     COPY DIRECTORY TO FILE
     *
     *  The following COPY command will always be executed.
     *
     *****************************************************************/

     copy src trg\12.trg

     /*****************************************************************
     *                  COPY DIRECTORY TO DIRECTORY
     *
     *  The COPY command:
     *
     *       copy src\1.src trg\1.src
     *
     *  will be executed only when one of the following conditions is
     *  true:
     *
     *       1. "trg\1.src" does not exist.
     *       2. "src\1.src" is newer than "trg\1.src".
     *
     *  The COPY command:
     *
     *       copy src\2.src trg\2.src
     *
     *  will be executed only when one of the following conditions is
     *  true:
     *
     *       1. "trg\2.src" does not exist.
     *       2. "src\2.src" is newer than "trg\2.src".
     *
     *****************************************************************/

     copy src trg

COPY Command Sample

     readme.txt  src\1.src  src\more\3.src
     makefile    src\2.src

     src\1.src - Sample source file number 1

COPY Command Sample

     readme.txt  src\1.src  src\more\3.src
     makefile    src\2.src

     src\2.src - Sample source file number 2

COPY Command Sample

     readme.txt  src\1.src  src\more\3.src
     makefile    src\2.src

     src\more\3.src - Sample source file number 3

if Statement Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     This sample demonstrates how to use if statements in a make file.

     Note the Following:

     1. The if statements (and comments) in the make file.

        See: The if Statement

if Statement Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /*****************************************************************
     *                           MAKEFILE
     *
     *  PURPOSE: Build the following modules:
     *
     *           "hello.obj"  "message.lib"   "greeting.exe"
     *           "world.obj"  "greeting.obj"
     *
     *  NOTE: Since CMAKE automatically determines the dependencies
     *        for CL, LIB, and LINK, you would not ordinarily use an
     *        if statement to explicitly specify dependencies for these
     *        commands.  The if statement has been used in this make
     *        file for demonstration purposes, only.
     *
     *        None of the comments in this make file are required.
     *        They have been provided to help you understand how CMAKE
     *        handles each command.
     *
     *****************************************************************/

     /*****************************************************************
     *                           HELLO.OBJ
     *
     *  The following CL and LIB commands will be executed only when
     *  one of the following conditions is true:
     *
     *  1. "hello.obj" does not exist.
     *  2. "message.lib" does not exist.
     *  3. "hello.c" is newer than "hello.obj".
     *  5. "hello.c" is newer than "message.lib".
     *  4. "hello.h" is newer than "hello.obj".
     *  6. "hello.h" is newer than "message.lib".
     *
     *****************************************************************/

     if ( hello.obj
          message.lib < hello.c
                        hello.h )

        {
        cl /c /W4 hello.c

        lib message.lib -+hello.obj;
        }

     /*****************************************************************
     *                           WORLD.OBJ
     *
     *  The following CL and LIB commands will be executed only when
     *  one of the following conditions is true:
     *
     *  1. "world.obj" does not exist.
     *  2. "message.lib" does not exist.
     *  3. "world.c" is newer than "world.obj".
     *  5. "world.c" is newer than "message.lib".
     *  4. "world.h" is newer than "world.obj".
     *  6. "world.h" is newer than "message.lib".
     *
     *****************************************************************/

     if ( world.obj message.lib < world.c world.h )

        {
        cl /c /W4 world.c

        lib message.lib -+world.obj;
        }

     /*****************************************************************
     *                         GREETING.OBJ
     *
     *  The following CL command will be executed only when one of the
     *  following conditions is true:
     *
     *  1. "greeting.obj" does not exist.
     *  2. "greeting.c" is newer than "greeting.obj".
     *  3. "hello.h" is newer than "greeting.obj".
     *  4. "world.h" is newer than "greeting.obj".
     *  5. "greeting.h" is newer than "greeting.obj".
     *
     *****************************************************************/

     if (   greeting.obj
          < greeting.c
            hello.h
            world.h
            greeting.h )

        cl /c /W4 greeting.c

     /*****************************************************************
     *                         GREETING.EXE
     *
     *  The following LINK command will be executed only when one of
     *  the following conditions is true:
     *
     *  1. "greeting.exe" does not exist.
     *  2. "greeting.obj" is newer than "greeting.exe".
     *  3. "message.lib" is newer than "greeting.exe".
     *
     *****************************************************************/

     if ( greeting.exe < greeting.obj message.lib )

        link @greeting.lnk

if Statement Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /* greeting.c - Program to print "Hello World" */

     #include "hello.h"
     #include "world.h"
     #include "greeting.h"

     int main ( void )

     {
     print_hello ( ) ;

     print_world ( ) ;

     return ( 0 ) ;
     }

if Statement Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /* greeting.h - Header file for greeting.c */

     int main ( void ) ;

if Statement Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /* hello.c - Function to print "Hello" */

     #include <stdio.h>
     #include "hello.h"

     void print_hello ( void )

     {
     printf ( "Hello\n" ) ;
     }

if Statement Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /* hello.h - Header file for hello.c */

     void print_hello ( void ) ;

if Statement Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /* world.c - Function to print "World" */

     #include <stdio.h>
     #include "world.h"

     void print_world ( void )

     {
     printf ( "World\n" ) ;
     }

if Statement Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     /* world.h - Header file for world.c */

     void print_world ( void ) ;

if Statement Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     message.lib
     y
     -+hello.obj &
     -+world.obj ;

if Statement Sample

     readme.txt  greeting.c  hello.c  world.c  message.lrf
     makefile    greeting.h  hello.h  world.h  greeting.lnk

     greeting.obj
     greeting.exe /stack:2048
     NUL
     message.lib ;

Command-Definition Statement Sample

     readme.txt  sortsum.bat  source1.txt
     makefile    cmake.cfg    source2.txt

     This sample demonstrates how to add a new command to CMAKE's
     vocabulary through the use of a command-definition statement in
     the configuration file, "cmake.cfg".

     Note the Following:

     1. The commands (and comments) in the make file.  CMAKE will
        deduce all dependencies from these commands.

        See: When is a User-Defined Command Required?

     2. The command-definition statement and section tag, [CMAKE], in
        the configuration file, "cmake.cfg".

        See: Command-Definition Statements
             The CMAKE Section Tag in the Configuration File

Command-Definition Statement Sample

     readme.txt  sortsum.bat  source1.txt
     makefile    cmake.cfg    source2.txt

     /*****************************************************************
     *                           MAKEFILE
     *
     *  PURPOSE: Concatenate the text files, "source1.txt" and
     *           "source2.txt", and sort the resulting file,
     *           "target.txt".
     *
     *  NOTE: None of the comments in this make file are required.
     *        They have been provided to help you understand how CMAKE
     *        handles each command.  In other words, this make file
     *        could be reduced down to the following command:
     *
     *        sortsum source1.txt source2.txt target.txt
     *
     *****************************************************************/

     /*****************************************************************
     *                          TARGET.TXT
     *
     *  The following SORTSUM command will be executed only when one of
     *  the following conditions is true:
     *
     *  1. "target.txt" does not exist.
     *  2. "source1.txt" is newer than "target.txt".
     *  3. "source2.txt" is newer than "target.txt".
     *
     *****************************************************************/

     sortsum source1.txt source2.txt target.txt

Command-Definition Statement Sample

     readme.txt  sortsum.bat  source1.txt
     makefile    cmake.cfg    source2.txt

     rem sortsum.bat - Batch program to combine two text files and
     rem               sort the result
     type %1 >temp
     type %2 >>temp
     sort <temp >%3
     erase temp

Command-Definition Statement Sample

     readme.txt  sortsum.bat  source1.txt
     makefile    cmake.cfg    source2.txt

     ; cmake.cfg - CMAKE configuration file

     [CMAKE]
     command_definition : sortsum sp[%s %s %t]

Command-Definition Statement Sample

     readme.txt  sortsum.bat  source1.txt
     makefile    cmake.cfg    source2.txt

     a
     c
     e
     b
     d

Command-Definition Statement Sample

     readme.txt  sortsum.bat  source1.txt
     makefile    cmake.cfg    source2.txt

     h
     f
     g
     i
     k
     j

Command-Equivalence Statement Sample

     readme.txt  cmake.cfg
     makefile    1.txt

     This sample demonstrates how to add a new command to CMAKE's
     vocabulary through the use of a command-equivalence statement in
     the configuration file, "cmake.cfg".

     Note the Following:

     1. The commands (and comments) in the make file.  CMAKE will
        deduce all dependencies from these commands.

        See: When is a User-Defined Command Required?
             How CMAKE Processes an Equivalent Command

     2. The command-equivalence statement, command-definition
        statement, and section tag, [CMAKE], in the configuration file,
        "cmake.cfg".

        See: Command-Equivalence Statements
             Command-Definition Statements
             The CMAKE Section Tag in the Configuration File

Command-Equivalence Statement Sample

     readme.txt  cmake.cfg
     makefile    1.txt

     /*****************************************************************
     *                           MAKEFILE
     *
     *  PURPOSE: Create the file, "2.txt", by sorting the file,
     *           "1.txt".  Create the file, "3.txt", by extracting all
     *           the lines from the file, "2.txt", that contain the
     *           word "toad".
     *
     *  NOTE: None of the comments in this make file are required.
     *        They have been provided to help you understand how CMAKE
     *        handles each command.  In other words, this make file
     *        could be reduced down to the following two commands:
     *
     *        sort <1.txt >2.txt
     *        find "toad" <2.txt >3.txt
     *
     *****************************************************************/

     /*****************************************************************
     *                             2.TXT
     *
     *  The following SORT command will be executed only when one of
     *  the following conditions is true:
     *
     *  1. "2.txt" does not exist.
     *  2. "1.txt" is newer than "2.txt".
     *
     *****************************************************************/

     sort <1.txt >2.txt

     /*****************************************************************
     *                             3.TXT
     *
     *  The following FIND command will be executed only when one of
     *  the following conditions is true:
     *
     *  1. "3.txt" does not exist.
     *  2. "2.txt" is newer than "3.txt".
     *
     *****************************************************************/

     find "toad" <2.txt >3.txt

Command-Equivalence Statement Sample

     readme.txt  cmake.cfg
     makefile    1.txt

     ; cmake.cfg - CMAKE configuration file

     [CMAKE]
     command_definition : sort sp[<%s >%t]
     command_equivalence : find = sort

Command-Equivalence Statement Sample

     readme.txt  cmake.cfg
     makefile    1.txt

     The toad.
     The hungry toad.
     The flea.
     The edible flea.
     The hungry toad chased the edible flea.

Configuration File Sample

     readme.txt
     cmake.cfg

     This sample demonstrates all the possible types of statements that
     may be used in a CMAKE configuration file.

     Note the Following in the File, "cmake.cfg":

     1. The comments.

        See: Comments in the Configuration File

     2. The section tag, [CMAKE].

        See: The CMAKE Section Tag in the Configuration File

     3. The assignment statements.  "cmake.cfg" gives a complete list
        of the Boolean variables that may be used in a configuration
        file.  In this sample, each Boolean variable is set to its
        default value.

        See: Assignment Statements in the Configuration File

     4. The command-definition statement.

        See: Command-Definition Statements

     5. The command-equivalence statement.

        See: Command-Equivalence Statements

Configuration File Sample

     readme.txt
     cmake.cfg

     ; cmake.cfg - CMAKE configuration file

     [CMAKE]

     ; Assignment statements
     scan_include_files_for_includes = no
     search_source_dir_for_includes = yes
     search_current_dir_for_includes = yes
     c_include_""_on = yes
     c_include_<>_on = no
     asm_include_on = yes
     rc_include_""_on = yes
     rc_include_<>_on = no
     rc_include_resource_on = yes
     run_output_file = yes
     display_output_file_commands = no
     display_execution_time = yes

     ; Command-definition statements
     command_definition : sort sp[<%s >%t]

     ; Command-equivalence statements
     command_equivalence : find = sort



     CMAKE Errors

     To find out about a specific error, do one of the following:

     1. Click on the error number below with the right mouse button.
     2. Enter S to search for an error code.
     3. Execute QuickHelp with the command, QH error_number.

     M0001     M0023     M0044     M0064     M0084     M0107     M0127
     M0002     M0024     M0045     M0065     M0085     M0108     M0128
     M0003     M0025     M0046     M0066     M0086     M0109     M0129
     M0004     M0026     M0047     M0067     M0087     M0110     M0130
     M0005     M0027     M0048     M0068     M0088     M0111     M0131
     M0007     M0028     M0049     M0069     M0089     M0112     M0132
     M0008     M0029     M0050     M0070     M0090     M0113     M0133
     M0009     M0030     M0051     M0071     M0091     M0114     M1000
     M0010     M0031     M0052     M0072     M0092     M0115     M1001
     M0011     M0032     M0053     M0073     M0093     M0116     M1002
     M0012     M0033     M0054     M0074     M0094     M0117     M1003
     M0013     M0034     M0055     M0075     M0095     M0118     M1004
     M0014     M0035     M0056     M0076     M0098     M0119     M1005
     M0015     M0036     M0057     M0077     M0100     M0120     M1006
     M0016     M0037     M0058     M0078     M0101     M0121     M1007
     M0017     M0038     M0059     M0079     M0102     M0122     M1008
     M0018     M0039     M0060     M0080     M0103     M0123     M1009
     M0019     M0040     M0061     M0081     M0104     M0124     M1010
     M0020     M0041     M0062     M0082     M0105     M0125     M1011
     M0021     M0042     M0063     M0083     M0106     M0126     M1012
     M0022     M0043



     Fatal CMAKE error M0001

     invalid command-line parameters

     The command line used to invoke CMAKE was invalid.

     This message is displayed only when the verbose output format is
     selected.

     See: The CMAKE Command Line



     Fatal CMAKE error M0002

     CMAKE aborted

     The command line used to invoke CMAKE was invalid.

     This message is displayed only when the verbose output format is
     selected.

     See: The CMAKE Command Line



     Fatal CMAKE error M0003

     unable to load configuration data

     There is an invalid statement in the CMAKE configuration file.

     This message is displayed only when the verbose output format is
     selected.

     See: The CMAKE Configuration File



     Fatal CMAKE error M0004

     make file 'filename' not found

     CMAKE could not find the given make file.

     See: The CMAKE Command Line



     Fatal CMAKE error M0007

     cannot process command

     One of the commands or statements in the make file could not be
     processed.

     This message is displayed only when the verbose output format is
     selected.

     See: The Make File



     Fatal CMAKE error M0008

     CMAKE aborted

     This message is displayed only when the verbose output format is
     selected and one of the following errors has occurred: M0003,
     M0004, M0005, M0007, or M0104.



     Fatal CMAKE error M0011

     CMAKE aborted

     This message is displayed only when the verbose output format is
     selected and one of the following errors has occurred: M0009 or
     M0010.



     Fatal CMAKE error M0012

     'character' is an invalid command-line option

     An invalid option was specified in the command line used to
     invoke CMAKE.

     See: The CMAKE Command Line



     Fatal CMAKE error M0071

     cannot process configuration statement

     One of the statements in the configuration file could not be
     processed.

     This message is displayed only when the verbose output format is
     selected.

     See: The CMAKE Configuration File



     Fatal CMAKE error M0126

     unable to run QH.EXE - must be in current directory or PATH

     The /h or /help option was specified in the command line used to
     invoke CMAKE.  However, CMAKE could not locate the QuickHelp
     program, QH.EXE.  QH.EXE must be in the current directory or in
     one of the directories specified in the PATH environment variable.

     See: Display Help on CMAKE



     CMAKE error M0005

     output file 'filename' not created

     CMAKE could not create the file, "makefile.bat".

     If the /o option has been specified in the command line used to
     invoke CMAKE, check to be sure that the path given with this
     option is valid.

     See: The CMAKE Command Line



     CMAKE error M0009

     unable to flush standard output prior to loading 'file1' to run 'file2'

     CMAKE was unable to flush the standard output buffer before
     loading "command.com" to execute the batch program,
     "makefile.bat".

     If you have chosen to redirect the output from CMAKE to a file,
     it is possible that the drive on which you have placed this file
     has no more free space.  This is more likely in the case where
     your make file and/or configuration file are large, and you have
     selected the verbose output format and redirected the output from
     CMAKE to a RAM drive.

     See: Select Verbose Diagnostic Output from CMAKE
          Avoid Using the Verbose Output Format for CMAKE
          Redirect CMAKE Output to a File on a RAM Drive



     CMAKE error M0010

     unable to load 'file1' to run output file 'file2'

     CMAKE could not load "command.com" to execute the batch program,
     "makefile.bat".  CMAKE uses the COMSPEC environment variable to
     locate "command.com".

     If you cannot solve this problem, use the CMAKE command-line
     option, /n, or the configuration variable, run_output_file, to
     avoid executing "makefile.bat" from within CMAKE.  Then, after
     CMAKE creates "makefile.bat", you may execute this batch file from
     the command line.

     See: Suppress Command Execution by CMAKE
          run_output_file



     CMAKE error M0013

     source-file name is null

     The source-file name for a CL command given in the make file is
     NULL.

     See: The CL Command Line



     CMAKE error M0014

     object-file name is null

     The object-file name for a CL command given in the make file is
     NULL.

     See: The CL Command Line



     CMAKE error M0015

     unable to open source file 'filename'

     CMAKE could not open the source file for a CL command given in the
     make file.  CMAKE opens source files in order to search for
     #include statements.

     See: The CL Command Line



     CMAKE error M0016

     unable to get time stamp for source file 'filename'

     CMAKE could not obtain the time stamp for the source file of a CL
     command given in the make file.

     See: The CL Command Line



     CMAKE error M0017

     not enough memory to create pseudofile 'filename'

     CMAKE ran out of memory while processing a CL command given in the
     make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0018

     include file 'filename' not found...
     in source directory 'sourcedirectoryname'  ...
     or INCLUDE environment variable paths...
     'includepaths'

     CMAKE could not find an include file while processing a CL command
     given in the make file.  In this case, the include-file name was
     appended to the source-file's directory and to the directories
     specified in the INCLUDE environment variable.

     See: How CMAKE Processes a C-Source File



     CMAKE error M0019

     include file 'filename' not found...
     in INCLUDE environment variable paths...
     'includepaths'

     CMAKE could not find an include file while processing a CL command
     given in the make file.  In this case, the include-file name was
     appended to the directories specified in the INCLUDE environment
     variable.

     If your include file is located in the source-file's directory,
     you should check to be sure that you have not set the
     configuration variable, search_source_dir_for_includes, to 'no'
     in your configuration file.

     See: search_source_dir_for_includes
          Switches for CL
          How CMAKE Processes a C-Source File



     CMAKE error M0020

     not enough memory to store include-file name 'filename'

     CMAKE ran out of memory while processing a CL command given in the
     make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0021

     include level exceeds 9

     Too many levels of nested include statements were used in the
     source file of a CL command given in the make file.  (The source
     file itself is level 0, a file that is included in the source file
     is level 1, etc.)

     This usually indicates the presence of circular include
     statements.



     CMAKE error M0022

     unable to open include file 'filename'

     CMAKE could not open an include file for a CL command given in the
     make file.  When the configuration variable,
     scan_include_files_for_includes, is 'yes', CMAKE opens include
     files in order to search for #include statements.

     If your include files do not have include statements, you should
     not set scan_include_files_for_includes to 'yes'.

     See: scan_include_files_for_includes
          Switches for CL
          How CMAKE Processes a C-Source File
          REM
          Avoid Scanning Include Files for Includes



     CMAKE error M0023

     cannot determine response-file name (missing '@')

     The first character of the parameter string for a LIB command
     given in the make file is not '@'.

     See: The LIB Command Line



     CMAKE error M0024

     response-file name is null

     The response-file name for a LIB command given in the make file
     is NULL.

     See: The LIB Command Line



     CMAKE error M0025

     unable to open response file 'filename'

     CMAKE could not open the response file for a LIB command given in
     the make file.

     See: The LIB Command Line



     CMAKE error M0026

     not enough memory to load response file 'filename'

     CMAKE ran out of memory while processing a LIB command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0027

     no operations given in LIB response file

     There are less than three lines in the response file for a LIB
     command given in the make file.  CMAKE requires that the first
     line of the LIB response file must indicate the library name, the
     second line must be 'y', and the third line must indicate the
     first operation to be performed on the given library.

     See: The LIB Command Line



     CMAKE error M0028

     library-file name is null

     The library name provided in the response file for a LIB command
     given in the make file is NULL.

     See: The LIB Command Line



     CMAKE error M0029

     unrecognized LIB operation - must be '+', '-', '-+', '*', or '-*'

     One of the lines in the response file for a LIB command given in
     the make file begins with an invalid LIB operator.

     See: The LIB Command Line



     CMAKE error M0030

     LIB operation must be '-+'

     One of the lines in the response file for a LIB command given in
     the make file begins with an unexpected LIB operator.

     CMAKE requires that when the third line of a LIB response file
     does not use the add operator, '+', all the operations specified
     in the response file must be '-+'.

     See: The LIB Command Line



     CMAKE error M0031

     object file 'filename' does not exist

     CMAKE could not find one of the object files listed in the
     response file for a LIB command given in the make file.

     See: The LIB Command Line



     CMAKE error M0032

     response-file name 'filename' is too long - cannot add '.clb' extension

     CMAKE requires that when a LIB response file specifies replace
     operations (-+), the length of the response-file name must not
     exceed 62.

     See: Modified Command Line for LIB



     CMAKE error M0033

     new response file 'filename' not created

     CMAKE could not create the LIB response file for a required LIB
     command given in the make file.

     See: Modified Command Line for LIB



     CMAKE error M0034

     unable to delete new response file 'filename'

     CMAKE aborted and could not remove the LIB response file that it
     had created for a required LIB command given in the make file.

     See: Modified Command Line for LIB



     CMAKE error M0035

     unrecognized LIB operation - must be '+', '-', '-+', '*', or '-*'

     One of the lines in the response file for a LIB command given in
     the make file begins with an invalid LIB operator.

     See: The LIB Command Line



     CMAKE error M0036

     LIB operation must be '+'

     One of the lines in the response file for a LIB command given in
     the make file begins with an unexpected LIB operator.

     CMAKE requires that when the third line of a LIB response file
     uses the add operator, '+', all the operations specified in the
     response file must be '+'.

     See: The LIB Command Line



     CMAKE error M0037

     component-library file 'filename' does not exist

     CMAKE could not find one of the component-library files listed in
     the response file for a LIB command given in the make file.

     See: The LIB Command Line



     CMAKE error M0038

     not enough memory to create pseudofile 'filename'

     CMAKE ran out of memory while processing a LIB command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0039

     cannot determine response-file name (missing '@')

     The first character of the parameter string for a LINK command
     given in the make file is not '@'.

     See: The LINK Command Line



     CMAKE error M0040

     response-file name is null

     The response-file name for a LINK command given in the make file
     is NULL.

     See: The LINK Command Line



     CMAKE error M0041

     unable to open response file 'filename'

     CMAKE could not open the response file for a LINK command given in
     the make file.

     See: The LINK Command Line



     CMAKE error M0042

     not enough memory to load response file 'filename'

     CMAKE ran out of memory while processing a LINK command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0043

     executable-file name is null

     The executable name provided in the response file for a LINK
     command given in the make file is NULL.

     See: The LINK Command Line



     CMAKE error M0044

     object file 'filename' does not exist

     CMAKE could not find one of the object files listed in the
     response file for a LINK command given in the make file.

     See: The LINK Command Line



     CMAKE error M0045

     library file 'filename' does not exist

     CMAKE could not find one of the library files listed in the
     response file for a LINK command given in the make file.

     See: The LINK Command Line



     CMAKE error M0046

     not enough memory to create pseudofile 'filename'

     CMAKE ran out of memory while processing a LINK command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0047

     source-file name is null

     The source-file name for a MASM command given in the make file is
     NULL.

     See: The MASM Command Line



     CMAKE error M0048

     object-file name is null

     The object-file name for a MASM command given in the make file is
     NULL.

     See: The MASM Command Line



     CMAKE error M0049

     unable to open source file 'filename'

     CMAKE could not open the source file for a MASM command given in
     the make file.  CMAKE opens source files in order to search for
     include statements.

     See: The MASM Command Line



     CMAKE error M0050

     unable to get time stamp for source file 'filename'

     CMAKE could not obtain the time stamp for the source file of a
     MASM command given in the make file.

     See: The MASM Command Line



     CMAKE error M0051

     not enough memory to create pseudofile 'filename'

     CMAKE ran out of memory while processing a MASM command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0052

     include file 'filename' not found...
     in source directory 'sourcedirectoryname'  ...
     or INCLUDE environment variable paths...
     'includepaths'

     CMAKE could not find an include file while processing a MASM
     command given in the make file.  In this case, the include-file
     name was appended to the source-file's directory and to the
     directories specified in the INCLUDE environment variable.

     If your include file is located in the current directory, you
     should check to be sure that you have not set the configuration
     variable, search_current_dir_for_includes, to 'no' in your
     configuration file.

     See: search_current_dir_for_includes
          Switches for MASM
          How CMAKE Processes an Assembly-Language-Source File



     CMAKE error M0053

     not enough memory to store include-file name 'filename'

     CMAKE ran out of memory while processing a MASM command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0054

     include level exceeds 9

     Too many levels of nested include statements were used in the
     source file of a MASM command given in the make file.  (The source
     file itself is level 0, a file that is included in the source file
     is level 1, etc.)

     This usually indicates the presence of circular include
     statements.



     CMAKE error M0055

     unable to open include file 'filename'

     CMAKE could not open an include file for a MASM command given in
     the make file.  When the configuration variable,
     scan_include_files_for_includes, is 'yes', CMAKE opens include
     files in order to search for include statements.

     If your include files do not have include statements, you should
     not set scan_include_files_for_includes to 'yes'.

     See: scan_include_files_for_includes
          Switches for MASM
          How CMAKE Processes an Assembly-Language-Source File
          REM
          Avoid Scanning Include Files for Includes



     CMAKE error M0056

     source name is null

     The source name for a COPY command given in the make file is NULL.

     See: The COPY Command Line



     CMAKE error M0057

     target name is null

     The target name for a COPY command given in the make file is NULL.

     See: The COPY Command Line



     CMAKE error M0058

     source 'name' does not exist

     CMAKE could not find the source of a COPY command given in the
     make file.

     See: The COPY Command Line



     CMAKE error M0059

     not enough memory to create pseudofile 'filename'

     CMAKE ran out of memory while processing a COPY command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0060

     not enough memory to create pseudofile 'filename'

     CMAKE ran out of memory while processing a COPY command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0061

     not enough memory to create pseudofile 'filename'

     CMAKE ran out of memory while processing a COPY command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0062

     not enough memory to create pseudofile 'filename'

     CMAKE ran out of memory while processing a COPY command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0063

     not enough memory to create pseudofile 'filename'

     CMAKE ran out of memory while processing a COPY command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0064

     not enough memory to create pseudofile 'filename'

     CMAKE ran out of memory while processing a COPY command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0065

     source-file name is null

     A source-file name for a user-defined command given in the make
     file is NULL.

     See: How CMAKE Processes the Command Line of a User-Defined Command



     CMAKE error M0066

     target-file name is null

     A target-file name for a user-defined command given in the make
     file is NULL.

     See: How CMAKE Processes the Command Line of a User-Defined Command



     CMAKE error M0067

     unable to get time stamp for source file 'filename'

     CMAKE could not obtain the time stamp for a source file of a
     user-defined command given in the make file.

     See: How CMAKE Processes the Command Line of a User-Defined Command



     CMAKE error M0068

     not enough memory to store target-file name 'filename'

     CMAKE ran out of memory while processing a user-defined command
     given in the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0069

     not enough memory to create pseudofile 'filename'

     CMAKE ran out of memory while processing a user-defined command
     given in the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0070

     line too long in configuration file - length must be less than 255

     A line in the configuration file exceeds the maximum length limit.



     CMAKE error M0072

     unrecognized configuration statement

     A configuration statement was not recognized to be comment,
     assignment statement, command-definition statement, or command-
     equivalence statement.

     See: The CMAKE Configuration File



     CMAKE error M0073

     right hand side of assignment statement must be 'yes' or 'no'

     The right hand side of all assignment statements in the
     configuration file must be 'yes' or 'no'.

     See: Syntax of Assignment Statements



     CMAKE error M0074

     not enough memory to store command definition

     CMAKE ran out of memory while processing a command-definition
     statement in the configuration file.

     Try eliminating any unnecessary command-definition and command-
     equivalence statements from your configuration file.



     CMAKE error M0075

     command name is null

     The command name for a command-definition statement given in the
     configuration file is NULL.

     See: Command-Definition Statements



     CMAKE error M0076

     command name too long - length must be no more than 8

     The command name for a command-definition statement given in the
     configuration file is too long.

     See: Command-Definition Statements



     CMAKE error M0077

     invalid parameter type - type must be 'sp' or 'fp'

     An invalid parameter type was specified in a command-definition
     statement given in the configuration file.

     See: Command-Definition Statements



     CMAKE error M0078

     missing file type delimiter '%' in stationary parameters

     There is a missing file type delimiter in the stationary
     parameters for a command-definition statement given in the
     configuration file.

     See: Command-Definition Statements



     CMAKE error M0079

     missing file type delimiter '%' in floating parameters

     There is a missing file type delimiter in the floating parameters
     for a command-definition statement given in the configuration
     file.

     See: Command-Definition Statements



     CMAKE error M0080

     invalid file type in stationary parameters - must be 'n', 's', or 't'

     An invalid file type code was used in the stationary parameters
     for a command-definition statement given in the configuration
     file.

     See: Command-Definition Statements



     CMAKE error M0081

     invalid file type in floating parameters - must be 'n', 's', or 't'

     An invalid file type code was used in the floating parameters
     for a command-definition statement given in the configuration
     file.

     See: Command-Definition Statements



     CMAKE error M0082

     open delimiter '[' expected after parameter type

     An open delimiter, '[', was expected in a command-definition
     statement given in the configuration file.

     See: Command-Definition Statements



     CMAKE error M0083

     closing delimiter ']' missing

     A closing delimiter, ']', was expected in a command-definition
     statement given in the configuration file.

     See: Command-Definition Statements



     CMAKE error M0084

     stationary parameters too long - must be sp['up-to-20-characters']

     The stationary parameter string in a command-definition statement
     given in the configuration file is too long.

     See: Command-Definition Statements



     CMAKE error M0085

     floating parameters too long - must be fp['up-to-20-characters']

     The floating parameter string in a command-definition statement
     given in the configuration file is too long.

     See: Command-Definition Statements



     CMAKE error M0086

     not enough memory to store command equivalence

     CMAKE ran out of memory while processing a command-equivalence
     statement in the configuration file.

     Try eliminating any unnecessary command-definition and command-
     equivalence statements from your configuration file.



     CMAKE error M0087

     command name is null

     The command name for a command-equivalence statement given in the
     configuration file is NULL.

     See: Command-Equivalence Statements



     CMAKE error M0088

     command name too long - length must be no more than 8

     The command name for a command-equivalence statement given in the
     configuration file is too long.

     See: Command-Equivalence Statements



     CMAKE error M0089

     equivalent-command name is null

     The equivalent-command name (i.e. right hand side) for a command-
     equivalence statement given in the configuration file is NULL.

     See: Command-Equivalence Statements



     CMAKE error M0090

     equivalent-command name too long - length must be no more than 8

     The equivalent-command name (i.e. right hand side) for a command-
     equivalence statement given in the configuration file is too long.

     See: Command-Equivalence Statements



     CMAKE error M0091

     unrecognized equivalent command

     The equivalent-command name (i.e. right hand side) for a command-
     equivalence statement given in the configuration file is
     unrecognized.

     The equivalent-command name must be either an intrinsic command
     (e.g. CL, LINK, LIB, MASM,...) or a user-defined command that has
     been defined in a previous command-definition statement.

     See: Command-Equivalence Statements



     CMAKE error M0092

     include file 'filename' not found...
     in INCLUDE environment variable paths...
     'includepaths'

     CMAKE could not find an include file while processing a MASM
     command given in the make file.  In this case, the include-file
     name was appended to the directories specified in the INCLUDE
     environment variable.

     If your include file is located in the current directory, you
     should check to be sure that you have not set the configuration
     variable, search_current_dir_for_includes, to 'no' in your
     configuration file.

     If your include file is located in the source-file's directory,
     you should check to be sure that you have not set the
     configuration variable, search_source_dir_for_includes, to 'no' in
     your configuration file.

     See: search_current_dir_for_includes
          search_source_dir_for_includes
          Switches for MASM
          How CMAKE Processes an Assembly-Language-Source File



     CMAKE error M0093

     not enough memory to store environment string address

     CMAKE ran out of memory while processing a SET command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0094

     not enough memory to store environment string

     CMAKE ran out of memory while processing a SET command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0095

     environment variable name is null

     The environment variable name in a SET statement given in the make
     file is NULL.

     See: SET



     CMAKE error M0098

     '(' expected after 'if'

     The character, '(', is missing in an if statement given in the make
     file.

     See: Syntax of the if Statement



     CMAKE error M0100

     not enough memory to store target-file name 'filename'

     CMAKE ran out of memory while processing an if statement given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0101

     unable to get time stamp for source file 'filename'

     CMAKE could not obtain the time stamp for a source file of an
     if statement given in the make file.

     See: Syntax of the if Statement



     CMAKE error M0102

     not enough memory to create pseudofile 'filename'

     CMAKE ran out of memory while processing an if statement given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0103

     line too long - length must be less than 255

     A command line given in the make file exceeds the maximum length
     limit.



     CMAKE error M0104

     not enough memory to create predefined pseudofile 'filename'

     CMAKE ran out of memory while attempting to create the predefined
     pseudofile, "start.psf".

     You do not have enough memory available to execute CMAKE.



     CMAKE error M0105

     comments may not be nested

     Nested C-style comments (/* */) were detected in the make file.
     C-style comments may not be nested.

     See: Comments in the Make File



     CMAKE error M0106

     module-definition file 'filename' does not exist

     CMAKE could not find the module-definition file listed in the
     response file for a LINK command given in the make file.

     See: The LINK Command Line



     CMAKE error M0107

     include file 'filename' not found in current directory...
     'currentdirectoryname', source directory 'sourcedirectoryname'  ...
     or INCLUDE environment variable paths...
     'includepaths'

     CMAKE could not find an include file while processing a MASM
     command given in the make file.  In this case, the include-file
     name was appended to the current directory, the source-file's
     directory and the directories specified in the INCLUDE
     environment variable.

     See: How CMAKE Processes an Assembly-Language-Source File



     CMAKE error M0108

     include file 'filename' not found in current directory...
     'currentdirectoryname' or INCLUDE environment variable paths...
     'includepaths'

     CMAKE could not find an include file while processing a MASM
     command given in the make file.  In this case, the include-file
     name was appended to the current directory and to the directories
     specified in the INCLUDE environment variable.

     If your include file is located in the source-file's directory,
     you should check to be sure that you have not set the
     configuration variable, search_source_dir_for_includes, to 'no' in
     your configuration file.

     See: search_source_dir_for_includes
          Switches for MASM
          How CMAKE Processes an Assembly-Language-Source File



     CMAKE error M0109

     resource-script-file name is null

     The resource-script-file name for an RC/C command given in the
     make file is NULL.

     See: The RC/C Command Line



     CMAKE error M0110

     resource-file name is null

     The resource-file name for an RC/C command given in the make file
     is NULL.

     See: The RC/C Command Line



     CMAKE error M0111

     unable to open resource-script file 'filename'

     CMAKE could not open the resource-script file for an RC/C command
     given in the make file.  CMAKE opens resource-script files in
     order to search for #include statements and resource-include
     statements.

     See: The RC/C Command Line



     CMAKE error M0112

     unable to get time stamp for resource-script file 'filename'

     CMAKE could not obtain the time stamp for the resource-script file
     of an RC/C command given in the make file.

     See: The RC/C Command Line



     CMAKE error M0113

     resource-file name is null

     The resource-file name for an RC/A command given in the make file
     is NULL.

     See: The RC/A Command Line



     CMAKE error M0114

     executable-file name is null

     The executable-file name for an RC/A command given in the make
     file is NULL.

     See: The RC/A Command Line



     CMAKE error M0115

     unable to get time stamp for executable file 'filename'

     CMAKE could not obtain the time stamp for the executable file of
     an RC/A command given in the make file.

     See: The RC/A Command Line



     CMAKE error M0116

     unable to get time stamp for resource file 'filename'

     CMAKE could not obtain the time stamp for the resource file of an
     RC/A command given in the make file.

     See: The RC/A Command Line



     CMAKE error M0117

     target-file name is null

     The target-file name for an RC/W command given in the make file is
     NULL.

     See: The RC/W Command Line



     CMAKE error M0118

     unable to get time stamp for target file 'filename'

     CMAKE could not obtain the time stamp for the target file of an
     RC/W command given in the make file.

     See: The RC/W Command Line



     CMAKE error M0119

     cannot determine RC operation

     CMAKE could not determine the operation type of an RC command
     given in the make file.

     See: RC Operations
          The RC/C Command Line
          The RC/A Command Line
          The RC/W Command Line



     CMAKE error M0120

     not enough memory to create pseudofile 'filename'

     CMAKE ran out of memory while processing an RC command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0121

     include file 'filename' not found in current directory...
     'currentdirectoryname' or INCLUDE environment variable paths...
     'includepaths'

     CMAKE could not find an include file while processing an RC/C
     command given in the make file.  In this case, the include-file
     name was appended to the current directory and to the directories
     specified in the INCLUDE environment variable.

     See: How CMAKE Processes a Resource-Script File



     CMAKE error M0122

     include file 'filename' not found...
     in INCLUDE environment variable paths...
     'includepaths'

     CMAKE could not find an include file while processing an RC/C
     command given in the make file.  In this case, the include-file
     name was appended to the directories specified in the INCLUDE
     environment variable.

     If your include file is located in the current directory, you
     should check to be sure that you have not set the configuration
     variable, search_current_dir_for_includes, to 'no' in your
     configuration file.

     See: search_current_dir_for_includes
          Switches for RC/C
          How CMAKE Processes a Resource-Script File



     CMAKE error M0123

     not enough memory to store include-file name 'filename'

     CMAKE ran out of memory while processing an RC/C command given in
     the make file.

     Try splitting your make file into two smaller make files that are
     processed with two consecutive calls to CMAKE.



     CMAKE error M0124

     include level exceeds 9

     Too many levels of nested include statements were used in the
     resource-script file of an RC/C command given in the make file.
     (The resource-script file itself is level 0, a file that is
     included in the resource-script file is level 1, etc.)

     This usually indicates the presence of circular include
     statements.



     CMAKE error M0125

     unable to open include file 'filename'

     CMAKE could not open an include file for an RC/C command given in
     the make file.  When the configuration variable,
     scan_include_files_for_includes, is 'yes', CMAKE opens include
     files in order to search for #include statements and resource-
     include statements.

     If your include files do not have include statements, you should
     not set scan_include_files_for_includes to 'yes'.

     See: scan_include_files_for_includes
          Switches for RC/C
          How CMAKE Processes a Resource-Script File
          REM
          Avoid Scanning Include Files for Includes



     CMAKE error M0127

     unexpected end-of-file

     An unexpected end-of-file was reached while processing the
     response file for a LIB command given in the make file.

     Check to be sure that the last line in the response file does not
     end with the character, '&'.

     See: The LIB Command Line



     CMAKE error M0128

     unexpected end-of-file

     An unexpected end-of-file was reached while processing the
     response file for a LIB command given in the make file.

     Check to be sure that the last line in the response file does not
     end with the character, '&'.

     See: The LIB Command Line



     CMAKE error M0129

     unexpected end-of-file

     An unexpected end-of-file was reached while processing the
     response file for a LINK command given in the make file.

     Check to be sure that the executable-file name has not been
     omitted from the response file.

     Check to be sure that the last line in the response file does not
     end with the character, '+'.

     See: The LINK Command Line



     CMAKE error M0130

     unexpected end-of-file

     An unexpected end-of-file was reached while processing the
     response file for a LINK command given in the make file.

     Check to be sure that the last line in the response file is
     terminated with the character, ';'.

     See: The LINK Command Line



     CMAKE error M0131

     unexpected end-of-file

     An unexpected end-of-file was reached while processing the
     response file for a LINK command given in the make file.

     Check to be sure that the last line in the response file is
     terminated with the character, ';'.

     See: The LINK Command Line



     CMAKE error M0132

     unexpected end-of-file

     An unexpected end-of-file was reached while processing the
     response file for a LINK command given in the make file.

     Check to be sure that the last line in the response file is
     terminated with the character, ';'.

     See: The LINK Command Line



     CMAKE error M0133

     unexpected end-of-file

     An unexpected end-of-file was reached while processing the
     response file for a LINK command given in the make file.

     Check to be sure that the last line in the response file does not
     end with the character, '+'.

     See: The LINK Command Line



     CMAKE error M1000

     token truncated to 'token' - maximum token length is 67

     There is a token in the make file that is too long.



     CMAKE error M1001

     unexpected end-of-file

     An unexpected end-of-file was reached while processing an if
     statement given in the make file.

     See: Syntax of the if Statement



     CMAKE error M1002

     token truncated to 'token' - maximum token length is 67

     There is a token in the make file that is too long.  This was
     discovered while processing an if statement in the make file.



     CMAKE error M1003

     unexpected end-of-file

     An unexpected end-of-file was reached while processing an if
     statement given in the make file.

     See: Syntax of the if Statement



     CMAKE error M1004

     token truncated to 'token' - maximum token length is 67

     There is a token in the make file that is too long.  This was
     discovered while processing an if statement in the make file.



     CMAKE error M1005

     unexpected end-of-file

     An unexpected end-of-file was reached while processing an if
     statement given in the make file.

     See: Syntax of the if Statement



     CMAKE error M1006

     token truncated to 'token' - maximum token length is 67

     There is a token in the make file that is too long.  This was
     discovered while processing an if statement in the make file.



     CMAKE error M1007

     unexpected end-of-file

     An unexpected end-of-file was reached while processing an if
     statement given in the make file.

     See: Syntax of the if Statement



     CMAKE error M1008

     token truncated to 'token' - maximum token length is 67

     There is a token in the make file that is too long.  This was
     discovered while processing an if statement in the make file.



     CMAKE error M1009

     unexpected end-of-file

     An unexpected end-of-file was reached while processing an if
     statement given in the make file.

     See: Syntax of the if Statement



     CMAKE error M1010

     token truncated to 'token' - maximum token length is 67

     There is a token in the make file that is too long.  This was
     discovered while processing an if statement in the make file.



     CMAKE error M1011

     unexpected end-of-file

     An unexpected end-of-file was reached while processing an if
     statement given in the make file.

     Check to be sure that you have not omitted the terminating
     bracket, '}', from an if statement in your make file.  Check your
     last if statement first.

     See: Syntax of the if Statement



     CMAKE error M1012

     token truncated to 'token' - maximum token length is 67

     There is a token in the make file that is too long.  This was
     discovered while processing an if statement in the make file.

Copyright and Trademarks

     Copyright

     (c) Copyright John Greschak 1991.

     Registered Trademarks

     Microsoft and MS-DOS are registered trademarks of Microsoft
     Corporation.

     CompuServe is a registered trademark of CompuServe, Inc.

     BRIEF is a registered trademark of UnderWare, Inc.

     Trademarks

     Windows is a trademark of Microsoft Corporation.

     Epsilon is a trademark of Lugaru Software, Ltd.

CMAKE Index

  /a option                Display Information about CMAKE

  asm_include_on           asm_include_on
                           Switches for MASM
                           How CMAKE Processes an ASM-Source File

  assignment statements    Assignment Statements in the Configuration File

  author                   Technical Support for CMAKE
                           Display Information about CMAKE

  Boolean variables        Boolean Variables

  BRIEF                    Error Messages (Viewing)
                           Using CMAKE with BRIEF

  c_include_""_on          c_include_""_on
                           Switches for CL
                           How CMAKE Processes a C-Source File

  c_include_<>_on          c_include_<>_on
                           Switches for CL
                           Avoid Checking System-Include Dependencies
                           How CMAKE Processes a C-Source File

  CL                       CL

  CMAKE_CFG environment variable
                           How CMAKE Locates the Configuration File

  /* CMAKE - INCLUDE END */
                           How CMAKE Processes a C-Source File
                           Switches for CL
                           How CMAKE Processes a Resource-Script File
                           Switches for RC/C
                           Helpful Hints for RC/C
                           Use the End-of-Includes Comment

  /* CMAKE - INCLUDE "" ON/OFF */
                           How CMAKE Processes a C-Source File
                           Switches for CL
                           Some Restrictions on CL
                           How CMAKE Processes a Resource-Script File
                           Switches for RC/C
                           Some Restrictions on RC/C
                           rc_include_""_on
                           c_include_""_on

  /* CMAKE - INCLUDE <> ON/OFF */
                           How CMAKE Processes a C-Source File
                           Switches for CL
                           How CMAKE Processes a Resource-Script File
                           Switches for RC/C
                           c_include_<>_on
                           rc_include_<>_on
                           Avoid Checking System-Include Dependencies

  /* CMAKE - INCLUDE RESOURCE ON/OFF */
                           How CMAKE Processes a Resource-Script File
                           Switches for RC/C
                           Helpful Hints for RC/C
                           rc_include_resource_on

  ; CMAKE - INCLUDE END    How CMAKE Processes an ASM-Source File
                           Switches for MASM
                           Use the End-of-Includes Comment

  ; CMAKE - INCLUDE ON/OFF How CMAKE Processes an ASM-Source File
                           Switches for MASM
                           asm_include_on

  "cmake.cfg"              How CMAKE Locates the Configuration File
                           Help CMAKE Find Configuration Data Quickly

  command-definition statements
                           Command-Definition Statements
                           Description of User-Defined Commands
                           Verbose Output - User-Defined Commands
                           User-Defined Commands: Pseudofiles: Examples

  command-equivalence statements
                           Command-Equivalence Statements
                           Description of Equivalent Commands
                           Verbose Output - Equivalent Commands

  command-line options     The CMAKE Command Line

  commands                 Make-File Commands

  comments                 Comments in the Make File
                           Comments in the Configuration File

  COMSPEC environment variable
                           CMAKE error M0010

  configuration file       The CMAKE Configuration File

  COPY                     COPY

  dependencies             Introduction
                           Description of the if Statement

  display_execution_time   display_execution_time

  display_output_file_commands
                           display_output_file_commands

  editors                  Error Messages
                           Using CMAKE with Your Editor
                           The RC/C Command Line

  environment variables    How CMAKE Locates the Configuration File

  Epsilon                  Error Messages
                           Using CMAKE with Epsilon

  equivalent commands      Equivalent Commands

  error messages           Error Messages
                           Using CMAKE with Your Editor
                           CMAKE Errors

  execution time           display_execution_time
                           Overview of Optimization Techniques for CMAKE
                           Interpreting the Output of CMAKE

  exit codes               CMAKE Exit Codes

  floating parameters      Command-Definition Statements
                           Processing User-Defined Commands
                           Verbose Output - User-Defined Commands

  Greschak                 Introduction
                           Technical Support for CMAKE

  /help option             Display Help on CMAKE

  if statements            The if Statement

  IMPLIB                   Command-Definition Statements: Examples

  INCLUDE environment variable
                           How CMAKE Processes a C-Source File
                           Switches for CL
                           How CMAKE Processes an ASM-Source File
                           Switches for MASM
                           How CMAKE Processes a Resource-Script File
                           Switches for RC/C
                           search_source_dir_for_includes
                           search_current_dir_for_includes

  include statements       How CMAKE Processes a C-Source File
                           How CMAKE Processes an ASM-Source File
                           How CMAKE Processes a Resource-Script File

  input file               Interpreting the Output of CMAKE

  intrinsic commands       Intrinsic Commands

  LIB                      LIB

  LIB environment variable The LINK Command Line
                           Samples: Microsoft Windows SDK

  LINK                     LINK

  local-include statements How CMAKE Processes a C-Source File
                           How CMAKE Processes a Resource-Script File

  "makefile"               Specify the Make-File Name

  "makefile.bat"           How CMAKE Works
                           Interpreting the Output of CMAKE
                           Suppress Command Execution by CMAKE
                           Specify the Path of "makefile.bat"
                           run_output_file
                           display_output_file_commands
                           Have CMAKE Put "makefile.bat" on a RAM Drive

  make file                Creating a Make File
                           Specify the Make-File Name
                           The Make File

  MASM                     MASM

  The Microsoft Editor     Error Messages
                           Using CMAKE with The Microsoft Editor

  /n option                Suppress Command Execution by CMAKE
                           run_output_file

  neutral files            Command-Definition Statements
                           Processing User-Defined Commands

  /o option                Specify the Path of "makefile.bat"
                           The CMAKE Command Line: Examples
                           Have CMAKE Put "makefile.bat" on a RAM Drive

  options                  The CMAKE Command Line

  output                   Interpreting the Output of CMAKE
                           Select Verbose Diagnostic Output from CMAKE
                           Avoid Using the Verbose Output Format for CMAKE
                           Redirect CMAKE Output to a File on a RAM Drive

  output file              Interpreting the Output of CMAKE

  PATH environment variable
                           Display Help on CMAKE

  predefined pseudofiles   Pseudofiles for User-Defined Commands
                           Pseudofiles for the if Statement

  pseudofiles              How CMAKE Works

  QH                       Display Help on CMAKE

  QuickHelp                Display Help on CMAKE

  RC                       RC

  RC/A                     RC/A

  RC/C                     RC/C

  RC/CA                    RC/CA

  RC/W                     RC/W

  rc_include_""_on         rc_include_""_on
                           Switches for RC/C
                           How CMAKE Processes a Resource-Script File

  rc_include_<>_on         rc_include_<>_on
                           Switches for RC/C
                           How CMAKE Processes a Resource-Script File

  rc_include_resource_on   rc_include_resource_on
                           Switches for RC/C
                           How CMAKE Processes a Resource-Script File

  registered users         Display Information about CMAKE

  REM                      REM

  REM CMAKE - SCAN INCLUDE FILES FOR INCLUDES ON/OFF
                           Switches for CL
                           How CMAKE Processes a C-Source File
                           Switches for MASM
                           How CMAKE Processes an ASM-Source File
                           Switches for RC/C
                           How CMAKE Processes a Resource-Script File
                           REM
                           scan_include_files_for_includes
                           Avoid Scanning Include Files for Includes

  resource-include statements
                           How CMAKE Processes a Resource-Script File

  response files           The LIB Command Line
                           The LINK Command Line

  run_output_file          run_output_file
                           Suppress Command Execution by CMAKE

  scan_include_files_for_includes
                           scan_include_files_for_includes
                           Switches for CL
                           How CMAKE Processes a C-Source File
                           Switches for MASM
                           How CMAKE Processes an ASM-Source File
                           Switches for RC/C
                           How CMAKE Processes a Resource-Script File
                           REM
                           Avoid Scanning Include Files for Includes

  search_current_dir_for_includes
                           search_current_dir_for_includes
                           Switches for MASM
                           How CMAKE Processes an ASM-Source File
                           Switches for RC/C
                           How CMAKE Processes a Resource-Script File
                           Help CMAKE Find Include Files Quickly

  search_source_dir_for_includes
                           search_source_dir_for_includes
                           Switches for CL
                           How CMAKE Processes a C-Source File
                           Switches for MASM
                           How CMAKE Processes an ASM-Source File
                           Help CMAKE Find Include Files Quickly

  sensitivity to include statements
                           How CMAKE Processes a C-Source File
                           How CMAKE Processes an ASM-Source File
                           How CMAKE Processes a Resource-Script File

  SET                      SET

  shareware                Display Information about CMAKE

  SORT                     Command-Definition Statements: Examples

  source files             How CMAKE Works

  "start.psf"              Pseudofiles for User-Defined Commands
                           Pseudofiles for the if Statement

  stationary parameters    Command-Definition Statements
                           Processing User-Defined Commands
                           Verbose Output - User-Defined Commands

  system-include statements
                           How CMAKE Processes a C-Source File
                           How CMAKE Processes a Resource-Script File

  target files             How CMAKE Works

  technical support        Technical Support for CMAKE

  time stamps              How CMAKE Works

  unrecognized commands    Unrecognized Commands in the Make File

  user-defined commands    User-Defined Commands

  /v option                Select Verbose Diagnostic Output from CMAKE
                           Avoid Using the Verbose Output Format for CMAKE

  variables                Boolean Variables

  %n                       Command-Definition Statements

  %s                       Command-Definition Statements
                           Command-Definition Statements: Examples
                           Verbose Output - User-Defined Commands
                           User-Defined Commands: Pseudofiles: Examples

  %t                       Command-Definition Statements
                           Command-Definition Statements: Examples
                           Verbose Output - User-Defined Commands
                           User-Defined Commands: Pseudofiles: Examples

  /? option                Display Command-Line Help for CMAKE

  " "                      How CMAKE Processes a C-Source File
                           How CMAKE Processes a Resource-Script File

  < >                      How CMAKE Processes a C-Source File
                           How CMAKE Processes a Resource-Script File

  <                        The if Statement

  >                        Interpreting the Output of CMAKE

  ;                        Comments in the Configuration File

  /                        CMAKE Options

  -                        CMAKE Options

  //                       Comments in the Make File

  /* */                    Comments in the Make File

  { }                      The if Statement

  ( )                      The if Statement
