═══ 1. About PM Make ═══ PM Make Utility for OS/2 Created by Peter Koller, La vieille Maison d'Anglais, Trebuon, 29530 Plonevez du Faou, France. (...more...) About La Maison d'Anglais La Maison d'Anglais pictured above is a 17th century (169?) weavers cottage of either English or Flemish (Angles) origin. The products originating therein are the products of Peter Koller, a dedicated Hardware and Software engineer of more than 18 years experience in the design of computers, their software, and their interface to the real world. PM Make is a programmers project builder with a number of features.-  Built in project backup and restore.  User menus defined in the makefile can set compiler, etc., options.  Can include 'global' makefiles as headers.  Can stop on error.  Allows review of error messages.  Force make according to compiler or linker options or make all.  Can make .exe, .hlp, .dll, etc... all in one build.  Background build with 'pop up on error' mode.  Will work in multiple directories.  Fast.  Applicable to any third party compilers, linkers, or other tools. PM Make evaluation copy is a fully functional product for you to enjoy for 30 days. After that, Please Register.... Other products available Program Editor PM Based editor with.-  LOADS of minor features plus...  Customisable edit functions (scripts).  Background Exec to Parse. Test/Make your programs before exiting the editor.  Works with most compilers.  Customizable goto error keys position you at the error.  Extensively MultiThreaded.  Smooth Scrolling.  Now at V1.20 eg.- Well Tested.  Good General Purpose Editor, esp. large files.  Fast, Reliable, Safe. Enquiries concerning the production of new products, or the inclusion of this product into new products, or the inclusion of features from this product into new products are very welcome. See Also:- Installation. (c) Copyright Note: This product is designed for use with third party products. These third party products have their own copyright. This product does not confer any rights to you in respect of a third party. ═══ 2. Installation ═══ Installation Instructions You must use the Install utility provided if you wish to  Install PM Make.  Uninstall PM Make.  Register PM Make. If you are merely registering, you can uncheck all the buttons before proceeding. The minimum files installed are pmmake.exe, pmmake.hlp, and register.doc. That's it !! Enjoy. To uninstall PM Make run install.exe and select Uninstall, the press Install. Be sure the path and help path is entered correctly before uninstalling. Only those files supplied in the original package will be deleted. You must delete any Objects or Folders by hand. ═══ 3. (c)copyright ═══ This program is the (c) copyright of Peter Koller, La vieille Maison d'Anglais, Trebuon, 29530, Plonevez du Faou, FRANCE. All Rights Reserved. Note: This copyright includes the whole product, including the makefile language format, the installation program, and all documentation associated with the product. 1. You may use the program only on a single machine at any one time.If you have purchased a multiple copy, you may use an according number of copies simultaneously. 2. You may copy the program into machine readable or printed form for backup or data compression purposes. You may not reverse engineer or disassemble the program. 3. You may give this copy to others. You may also charge the end user reasonable costs incurred by your distribution of this product. Please ensure you distribute the entire package as shown below. 4. This product is Shareware. You Must be registered if you continue to use this product after you have evaluated it. Unregistered software will time out after one month. 5. If you have a Customer Registration Code (CRN), you must not disclose it to anyone. Please quote the number shown in the statistics dialog, rather than the full CRN, when seeking technical support. The Author accepts no liability for fitness of purpose, or damages caused whether incidental, or consequential, by the use of this product, howsoever caused. This product is Sold As Seen. In those countries where this statement conflicts with your statutory rights your statutory rights shall remain unaffected. This product consists of load.cmd Run OS/2 unpack** to convert... pmmk_p.ack this file into...- install.exe The program install utility. pmpfold.cmd REXX folder creation, used by install.exe pmmake.exe The executable file. pmmake.hlp This help File. pmmake.inf This help File in .inf format. register.doc The product registration sheet. read.me Late breaking information. make.inc Example Make include file makefile Example Makefile uninstal.doc How to remove (uninstall) PM Make Note: ** IBM unpack (c) IBM. Registered trademarks of International Business Machines Corporation ═══ 4. File Menu ═══ This menu enables you to open a makefile. Makefiles can come in several parts.  An include file specified on the Command Line. This file is always loaded first if specified.  A make file. You can also drag and drop make files onto PM Make. If an include file is specified on the Command Line, it is always loaded, and always loaded first.  Any number of other files you may wish to append to the makefile. If you open a new make file, the appended files are not reloaded automatically. Appended files are added to the end of the makefile. ═══ 4.1. Open a Makefile ═══ Select open and you will see a standard file dialog. After you have pressed Ok, an Include file is loaded (if specified on the Command Line) before the selected file is opened. You can also drag and drop make files onto PM Make. If an include file is specified on the Command Line, it is loaded before the selected file is opened. If an include file is specified the resultant makefile in memory is the includefile with the makefile appended. ═══ 4.2. Append to a Makefile ═══ Any other files you may wish to append to the makefile. If you open a new make file, the appended files are not reloaded automatically. Appended files are added to the end of the makefile. ═══ 5. Command Line Usage ═══ pmmake (options) filename eg pmmake /id:\make\make.inc /s /r /x mymake.mak If you have a number of different objects for PM Make, you can put different options into the parameters field of each object. To find out more about the different things that can be achieved by object settings, look at the OS/2 system documentation. These are the options available. /a ...causes a make all. The makefile is run automatically. /r ...causes a make update. The makefile is run automatically. /t ...causes a test make. The makefile is NOT run automatically. include /r or /a. /s ...run minimised (silent mode). Restores to default size on error. /x ...auto exit. exit when done. Will not exit if there is an error. /i ...include file is always loaded first. This option is usually present. Errors Use a batch command as shown below to cause an error exit during make.- if errorlevel 1 exit When you specify actions, you can use the full range of OS/2 batch commands available. Examples  pmmake /id:\make\make.inc /t /a makefile Test runs a make all on make.inc + makefile.  pmmake /id:\make\make.inc /s /r /x makefile Runs make.inc + makefile and exits if no errors were found. Runs minimised. Note: There is no space between options and their contents. Using /x, /X, -x, and -X, (where x is an example option) are all equivalent. ═══ 6. Edit Menu ═══ This menu is used to.- Undo the last action. Cut a Selected area to the clipboard Copy a Selected area to the clipboard Paste from the clipboard over a selected area. Clear a Selected area. (ERASE it !!) ═══ 6.1. Undoing Changes ═══ Select Undo from the Edit menu or type alt+backspace to undo the last action. You Cannot undo two different actions. eg. if you type something and then delete a char and then type something else, only the last bit of typing is undone. ═══ 6.2. Cutting out blocks ═══ First select a piece of text to hilite it. Select Cut from the Edit menu or press shift+del to copy the selected text to the clipboard and delete the hilited area. See also Copy a Selected area to the clipboard Paste from the clipboard over a selected area. Clear a Selected area. (ERASE it !!) ═══ 6.3. Copying blocks ═══ First select a piece of text to hilite it. Select Copy from the Edit menu or press ctrl+ins to copy the selected text to the clipboard, this does not delete the hilited area. See also Cut a Selected area to the clipboard Paste from the clipboard over a selected area. Clear a Selected area. (ERASE it !!) ═══ 6.4. Pasting blocks ═══ Select Paste from the Edit menu or press shift+ins to delete any area that may be hilited and then copy any text in the clipboard into the file at the position previously occupied by the hilited area (eg. at the cursor position). See also Cut a Selected area to the clipboard Copy a Selected area to the clipboard Clear a Selected area. (ERASE it !!) ═══ 6.5. Clearing selected text ═══ First select a piece of text to hilite it. Select Clear from the Edit menu or press del to delete the hilited area. Data is not copied to the clipboard. See also Cut a Selected area to the clipboard Copy a Selected area to the clipboard Paste from the clipboard over a selected area. ═══ 6.6. Selecting Text ═══ To select a block of text.... 1. Position the cursor at the start or end of the block you wish to select. 2. Hold down the left mouse button and move the mouse over the area required. OR 1. Position the cursor at the start or end of the block you wish to select. 2. Hold down the Shift Key and use the cursor movement (arrow, home, end, etc.) Keys. Note: The Selected block will be hilited. Because ctrl+ins (copy) and shift+ins (paste) as well as selecting text works in any entry field, you can copy a string to the clipboard and then into the entryfield desired. ═══ 7. Project Menu ═══ This menu is used to.- Backup the project files. Restore the project files. Query Dependencies within the project. Test Make the project. Make Update the project. Make All the project. ═══ 7.1. Backup ═══ Before you begin.- 1. Make sure you have a formatted disk in your backup drive (if applicable) 2. Run a test backup first!!! This will test your makefile and give you an idea of space requirements. Make sure all the required files are going to be backed up. 3. Do NOT interrupt a backup once started. 4. You may need to set the following commands in your makefile  ^projectroot()  ^filepath()  ^files() Make sure that you also backup such items as the makefile and docs. Here is an example. ^projectroot(d:\projects\myproj); ^filepath(..\docs); ^files() { makefile read.me internal.doc } All the remaining files are extracted from the make profiles, so that if PM Make can make your project it can also back it up. During backup the file sizes and free space on your backup drive are displayed. If there is an older version of the file on disk, this is taken into account as free space. This means that often the space required to save a file is less than the file size shown. If there is insufficient space, PM Make will prompt for a new disk up to three times before giving up. This is true even if you are backing up to a hard disk. It pays to keep two backups of your project. ═══ 7.2. Restore ═══ Restore is used to recover files from the backup drive. For restore to work, the makefile must be loaded and the backup disk must contain the files in the right places. For this reason, you should only try and restore from disk's backed up with PM Make. Warning Restore will happily copy old backup files over new files. Be sure that you really want to restore a particular file from your backup. Test Restore first. You can.-  Restore All files.  Restore Source files.  Select the files to restore. The list box is updated whenever you click on the restore all or restore source radio buttons. If you decide to select the files to restore, you can select multiple files from the list box by dragging, by using ctrl and clicking, or by using shift and clicking. A little experimentation will reveal all. Restore will restore the files into the directories specified in your make file. If these directories do not exist, they will be created. ═══ 7.3. Testing the Makefile ═══ When you have loaded your make file and before you make (compile and link) your project, you ought to run a test make. Test make shows you the batch/command file that will be created when you run make. If you wish to see what a batchfile for make all looks like, you can do it from the command line. eg.- pmmake /t /a ...any other options... makefile More realistically.- pmmake /id:\make\make.inc /t /a d:\project\myproj\mymake.mak ═══ 7.4. Make ═══ Make will create a batch file to update your project and will then run the batch file. You can update a number of exe's, dll's, hlp's, etc at the same time. ═══ 7.5. Make All ═══ Make all will rebuild your project from scratch. Every make is performed. You can start a make all and then minimize PM Make. If your PC is up to it, you can then do something else. Note that compilation is very power hungry. If you attempt to run two PM Make's at the same time you will get a mutual exclusion error message asking you to try later. ═══ 7.6. Query Dependencies ═══ Select a file from the dropdown listbox marked 'This File', and PM Make will search the makefile to find all the output files that depend upon this file. This is of most use for header files as an aid to rationalising large projects. Often, a header of little consequence is included in every file, whereas a little judicious subdividing of headers can reduce compile times drastically. Bear in mind that if you have a ^get() function, or a $Variable in your ^make() function to define a filename, the results may well depend on user menu selections. ═══ 8. Options Menu ═══ No options are automatically saved. It is up to you to 'customize' PM Make as you wish. You can use uninstall to clear all saved options. ═══ 8.1. Saving the window size ═══ You can save the size of the PM Make window. You cannot save it's position. PM Make will then always startup with the saved window size. ═══ 8.2. Saving the backup options ═══ The options saved are the state of the CheckButtons in both backup and restore dialogs, as well as the Backup Path. ═══ 8.3. Statistics ═══ This dialog shows current PM Make memory usage. Enjoy! Note: Allocated space may be wildly different from used space. This may be because of allocation block size, guard memory, and cleared (no longer used) workareas. ═══ 9. User Menus ═══ This is where you will find user created dialogs. These dialogs are specified in the makefile. ═══ 10. Help Menu ═══ Help is provided by this menu. You may use F1 to get help at any time. ═══ 10.1. Keys Help ═══ The only relevant key not shown on the menu's is ESC. This key will TRY and stop a make, backup etc. There is no guarantee that it will succeed. This is because separate sessions can refuse to be killed. The recommended approach is to Test Everything first! ═══ 11. Introducing PM Makefiles ═══ This chapter introduces makefiles for PM Make, and shows you how to construct your own. For further information see also Makefile function syntax A number of compilers, linkers etc will produce output files in the directory in which they are run. Linkers often link large numbers of objects together, if each one had to have a full path attached things quickly get out of hand. Often the options for compilation, linking and testing are interrelated. Changing a compiler option has repercussions on which files need to be re-built. It is for the above reasons that PM Make uses it's own makefile format. This format allows you to change directories, change compilation and linker options, force particular files to make, and backup any changes. In short.- 1. Change Directories. a. ^workpath() Allows you to run different makes in different directories 2. Change Compilation and linker options. a. ^actions() b. ^vars() c. ^menu() d. ^get() See Also PM Make Include file 3. Forcing Makes a. ^make() For example ^make(..\build\main.obj, $Compile, ^get($ForceID,1,0);){main.c;} 4. Backup and Restore a. ^projectroot() b. ^filepath() c. ^files() See Also Backup. ═══ 11.1. Internal Operation ═══ This section describes how PM Make handles makefiles. This is useful to know if you are having problems. PM Make does not read makefiles in one hit but in two passes. The first pass being on open, the others depending on what is wanted. ═══ 11.1.1. Open ═══ When the makefile is opened PM Make reads the include file if there is one, then appends makefile and sets up a series of string buffers for.-  ^actions()  ^vars()  ^menu() If the user appends another file, the operation is repeated. The only vars evaluated are those associated with menu's. If ^get() is used in ^menu(), then the associated menuitem must be declared first. ═══ 11.1.2. Make ═══ On Test Make, Make, or Make All, the following functions are run.-  ^workpath()  ^make()  ^out() At this stage all vars and ^get()'s used are evaluated. For Make and Make All, PM Make opens a file in the directory specified by the TMP environment variable. You must declare TMP in config.sys. eg.- SET TMP=C:\tmp The filename of this file is pmmk~~~~.cmd. This file is then run using DosStartSession. A mutual exclusion semaphore prevents other copies of PM Make attemping to make at the same time. ═══ 11.1.3. Backup and Restore ═══ On Backup and restore the following functions are run.-  ^projectroot()  ^filepath()  ^workpath() ...runs ^filepath()  ^make() ...runs internal version of ^files()  ^files() This builds a table of either the source files or all the files in memory. If ^projectroot() is not specified then all files are backed up to the backup path. Backup and restore use this memory table to determine which files to copy. Copying is done using the ordinary copy command (with /v for verify). ═══ 11.2. A Minimal makefile ═══ Here is a minimal makefile for pmmake.... "A comment is usually in quotes and always OUTSIDE the functions" ^actions() { Compile = icc /Fo$*.obj /C /Ss $*.c ; Link = ilink /out:$*.exe /optf /BASE:65536 /ALIGN:16 $*.obj cppos30.lib $*.def rc $*.res $*.exe ; Resource = rc -r -x $*.rc; Help = ipfc $*.ipf; } ^workpath(d:\program\pmmake\csource); ^make(..\build\about.obj,$Compile, 0) { about.c; about.h; pmmake.hr; } "... A number of makes have been deleted for clarity ..." ^make(..\build\runcmd.obj,$Compile, 0) { runcmd.c; runcmd.h; mainvars.h; message.h; pmmake.hr; } ^workpath(d:\program\pmmake\dialogs); ^make(pmmake.res,$Resource, 0) { pmmake.rc; ..\csource\pmmake.hr; ..\csource\help.hp; help.dlg; about.dlg; pmuser.dlg; pmmake.ico; } ^workpath(d:\program\pmmake\build); ^make(..\pmmake.exe,$Link, 0) { ..\dialogs\pmmake.res; about.obj; backup.obj; cmdline.obj; debug.obj; dialog.obj; fileio.obj; help.obj; message.obj; mkparse.obj; pmmake.obj; runcmd.obj; ..\pmmake.def; } ^workpath(d:\program\pmmake\ipfhelp); ^make(pmmake.hlp, $Help, 0) { pmmake.ipf; } There is a complete copy of the makefile and includefile for PM Make supplied. In addition to the above, this contains menu's for a number of options, conditional makes etc. You may use these files for the basis of your own project. ═══ 11.3. PM Make Include file ═══ This example is a working include file for PM Make. It sets up a number of menu's and variables. Though rather complex, it shows what can be achieved. If you own IBM's VisualAge** or C Set++** this will help get you started. Note: **(c)IBM. Registered trademarks of International Business Machines Corporation. " ***************************************************************************** * ICC Make Include File * * (c) Peter Koller 1995 * * ICC, ILINK, RC, IPFC, etc. are all (c)IBM. ******************************************************************************" "********************* Generic Menu's ******************************" ^vars() { FALSE = 0; TRUE = 1; MENU_GENERAL_ID = 100; ERREXIT_ID = 101; MENU_COMP_ID = 200; LIST_ID = 201; DEBG_ID = 202; OPT_ID = 203; FINT_ID = 204; FFLT_ID = 205; MLIB_ID = 206; DYNA_ID = 207; DLL_ID = 208; MENU_LINK_ID = 300; L_EXEP_ID = 301; L_MAP_ID = 302; L_OPTL_ID = 303; } ^menu($MENU_GENERAL_ID,"General Options") { ($ERREXIT_ID, "Exit on Error", $TRUE); } ^menu($MENU_COMP_ID,"Compiler Options") { ($LIST_ID, "Generate Listing", $FALSE); ($DEBG_ID, "Select Debug Mode", $FALSE); ($OPT_ID, "Optimize", $TRUE); ($FINT_ID,"Fast Integer Maths", $TRUE); ($FFLT_ID,"Fast Floating Point Maths", $TRUE); ($MLIB_ID,"Use Multithread Library", $TRUE); ($DYNA_ID, "Use Dynamic Linking", $FALSE); ($DLL_ID, "Make a DLL", $FALSE); } ^menu($MENU_LINK_ID,"Linker Options") { ($L_EXEP_ID,"Pack (compress) File",$TRUE); ($L_MAP_ID,"Create map file",$FALSE); ($L_OPTL_ID,"Remove unused functions",$TRUE); } ^vars() { C_GEN = "/C /Ss"; C_OPT = ^get($OPT_ID,"/O",); C_INT = ^get($FINT_ID,"/Gi",); C_FLT = ^get($FFLT_ID,"/Gf",); C_LIB = ^get($MLIB_ID,"/Gm",); C_DBG = ^get($DEBG_ID,"/Ti",); C_LST = ^get($LIST_ID,"/L",); C_DYN = ^get($DYNA_ID,"/Gd",); C_DLL = ^get($DLL_ID,"/Ge-",); L_OPT = ^get($L_OPTL_ID,"/optf",); L_MAP = ^get($L_MAP_ID,"/m",); L_EXP = ^get($L_EXEP_ID,"/e",); L_DBG = ^get($DEBG_ID,"/de /db",); L_DLL = ^get($DLL_ID,"/dll","/exec"); L_GEN = "/BASE:65536 /ALIGN:16"; L_LIB = ^get($MLIB_ID,"cppom30.lib","cppos30.lib"); ERR_LEV = ^get($ERREXIT_ID,"@if errorlevel 1 exit",); } ^actions() { Compile = @echo ппп @echo ооо Compiling $*.c ппп @echo ппп icc /Fo$*.obj $C_GEN $C_OPT $C_INT $C_FLT $C_LIB $C_DBG $C_LST $C_DYN $C_DLL $*.c $ERR_LEV ; Link = @echo ппп @echo ооо Building $*.exe ппп @echo ппп ilink /out:$*.exe $L_GEN $L_OPT $L_MAP $L_EXP $L_DBG $L_DLL $*.obj $L_LIB $*.def $ERR_LEV rc $*.res $*.exe $ERR_LEV ; Resource = @echo ппп @echo ооо Running resource compiler on $*.rc ппп @echo ппп rc -r -x $*.rc $ERR_LEV ; Help = @echo ппп @echo ооо Building $*.hlp ппп @echo ппп ipfc $*.ipf $ERR_LEV ; } ═══ 12. Makefile function syntax ═══ This chapter gives the syntax definition of each function.  ^actions()  ^filepath()  ^files()  ^get()  ^make()  ^menu()  ^out()  ^projectroot()  ^vars()  ^workpath() ═══ 12.1. ^actions() ═══ Syntax ^actions() { action = Text or "Text" ^get(..,..,..){} $Variable $*.ext; } Action text may contain.-  Variables in the form $Variable  The ^get() function if not terminated in ; ...unless the last item.  $*. filename substitution variables. These are not normal filename wildcards but '$*.' followed by a file extention with NO OTHER wildcards Action text may not contain.-  Semicolon ; unless in quotes or to terminate.  Other Actions  Functions other that ^get() Action names must be unique and not be substrings of other actions or variables. The action function is run on makefile load. The action text is not evaluated by this function and may contain undeclared variables. Actions are only used by ^make(). $*. substitution on making.- if more that one match is found eg a.obj, and b.obj.- '$*.obj' will become 'a.obj b.obj'. ^actions() { QuickCompilation = icc $*.c; } ═══ 12.2. ^filepath() ═══ Syntax ^filepath(path); The first time you use ^filepath(), ^workpath(), or ^projectroot() it should contain a fully unqualified path such as c:\path\mypath. All these functions set the workpath of PM Make. Unlike ^workpath(), ^filepath() does not output change directory information to the make batch file. ^filepath(..\docs); ═══ 12.3. ^files() ═══ Syntax ^files() { filename; filename; etc...; } ^files() is used to declare files such as documents and the makefile itself. Used for backup and restore. Often used in conjunction with ^filepath(). Alternatively the full filename and path can be used. ═══ 12.4. ^get() ═══ Syntax ^get(ItemID,"true","false"); ...or {} ^get() may contain ^get() or $Variable. ^get() will return a value according to the ButtonCheckstate of the menuitem ItemID. (see ^menu) Test your knowledge of Boolean algebra by using ^get() within ^get().  Anding two ^get()'s ^get(Item_one_id,^get(Item_two_id,"true","not true"){},"not true");  Oring two ^get()'s ^get(Item_one_id,"true",^get(Item_two_id,"true","not true"){}); ═══ 12.5. ^make() ═══ Syntax ^make(resultfilename, $Action, ForcedMakeFlag) { filename; filename; etc...; } ^make() may contain ^get() or $Variable. file names may contain paths, It is usual to declare a ^workpath() at least at the beginning of the makefile and then use short filenames (it's less typing). ^make() is run in order. You cannot link first and then compile. Usually you compile each object, and then build the resource file, the message file, and then link the lot at the end. After that, you can compile the help file, an entirely different project or subproject and so on. ═══ 12.6. ^menu() ═══ Syntax ^menu(MenuID, "Menu Title Text") { (ItemID, "First Item Text", ButtonCheckstate); (ItemID, "Second Item Text", ButtonCheckstate); (ItemID, "Third Item Text", ButtonCheckstate); (ItemID, "Fourth Item Text", ButtonCheckstate); } All ID's must be unique. ButtonCheckstate.- 0 = Not Checked; 1 = Checked. Used to build a user menu. You may use variable substitution and ^get() but beware that such expressions are evaluated and must be valid. ═══ 12.7. ^out() ═══ Syntax ^out() { Text } Used to output text to a make batchfile. Text may contain ^get(); or $vars or quoted strings "hello". Semicolons ; are output. Leading whitespace is stripped. All ^get()'s and $vars are evaluated. ═══ 12.8. ^projectroot() ═══ Syntax ^projectroot(path); The first time you use ^filepath(), ^workpath(), or ^projectroot() it should contain a fully unqualified path such as c:\path\mypath. All these functions set the workpath of PM Make. ^projectroot() is used specifically for backup and restore. You may only use this function once. ^projectroot() is used to create subdirectories in your backup. eg.- Assume projectroot is c:\projects\myproj and the backup path is A: c:\projects\myproj maps to A: c:\projects\myproj\csource maps to A:\csource c:\projects\myproj\docs maps to A:\docs c:\icons\myicons maps to A: ═══ 12.9. ^vars() ═══ Syntax ^vars() { Variable = Text or "Text" ^get(..,..,..){} $Variable; } Variable text may contain.-  Other variables in the form $Variable  The ^get() function if not terminated in ; ...unless the last item. Variable text may not contain.-  Semicolon ; unless in quotes or to terminate.  Other Actions  Functions other that ^get() Variable names must be unique and not be substrings of other actions or variables. The vars function is run on makefile load. The variable text is not evaluated by this function and may contain undeclared variables. If variables are used for the menu function they must be declared before the menu function, as this function will evaluate the variable. The menu function is run on makefile load. ═══ 12.10. ^workpath() ═══ Syntax ^workpath(path); The first time you use ^filepath(), ^workpath(), or ^projectroot() it should contain a fully unqualified path such as c:\path\mypath. All these functions set the workpath of PM Make. Unlike ^filepath(), ^workpath() outputs change directory information to the make batch file. ^workpath() is usually called just before a ^make() eg.- ^workpath(c:\project\csource); ^make(..\build\myprog.obj, $Compile, 0) { myproj.cpp } ═══ 12.11. General syntax ═══ Generic function ^function(){} or ^function(); There is no standard for arguments in curly{} brackets. In round() brackets each argument is single and separated from its neighbor by a comma (whitespace is ignored). ^function(argument1, argument2, argument3){} Quoted strings "This is a quoted string" " This is also a quoted string. Quoted strings are often used outside functions to make comments. " Quoted strings can be used in functions to denote text that is not evaluated ^vars() { Message = "Hello World!"; } ^out() { "$Message = "$Message } This example outputs.- $Message = Hello World! Comments Anything outside a function is a comment. All functions start with a caret '^'. You can use quotation marks ".." to comment out unwanted functions. You do not need to put comments in quotes, but it may nevertheless be a good idea. Beware that it is very easy to forget a quote and very hard to debug as the whole file can be inadvertently commented out. PM Make will stop at the last unmatched quote, not necessarily where the error is.