diff options
author | Rüdiger Timm <rt@openoffice.org> | 2004-09-08 15:07:52 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2004-09-08 15:07:52 +0000 |
commit | e2c8c66d6b23ce6cf971d66311c65473e33bc5e1 (patch) | |
tree | 3cc0d99978c10f5988e3060e3131070ba1a85549 /dmake/man | |
parent | 057199f55f9bb5acca3081c3f0f43963c4cd0445 (diff) |
INTEGRATION: CWS ooo20040704 (1.1.1.1.120); FILE MERGED
2004/07/11 15:15:17 vq 1.1.1.1.120.1: #i31255#, #i17992# Update the documentation of dmake to the new features.
Diffstat (limited to 'dmake/man')
-rw-r--r-- | dmake/man/dmake.nc | 4173 |
1 files changed, 1856 insertions, 2317 deletions
diff --git a/dmake/man/dmake.nc b/dmake/man/dmake.nc index ea3c579a2881..be64ec933bd3 100644 --- a/dmake/man/dmake.nc +++ b/dmake/man/dmake.nc @@ -1,349 +1,304 @@ -DMAKE(p) Unsupported Free Software DMAKE(p) +DMAKE(1) DMAKE(1) NAME dmake - maintain program groups, or interdependent files SYNOPSIS - dmake [-P#] [-{f|C|K} file] [-{w|W} target ...] - [macro[[!][*][+][:]]=value ...] [-v{cdfimtw}] - [-ABcdeEghiknpqrsStTuVxX] [target ...] + dmake [-P#] [-{f|C|K} file] [-{w|W} target ...] + [macro[[!][*][+][:]]=value ...] [-v{cdfimrtw}] [-ABcdeEghiknpqrsSt- + TuVxX] [target ...] DESCRIPTION - dmake is a re-implementation of the UNIX Make utility with - significant enhancements. dmake executes commands found - in an external file called a makefile to update one or - more target names. Each target may depend on zero or more - prerequisite targets. If any of the target's prerequi- - sites is newer than the target or if the target itself - does not exist, then dmake will attempt to make the tar- - get. - - If no -f command line option is present then dmake - searches for an existing makefile from the list of prereq- - uisites specified for the special target .MAKEFILES (see - the STARTUP section for more details). If "-" is the name - of the file specified to the -f flag then dmake uses stan- - dard input as the source of the makefile text. - - Any macro definitions (arguments with embedded "=" signs) - that appear on the command line are processed first and - supercede definitions for macros of the same name found - within the makefile. In general it is impossible for def- - initions found inside the makefile to redefine a macro - defined on the command line, see the MACROS section for - exceptions. - - If no target names are specified on the command line, then - dmake uses the first non-special target found in the make- - file as the default target. See the SPECIAL TARGETS sec- - tion for the list of special targets and their function. - Makefiles written for most previous versions of Make will - be handled correctly by dmake. Known differences between - dmake and other versions of make are discussed in the COM- - PATIBILITY section found at the end of this document. - dmake returns 0 if no errors were detected and a non-zero - result if an error occurred. + dmake is a re-implementation of the UNIX Make utility with significant + enhancements. dmake executes commands found in an external file called + a makefile to update one or more target names. Each target may depend + on zero or more prerequisite targets. If any of the target's prerequi- + sites is newer than the target or if the target itself does not exist, + then dmake will attempt to make the target. + + If no -f command line option is present then dmake searches for an + existing makefile from the list of prerequisites specified for the spe- + cial target .MAKEFILES (see the STARTUP section for more details). If + "-" is the name of the file specified to the -f flag then dmake uses + standard input as the source of the makefile text. + + Any macro definitions (arguments with embedded "=" signs) that appear + on the command line are processed first and supercede definitions for + macros of the same name found within the makefile. In general it is + impossible for definitions found inside the makefile to redefine a + macro defined on the command line, see the MACROS section for excep- + tions. + + If no target names are specified on the command line, then dmake uses + the first non-special target found in the makefile as the default tar- + get. See the SPECIAL TARGETS section for the list of special targets + and their function. Makefiles written for most previous versions of + Make will be handled correctly by dmake. Known differences between + dmake and other versions of make are discussed in the COMPATIBILITY + section found at the end of this document. dmake returns 0 if no + errors were detected and a non-zero result if an error occurred. OPTIONS - -A Enable AUGMAKE special inference rule transforma- - tions (see the "PERCENT(%) RULES" section), these - are set to off by default. + -A Enable AUGMAKE special inference rule transformations (see the + "PERCENT(%) RULES" section), these are set to off by default. - -B Enable the use of spaces instead of <tabs> to begin - recipe lines. This flag equivalent to the .NOTABS - special macro and is further described below. + -B Enable the use of spaces instead of <tabs> to begin recipe + lines. This flag equivalent to the .NOTABS special macro and is + further described below. - -c Use non-standard comment stripping. If you specify + -c Use non-standard comment stripping. If you specify -c then + dmake will treat any # character as a start of comment character + wherever it may appear unless it is escaped by a \. + -C [+]file + This option writes to file a copy of standard output and stan- + dard error from any child processes and from the dmake process + itself. If you specify a + prior to the file name then the text -Version 4.01 PL0 UW 1 +Version 4.10 UW 1 -DMAKE(p) Unsupported Free Software DMAKE(p) +DMAKE(1) DMAKE(1) - -c then dmake will treat any # character as a start - of comment character wherever it may appear unless - it is escaped by a \. - -C [+]file - This option writes to file a copy of standard out- - put and standard error from any child processes and - from the dmake process itself. If you specify a + - prior to the file name then the text is appended to - the previous contents of file. This option is - active in the MSDOS implementation only and is - ignored by non-MSDOS versions of dmake. - - -d Disable the use of the directory cache. Normally - dmake caches directories as it checks file times- - tamps. Giving this flag is equivalent to the - .DIRCACHE attribute or macro being set to no. - - -E Read the environment and define all strings of the - form 'ENV-VAR=evalue' defined within as macros - whose name is ENV-VAR, and whose value is 'evalue'. - The environment is processed prior to processing - the user specified makefile thereby allowing defi- - nitions in the makefile to override definitions in - the environment. - - -e Same as -E, except that the environment is pro- - cessed after the user specified makefile has been - processed (thus definitions in the environment - override definitions in the makefile). The -e and - -E options are mutually exclusive. If both are - given the latter takes effect. + is appended to the previous contents of file. This option is + active in the MSDOS implementation only and is ignored by non- + MSDOS versions of dmake. + + -d Disable the use of the directory cache. Normally dmake caches + directories as it checks file timestamps. Giving this flag is + equivalent to the .DIRCACHE attribute or macro being set to no. + + -E Read the environment and define all strings of the form + 'ENV-VAR=evalue' defined within as macros whose name is ENV-VAR, + and whose value is 'evalue'. The environment is processed prior + to processing the user specified makefile thereby allowing defi- + nitions in the makefile to override definitions in the environ- + ment. + + -e Same as -E, except that the environment is processed after the + user specified makefile has been processed (thus definitions in + the environment override definitions in the makefile). The -e + and -E options are mutually exclusive. If both are given the + latter takes effect. -f file - Use file as the source for the makefile text. Only - one -f option is allowed. + Use file as the source for the makefile text. Only one -f + option is allowed. - -g Globally disable group recipe parsing, equivalent - to the .IGNOREGROUP attribute or macro being set to - yes at the start of the makefile. + -g Globally disable group recipe parsing, equivalent to the + .IGNOREGROUP attribute or macro being set to yes at the start of + the makefile. -h Print the command summary for dmake. - -i Tells dmake to ignore errors, and continue making - other targets. This is equivalent to the .IGNORE - attribute or macro. + -i Tells dmake to ignore errors, and continue making other targets. + This is equivalent to the .IGNORE attribute or macro. -K file - Turns on .KEEP_STATE state tracking and tells dmake - to use file as the state file. + Turns on .KEEP_STATE state tracking and tells dmake to use file + as the state file. + + -k Causes dmake to ignore errors caused by command execution and to + make all targets not depending on targets that could not be + made. Ordinarily dmake stops after a command returns a non-zero + status, specifying -k causes dmake to ignore the error and con- + tinue to make as much as possible. - -k Causes dmake to ignore errors caused by command - execution and to make all targets not depending on - targets that could not be made. Ordinarily dmake + -n Causes dmake to print out what it would have executed, but does + not actually execute the commands. A special check is made for + the string "$(MAKE)" inside a recipe line, if it is found, the + line is expanded and invoked, thereby enabling recursive makes + to give a full description of all that they will do. This check + is disabled inside group recipes. + -p Print out a version of the digested makefile in human readable + form. (useful for debugging, but cannot be re-read by dmake) -Version 4.01 PL0 UW 2 +Version 4.10 UW 2 -DMAKE(p) Unsupported Free Software DMAKE(p) - stops after a command returns a non-zero status, - specifying -k causes dmake to ignore the error and - continue to make as much as possible. +DMAKE(1) DMAKE(1) - -n Causes dmake to print out what it would have exe- - cuted, but does not actually execute the commands. - A special check is made for the string "$(MAKE)" - inside a recipe line, if it is found, the line is - expanded and invoked, thereby enabling recursive - makes to give a full description of all that they - will do. This check is disabled inside group - recipes. - -p Print out a version of the digested makefile in - human readable form. (useful for debugging, but - cannot be re-read by dmake) + -P# On systems that support multi-processing cause dmake to use # + concurrent child processes to make targets. See the "MULTI PRO- + CESSING" section for more information. - -P# On systems that support multi-processing cause - dmake to use # concurrent child processes to make - targets. See the "MULTI PROCESSING" section for - more information. + -q Check and see if the target is up to date. Exits with code 0 if + up to date, 1 otherwise. - -q Check and see if the target is up to date. Exits - with code 0 if up to date, 1 otherwise. + -r Tells dmake not to read the initial startup makefile, see + STARTUP section for more details. - -r Tells dmake not to read the initial startup make- - file, see STARTUP section for more details. + -s Tells dmake to do all its work silently and not echo the com- + mands it is executing to stdout (also suppresses warnings). + This is equivalent to the .SILENT attribute or macro. - -s Tells dmake to do all its work silently and not - echo the commands it is executing to stdout (also - suppresses warnings). This is equivalent to the - .SILENT attribute or macro. + -S Force sequential execution of recipes on architectures which + support concurrent makes. For backward compatibility with old + makefiles that have nasty side-effect prerequisite dependencies. - -S Force sequential execution of recipes on architec- - tures which support concurrent makes. For backward - compatibility with old makefiles that have nasty - side-effect prerequisite dependencies. + -t Causes dmake to touch the targets and bring them up to date + without executing any commands. Note that targets will not be + created if they do not already exist. - -t Causes dmake to touch the targets and bring them up - to date without executing any commands. Note that - targets will not be created if they do not already - exist. + -T Tells dmake to not perform transitive closure on the inference + graph. - -T Tells dmake to not perform transitive closure on - the inference graph. + -u Force an unconditional update. (ie. do everything that would be + done if everything that a target depended on was out of date) - -u Force an unconditional update. (ie. do everything - that would be done if everything that a target - depended on was out of date) + -v[cdfimrtw] + Verbose flag, when making targets print to stdout what we are + going to make and what we think its time stamp is. The optional + flags [cdfimrtw] can be used to restrict the information that is + displayed. In the absence of any optional flags all are assumed + to be given (ie. -v is equivalent to -vdfimt). The meanings of + the optional flags are: - -v[dfimtw] - Verbose flag, when making targets print to stdout - what we are going to make and what we think its - time stamp is. The optional flags [dfimt] can be + c Notify of directory cache operations only. + d Notify of change directory operations only. + f Notify of file I/O operations only. -Version 4.01 PL0 UW 3 + i Notify of inference algorithm operation only. + m Notify of target update operations only. + r Force output of recipe lines and warnings. This switch is + usefull when debugging makefiles that disable the output + using the @ sign for recipe lines or the .SILENT tar- + get/attribute. It also overrides the -s flag. + t Keep any temporary files created; normally they are auto- + matically deleted. -DMAKE(p) Unsupported Free Software DMAKE(p) - used to restrict the information that is displayed. - In the absence of any optional flags all are - assumed to be given (ie. -v is equivalent to - -vdfimt). The meanings of the optional flags are: +Version 4.10 UW 3 - c Notify of directory cache operations only. - d Notify of change directory operations only. - f Notify of file I/O operations only. - i Notify of inference algorithm operation - only. - m Notify of target update operations only. +DMAKE(1) DMAKE(1) - t Keep any temporary files created; normally - they are automatically deleted. - w Notify of non-essential warnings (these are - historical). + w Notify of non-essential warnings (these are historical). - -V Print the version of dmake, and values of builtin - macros. + -V Print the version of dmake, and values of builtin macros. -W target Run dmake pretending that target is out of date. -w target - What if? Show what would be made if target were out - of date. + What if? Show what would be made if target were out of date. - -x Upon processing the user makefile export all non- - internally defined macros to the user's environ- - ment. This option together with the -e option - allows SYSV AUGMAKE recursive makes to function as - expected. + -x Upon processing the user makefile export all non-internally + defined macros to the user's environment. This option together + with the -e option allows SYSV AUGMAKE recursive makes to func- + tion as expected. - -X Inhibit the execution of #! lines found at the - beginning of a makefile. The use of this flag pre- - vents non-termination of recursive make invoca- - tions. + -X Inhibit the execution of #! lines found at the beginning of a + makefile. The use of this flag prevents non-termination of + recursive make invocations. INDEX - Here is a list of the sections that follow and a short - description of each. Perhaps you won't have to read the - entire man page to find what you need. + Here is a list of the sections that follow and a short description of + each. Perhaps you won't have to read the entire man page to find what + you need. STARTUP Describes dmake initialization. - SYNTAX Describes the syntax of makefile - expressions. + SYNTAX Describes the syntax of makefile expressions. - ATTRIBUTES Describes the notion of attributes and - - - -Version 4.01 PL0 UW 4 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) - - - how they are used when making targets. + ATTRIBUTES Describes the notion of attributes and how they are + used when making targets. MACROS Defining and expanding macros. - RULES AND TARGETS How to define targets and their prereq- - uisites. + RULES AND TARGETS How to define targets and their prerequisites. RECIPES How to tell dmake how to make a target. - TEXT DIVERSIONS How to use text diversions in recipes - and macro expansions. + TEXT DIVERSIONS How to use text diversions in recipes and macro + expansions. SPECIAL TARGETS Some targets are special. - SPECIAL MACROS Macros used by dmake to alter the pro- - cessing of the makefile, and those - defined by dmake for the user. + SPECIAL MACROS Macros used by dmake to alter the processing of the + makefile, and those defined by dmake for the user. - CONTROL MACROS Itemized list of special control - macros. + CONTROL MACROS Itemized list of special control macros. - RUNTIME MACROS Discussion of special run-time macros - such as $@ and $<. + RUNTIME MACROS Discussion of special run-time macros such as $@ and + $<. - FUNCTION MACROS GNU style function macros, only $(mktmp - ...) for now. + FUNCTION MACROS GNU style function macros, only $(mktmp ...) for + now. CONDITIONAL MACROS Target specific conditional macros. - DYNAMIC PREREQUISITES - Processing of prerequisites which con- - tain macro expansions in their name. - BINDING TARGETS The rules that dmake uses to bind a - target to an existing file in the file - system. - PERCENT(%) RULES Specification of recipes to be used by - the inference algorithm. - MAKING INFERENCES The rules that dmake uses when infer- - ring how to make a target which has no - explicit recipe. This and the previous - section are really a single section in - the text. +Version 4.10 UW 4 - MAKING TARGETS How dmake makes targets other than - libraries. - MAKING LIBRARIES How dmake makes libraries. - KEEP STATE A discussion of how .KEEP_STATE works. - MULTI PROCESSING Discussion of dmake's parallel make +DMAKE(1) DMAKE(1) -Version 4.01 PL0 UW 5 + DYNAMIC PREREQUISITES + Processing of prerequisites which contain macro + expansions in their name. + BINDING TARGETS The rules that dmake uses to bind a target to an + existing file in the file system. + PERCENT(%) RULES Specification of recipes to be used by the inference + algorithm. + MAKING INFERENCES The rules that dmake uses when inferring how to make + a target which has no explicit recipe. This and the + previous section are really a single section in the + text. + MAKING TARGETS How dmake makes targets other than libraries. -DMAKE(p) Unsupported Free Software DMAKE(p) + MAKING LIBRARIES How dmake makes libraries. + KEEP STATE A discussion of how .KEEP_STATE works. - facilities for architectures that sup- - port them. + MULTI PROCESSING Discussion of dmake's parallel make facilities for + architectures that support them. - CONDITIONALS Conditional expressions which control - the processing of the makefile. + CONDITIONALS Conditional expressions which control the processing + of the makefile. EXAMPLES Some hopefully useful examples. - COMPATIBILITY How dmake compares with previous ver- - sions of make. + COMPATIBILITY How dmake compares with previous versions of make. LIMITS Limitations of dmake. @@ -351,141 +306,133 @@ DMAKE(p) Unsupported Free Software DMAKE(p) FILES Files used by dmake. - SEE ALSO Other related programs, and man pages. + SEE ALSO Other related programs, and man pages. AUTHOR The guy responsible for this thing. BUGS Hope not. STARTUP - When dmake begins execution it first processes the command - line and then processes an initial startup-makefile. This - is followed by an attempt to locate and process a user - supplied makefile. The startup file defines the default - values of all required control macros and the set of - default rules for making targets and inferences. When - searching for the startup makefile, dmake searches the - following locations, in the order specified, until a - startup file is located: + When dmake begins execution it first processes the command line and + then processes an initial startup-makefile. This is followed by an + attempt to locate and process a user supplied makefile. The startup + file defines the default values of all required control macros and the + set of default rules for making targets and inferences. When searching + for the startup makefile, dmake searches the following locations, in + the order specified, until a startup file is located: - 1. The location given as the value of the macro - MAKESTARTUP defined on the command line. + 1. The location given as the value of the macro MAKESTARTUP + defined on the command line. - 2. The location given as the value of the envi- - ronment variable MAKESTARTUP defined in the - current environment. - 3. The location given as the value of the macro - MAKESTARTUP defined internally within dmake. - The above search is disabled by specifying the -r option - on the command line. An error is issued if a startup - makefile cannot be found and the -r option was not speci- - fied. A user may substitute a custom startup file by - defining the MAKESTARTUP environment variable or by - redefining the MAKESTARTUP macro on the command line. To - determine where dmake looks for the default startup file, - check your environment or issue the command "dmake -V". +Version 4.10 UW 5 -Version 4.01 PL0 UW 6 +DMAKE(1) DMAKE(1) + 2. The location given as the value of the environment vari- + able MAKESTARTUP defined in the current environment. + 3. The location given as the value of the macro MAKESTARTUP + defined internally within dmake. In this version, the + internal definition of MAKESTARTUP is "$(DMAKE- + ROOT)/startup.mk", so you can set the environment vari- + able DMAKEROOT to the location of your startup directory. -DMAKE(p) Unsupported Free Software DMAKE(p) + The above search is disabled by specifying the -r option on the command + line. An error is issued if a startup makefile cannot be found and the + -r option was not specified. A user may substitute a custom startup + file by defining the MAKESTARTUP environment variable or by redefining + the MAKESTARTUP macro on the command line. To determine where dmake + looks for the default startup file, check your environment or issue the + command "dmake -V". - - A similar search is performed to locate a default user - makefile when no -f command line option is specified. By - default, the prerequisite list of the special target - .MAKEFILES specifies the names of possible makefiles and - the search order that dmake should use to determine if one + A similar search is performed to locate a default user makefile when no + -f command line option is specified. By default, the prerequisite list + of the special target .MAKEFILES specifies the names of possible make- + files and the search order that dmake should use to determine if one exists. A typical definition for this target is: .MAKEFILES : makefile.mk Makefile makefile - dmake will first look for makefile.mk and then the others. - If a prerequisite cannot be found dmake will try to make - it before going on to the next prerequisite. For example, - makefile.mk can be checked out of an RCS file if the - proper rules for doing so are defined in the startup file. + dmake will first look for makefile.mk and then the others. If a pre- + requisite cannot be found dmake will try to make it before going on to + the next prerequisite. For example, makefile.mk can be checked out of + an RCS file if the proper rules for doing so are defined in the startup + file. If the first line of the user makefile is of the form: - then dmake will expand and run the command prior to read- - ing any additional input. If the return code of the com- - mand is zero then dmake will continue on to process the - remainder of the user makefile, if the return code is non- - zero then dmake will exit. - - dmake builds the internal dependency graph as it parses a - user specified makefile. The graph is rooted at the spe- - cial target .ROOT. .ROOT is the top level target that - dmake builds when it starts to build targets. All user - specified targets (those from the command line or taken as - defaults from the makefile) are made prerequisites of the - special target .TARGETS. dmake by default creates the - relationship that .ROOT depends on .TARGETS and as a - result everything is made. This approach allows the user - to customize, within their makefile, the order and which, - target, is built first. For example the default makefiles - come with settings for .ROOT that specify: - - .ROOT .PHONY .NOSTATE .SEQUENTIAL : .INIT .TARGETS - .DONE + then dmake will expand and run the command prior to reading any addi- + tional input. If the return code of the command is zero then dmake + will continue on to process the remainder of the user makefile, if the + return code is non-zero then dmake will exit. + + dmake builds the internal dependency graph as it parses a user speci- + fied makefile. The graph is rooted at the special target .ROOT. .ROOT + is the top level target that dmake builds when it starts to build tar- + gets. All user specified targets (those from the command line or taken + as defaults from the makefile) are made prerequisites of the special + target .TARGETS. dmake by default creates the relationship that .ROOT + depends on .TARGETS and as a result everything is made. This approach + allows the user to customize, within their makefile, the order and + which, target, is built first. For example the default makefiles come + with settings for .ROOT that specify: + + .ROOT .PHONY .NOSTATE .SEQUENTIAL : .INIT .TARGETS .DONE with .INIT and .DONE defined as: .INIT .DONE .PHONY:; - which nicely emulates the behaviour of Sun's make exten- - sions. The building of .ROOT's prerequisites is always - forced to be sequential. However, this definition is - trivially chaned by supplying the definition: - .ROOT : .TARGETS - - which skips the preamble and postamble phases of building - .TARGETS. +Version 4.10 UW 6 -Version 4.01 PL0 UW 7 +DMAKE(1) DMAKE(1) + which nicely emulates the behaviour of Sun's make extensions. The + building of .ROOT's prerequisites is always forced to be sequential. + However, this definition is trivially chaned by supplying the defini- + tion: -DMAKE(p) Unsupported Free Software DMAKE(p) + .ROOT : .TARGETS + which skips the preamble and postamble phases of building .TARGETS. SYNTAX - This section is a summary of the syntax of makefile state- - ments. The description is given in a style similar to - BNF, where { } enclose items that may appear zero or more - times, and [ ] enclose items that are optional. Alterna- - tive productions for a left hand side are indicated by - '->', and newlines are significant. All symbols in bold - type are text or names representing text supplied by the - user. + This section is a summary of the syntax of makefile statements. The + description is given in a style similar to BNF, where { } enclose items + that may appear zero or more times, and [ ] enclose items that are + optional. Alternative productions for a left hand side are indicated + by '->', and newlines are significant. All symbols in bold type are + text or names representing text supplied by the user. + Makefile -> { Statement } + Statement -> Macro-Definition -> Conditional-Macro-Definition -> Conditional -> Rule-Definition -> Attribute-Definition + Macro-Definition -> MACRO = LINE -> MACRO [!]*= LINE -> MACRO [!]:= LINE @@ -493,8 +440,10 @@ SYNTAX -> MACRO [!]+= LINE -> MACRO [!]+:= LINE + Conditional-Macro-Definition -> TARGET ?= Macro-Definition + Conditional -> .IF expression Makefile [ .ELIF expression @@ -503,52 +452,69 @@ SYNTAX Makefile ] .END + expression -> LINE -> STRING == LINE -> STRING != LINE + -> STRING <= LINE + -> STRING >= LINE + + + +Version 4.10 UW 7 + + + + + +DMAKE(1) DMAKE(1) + + + -> ( expression ) + -> expression || expression + -> expression && expression + Rule-Definition -> target-definition [ recipe ] target-definition -> targets [attrs] op { PREREQUISITE } [; rcp-line] + targets -> target { targets } -> "target" { targets } + target -> special-target -> TARGET + attrs -> attribute { attrs } -> "attribute" { attrs } - -Version 4.01 PL0 UW 8 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) - - op -> : { modifier } + modifier -> : -> ^ -> ! -> - -> | + recipe -> { TAB rcp-line } -> [@][%][-] [ { LINE } ] + rcp-line -> [@][%][-][+] LINE + Attribute-Definition -> attrs : targets + attribute -> .EPILOG -> .ERRREMOVE -> .EXECUTE @@ -559,6 +525,18 @@ DMAKE(p) Unsupported Free Software DMAKE(p) -> .MKSARGS -> .NOINFER -> .NOSTATE + + + +Version 4.10 UW 8 + + + + + +DMAKE(1) DMAKE(1) + + -> .PHONY -> .PRECIOUS -> .PROLOG @@ -570,6 +548,7 @@ DMAKE(p) Unsupported Free Software DMAKE(p) -> .SYMBOL -> .UPDATEALL + special-target -> .ERROR -> .EXIT -> .EXPORT @@ -585,426 +564,345 @@ DMAKE(p) Unsupported Free Software DMAKE(p) -> .suffix1.suffix2 - Where, TAB represents a <tab> character, STRING represents - - - -Version 4.01 PL0 UW 9 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) - - - an arbitrary sequence of characters, and LINE represents a - possibly empty sequence of characters terminated by a non- - escaped (not immediately preceded by a backslash '\') new- - line character. MACRO, PREREQUISITE, and TARGET each rep- - resent a string of characters not including space or tab - which respectively form the name of a macro, prerequisite - or target. The name may itself be a macro expansion - expression. A LINE can be continued over several physical - lines by terminating it with a single backslash character. - Comments are initiated by the pound # character and extend - to the end of line. All comment text is discarded, a '#' - may be placed into the makefile text by escaping it with - '\' (ie. \# translates to # when it is parsed). An excep- - tion to this occurs when a # is seen inside a recipe line - that begins with a <tab> or is inside a group recipe. If - you specify the -c command line switch then this behavior - is disabled and dmake will treat all # characters as start - of comment indicators unless they are escaped by \. A set - of continued lines may be commented out by placing a sin- - gle # at the start of the first line. A continued line - cannot span more than one makefile. - - white space is defined to be any combination of <space>, - <tab>, and the sequence \<nl> when \<nl> is used to termi- - nate a LINE. When processing macro definition lines, any - amount of white space is allowed on either side of the - macro operator and white space is stripped from both - before and after the macro value string. The sequence - \<nl> is treated as white space during recipe expansion - and is deleted from the final recipe string. You must - escape the \<nl> with another \ in order to get a \ at the - end of a recipe line. The \<nl> sequence is deleted from - macro values when they are expanded. - - When processing target definition lines, the recipe for a - target must, in general, follow the first definition of - the target (See the RULES AND TARGETS section for an - exception), and the recipe may not span across multiple - makefiles. Any targets and prerequisites found on a tar- - get definition line are taken to be white space separated - tokens. The rule operator (op in SYNTAX section) is also - considered to be a token but does not require white space - to precede or follow it. Since the rule operator begins - with a `:', traditional versions of make do not allow the - `:' character to form a valid target name. dmake allows - `:' to be present in target/prerequisite names as long as - the entire target/prerequisite name is quoted. For exam- - ple: + Where, TAB represents a <tab> character, STRING represents an arbitrary + sequence of characters, and LINE represents a possibly empty sequence + of characters terminated by a non-escaped (not immediately preceded by + a backslash '\') new-line character. MACRO, PREREQUISITE, and TARGET + each represent a string of characters not including space or tab which + respectively form the name of a macro, prerequisite or target. The + name may itself be a macro expansion expression. A LINE can be contin- + ued over several physical lines by terminating it with a single back- + slash character. Comments are initiated by the pound # character and + extend to the end of line. All comment text is discarded, a '#' may be + placed into the makefile text by escaping it with '\' (ie. \# trans- + lates to # when it is parsed). An exception to this occurs when a # is + seen inside a recipe line that begins with a <tab> or is inside a group + recipe. If you specify the -c command line switch then this behavior + is disabled and dmake will treat all # characters as start of comment + indicators unless they are escaped by \. A set of continued lines may + be commented out by placing a single # at the start of the first line. + A continued line cannot span more than one makefile. - a:fred : test + white space is defined to be any combination of <space>, <tab>, and the + sequence \<nl> when \<nl> is used to terminate a LINE. When processing + macro definition lines, any amount of white space is allowed on either + side of the macro operator and white space is stripped from both before + and after the macro value string. The sequence \<nl> is treated as + white space during recipe expansion and is deleted from the final + recipe string. You must escape the \<nl> with another \ in order to + get a \ at the end of a recipe line. The \<nl> sequence is deleted + from macro values when they are expanded. - would be parsed as TARGET = a, PREREQUISITES={fred, :, - test}, which is not what was intended. To fix this you - must write: +Version 4.10 UW 9 -Version 4.01 PL0 UW 10 +DMAKE(1) DMAKE(1) -DMAKE(p) Unsupported Free Software DMAKE(p) + When processing target definition lines, the recipe for a target must, + in general, follow the first definition of the target (See the RULES + AND TARGETS section for an exception), and the recipe may not span + across multiple makefiles. Any targets and prerequisites found on a + target definition line are taken to be white space separated tokens. + The rule operator (op in SYNTAX section) is also considered to be a + token but does not require white space to precede or follow it. Since + the rule operator begins with a `:', traditional versions of make do + not allow the `:' character to form a valid target name. dmake allows + `:' to be present in target/prerequisite names as long as the entire + target/prerequisite name is quoted. For example: + + a:fred : test + + would be parsed as TARGET = a, PREREQUISITES={fred, :, test}, which is + not what was intended. To fix this you must write: "a:fred" : test - Which will be parsed as expected. Quoted target and pre- - requisite specifications may also contain white space - thereby allowing the use of complex function macro expres- - sions.. See the EXAMPLES section for how to apply " quot- - ing to a list of targets. + Which will be parsed as expected. Quoted target and prerequisite spec- + ifications may also contain white space thereby allowing the use of + complex function macro expressions.. See the EXAMPLES section for how + to apply " quoting to a list of targets. ATTRIBUTES - dmake defines several target attributes. Attributes may - be assigned to a single target, a group of targets, or to - all targets in the makefile. Attributes are used to mod- - ify dmake actions during target update. The recognized - attributes are: + dmake defines several target attributes. Attributes may be assigned to + a single target, a group of targets, or to all targets in the makefile. + Attributes are used to modify dmake actions during target update. The + recognized attributes are: - .EPILOG Insert shell epilog code when executing a - group recipe associated with any target having - this attribute set. + .EPILOG Insert shell epilog code when executing a group recipe + associated with any target having this attribute set. - .ERRREMOVE Always remove any target having this attribute - if an error is encountered while making them. - Setting this attribute overrides the .PRECIOUS - attribute. + .ERRREMOVE Always remove any target having this attribute if an error + is encountered while making them. Setting this attribute + overrides the .PRECIOUS attribute. - .EXECUTE If the -n flag was given then execute the - recipe associated with any target having this - attribute set. + .EXECUTE If the -n flag was given then execute the recipe associated + with any target having this attribute set. - .FIRST Used in conjunction with .INCLUDE. Terminates - the inclusion with the first successfully - included prerequisite. + .FIRST Used in conjunction with .INCLUDE. Terminates the inclu- + sion with the first successfully included prerequisite. - .GROUP Force execution of a target's recipe as a - group recipe. + .GROUP Force execution of a target's recipe as a group recipe. - .IGNORE Ignore an error when trying to make any target - with this attribute set. + .IGNORE Ignore an error when trying to make any target with this + attribute set. .IGNOREGROUP - Disable the special meaning of '[' to initiate - a group recipe. + Disable the special meaning of '[' to initiate a group + recipe. .LIBRARY Target is a library. - .MKSARGS If running in an MSDOS environment then use - MKS extended argument passing conventions to - pass arguments to commands. Non-MSDOS envi- - ronments ignore this attribute. - .NOINFER Any target with this attribute set will not be - subjected to transitive closure if it is - inferred as a prerequisite of a target whose - recipe and prerequisites are being inferred. +Version 4.10 UW 10 -Version 4.01 PL0 UW 11 +DMAKE(1) DMAKE(1) -DMAKE(p) Unsupported Free Software DMAKE(p) + .MKSARGS If running in an MSDOS environment then use MKS extended + argument passing conventions to pass arguments to commands. + Non-MSDOS environments ignore this attribute. - (i.e. the inference algorithm will not use any - prerequisite with this attribute set, as a - target) If specified as '.NOINFER:' (ie. with - no prerequisites or targets) then the effect - is equivalent to specifying -T on the command - line. + .NOINFER Any target with this attribute set will not be subjected to + transitive closure if it is inferred as a prerequisite of a + target whose recipe and prerequisites are being inferred. + (i.e. the inference algorithm will not use any prerequisite + with this attribute set, as a target) If specified as + '.NOINFER:' (ie. with no prerequisites or targets) then the + effect is equivalent to specifying -T on the command line. - .NOSTATE Any target with this attribute set will not - have command line flag information stored in - the state file if .KEEP_STATE has been - enabled. + .NOSTATE Any target with this attribute set will not have command + line flag information stored in the state file if + .KEEP_STATE has been enabled. - .PHONY Any target with this attribute set will have - its recipe executed each time the target is - made even if a file matching the target name - can be located. Any targets that have a - .PHONY attributed target as a prerequisite - will be made each time the .PHONY attributed - prerequisite is made. + .PHONY Any target with this attribute set will have its recipe + executed each time the target is made even if a file match- + ing the target name can be located. Any targets that have + a .PHONY attributed target as a prerequisite will be made + each time the .PHONY attributed prerequisite is made. - .PRECIOUS Do not remove associated target under any cir- - cumstances. Set by default for any targets - whose corresponding files exist in the file - system prior to the execution of dmake. + .PRECIOUS Do not remove associated target under any circumstances. + Set by default for any targets whose corresponding files + exist in the file system prior to the execution of dmake. - .PROLOG Insert shell prolog code when executing a - group recipe associated with any target having - this attribute set. + .PROLOG Insert shell prolog code when executing a group recipe + associated with any target having this attribute set. - .SEQUENTIAL Force a sequential make of the associated tar- - get's prerequisites. + .SEQUENTIAL Force a sequential make of the associated target's prereq- + uisites. - .SETDIR Change current working directory to specified - directory when making the associated target. - You must specify the directory at the time the - attribute is specified. To do this simply - give .SETDIR=path as the attribute. path is - expanded and the result is used as the value - of the directory to change to. If path con- - tains $$@ then the name of the target to be - built is used in computing the path to change - directory to. If path is surrounded by single - quotes then path is not expanded, and is used - literally as the directory name. If the path - contains any `:' characters then the entire - attribute string must be quoted using ". If a - target having this attribute set also has the - .IGNORE attribute set then if the change to - the specified directory fails it will be - ignored, and no error message will be issued. + .SETDIR Change current working directory to specified directory + when making the associated target. You must specify the + directory at the time the attribute is specified. To do + this simply give .SETDIR=path as the attribute. path is + expanded and the result is used as the value of the direc- + tory to change to. If path contains $$@ then the name of + the target to be built is used in computing the path to + change directory to. If path is surrounded by single + quotes then path is not expanded, and is used literally as + the directory name. If the path contains any `:' charac- + ters then the entire attribute string must be quoted using + ". If a target having this attribute set also has the + .IGNORE attribute set then if the change to the specified + directory fails it will be ignored, and no error message + will be issued. - .SILENT Do not echo the recipe lines when making any - target with this attribute set, and do not - issue any warnings. + .SILENT Do not echo the recipe lines when making any target with + this attribute set, and do not issue any warnings. + .SWAP Under MSDOS when making a target with this attribute set + swap the dmake executable to disk prior to executing the + recipe line. Also see the '%' recipe line flag defined in + the RECIPES section. -Version 4.01 PL0 UW 12 +Version 4.10 UW 11 -DMAKE(p) Unsupported Free Software DMAKE(p) +DMAKE(1) DMAKE(1) - .SWAP Under MSDOS when making a target with this - attribute set swap the dmake executable to - disk prior to executing the recipe line. Also - see the '%' recipe line flag defined in the - RECIPES section. - .SYMBOL Target is a library member and is an entry - point into a module in the library. This - attribute is used only when searching a - library for a target. Targets of the form - lib((entry)) have this attribute set automati- - cally. + .SYMBOL Target is a library member and is an entry point into a + module in the library. This attribute is used only when + searching a library for a target. Targets of the form + lib((entry)) have this attribute set automatically. - .USESHELL Force each recipe line of a target to be exe- - cuted using a shell. Specifying this - attribute is equivalent to specifying the '+' - character at the start of each line of a non- + .USESHELL Force each recipe line of a target to be executed using a + shell. Specifying this attribute is equivalent to specify- + ing the '+' character at the start of each line of a non- group recipe. - .UPDATEALL Indicates that all the targets listed in this - rule are updated by the execution of the - accompanying recipe. A common example is the - production of the y.tab.c and y.tab.h files by - yacc when it is run on a grammar. Specifying - .UPDATEALL in such a rule prevents the running - of yacc twice, once for the y.tab.c file and - once for the y.tab.h file. .UPDATEALL targets - that are specified in a single rule are - treated as a single target and all timestamps - are updated whenever any target in the set is - made. As a side-effect, dmake internally - sorts such targets in ascending alphabetical - order and the value of $@ is always the first + .UPDATEALL Indicates that all the targets listed in this rule are + updated by the execution of the accompanying recipe. A + common example is the production of the y.tab.c and y.tab.h + files by yacc when it is run on a grammar. Specifying + .UPDATEALL in such a rule prevents the running of yacc + twice, once for the y.tab.c file and once for the y.tab.h + file. .UPDATEALL targets that are specified in a single + rule are treated as a single target and all timestamps are + updated whenever any target in the set is made. As a side- + effect, dmake internally sorts such targets in ascending + alphabetical order and the value of $@ is always the first target in the sorted set. - All attributes are user setable and except for .UPDATEALL, - .SETDIR and .MKSARGS may be used in one of two forms. The - .MKSARGS attribute is restricted to use as a global - attribute, and the use of the .UPDATEALL and .SETDIR - attributes is restricted to rules of the second form only. + All attributes are user setable and except for .UPDATEALL, .SETDIR and + .MKSARGS may be used in one of two forms. The .MKSARGS attribute is + restricted to use as a global attribute, and the use of the .UPDATEALL + and .SETDIR attributes is restricted to rules of the second form only. ATTRIBUTE_LIST : targets - assigns the attributes specified by ATTRIBUTE_LIST to each - target in targets or + assigns the attributes specified by ATTRIBUTE_LIST to each target in + targets or targets ATTRIBUTE_LIST : ... - assigns the attributes specified by ATTRIBUTE_LIST to each - target in targets. In the first form if targets is empty - (ie. a NULL list), then the list of attributes will apply - to all targets in the makefile (this is equivalent to the - common Make construct of ".IGNORE :" but has been modified - to the notion of an attribute instead of a special - - - -Version 4.01 PL0 UW 13 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) - - - target). Not all of the attributes have global meaning. - In particular, .LIBRARY, .NOSTATE, .PHONY, .SETDIR, .SYM- - BOL and .UPDATEALL have no assigned global meaning. - - Any attribute may be used with any target, even with the - special targets. Some combinations are useless (e.g. - .INCLUDE .PRECIOUS: ... ), while others are useful (e.g. - .INCLUDE .IGNORE : "file.mk" will not complain if file.mk - cannot be found using the include file search rules, see - the section on SPECIAL TARGETS for a description of - .INCLUDE). If a specified attribute will not be used with - the special target a warning is issued and the attribute - is ignored. + assigns the attributes specified by ATTRIBUTE_LIST to each target in + targets. In the first form if targets is empty (ie. a NULL list), then + the list of attributes will apply to all targets in the makefile (this + is equivalent to the common Make construct of ".IGNORE :" but has been + modified to the notion of an attribute instead of a special target). + Not all of the attributes have global meaning. In particular, + .LIBRARY, .NOSTATE, .PHONY, .SETDIR, .SYMBOL and .UPDATEALL have no + assigned global meaning. + + Any attribute may be used with any target, even with the special tar- + gets. Some combinations are useless (e.g. .INCLUDE .PRECIOUS: ... ), + while others are useful (e.g. .INCLUDE .IGNORE : "file.mk" will not + complain if file.mk cannot be found using the include file search + rules, see the section on SPECIAL TARGETS for a description of + .INCLUDE). If a specified attribute will not be used with the special + target a warning is issued and the attribute is ignored. MACROS dmake supports six forms of macro assignment. - MACRO = LINE This is the most common and familiar form - of macro assignment. It assigns LINE lit- - erally as the value of MACRO. Future - expansions of MACRO recursively expand its - value. - MACRO *= LINE This form behaves exactly as the simple - '=' form with the exception that if MACRO - already has a value then the assignment is - not performed. - MACRO := LINE This form differs from the simple '=' form - in that it expands LINE prior to assigning - it as the value of MACRO. Future expan- - sions of MACRO do not recursively expand - its value. +Version 4.10 UW 12 - MACRO *:= LINE This form behaves exactly as the ':=' form - with the exception that if MACRO already - has a value then the assignment and expan- - sion are not performed. - MACRO += LINE This form of macro assignment allows macro - values to grow. It takes the literal - value of LINE and appends it to the previ- - ous value of MACRO separating the two by a - single space. Future expansions of MACRO - recursively expand its value. - MACRO +:= LINE This form is similar to the '+=' form - except that the value of LINE is expanded - prior to being added to the value of - MACRO. - Macro expressions specified on the command line allow the - macro value to be redefined within the makefile only if +DMAKE(1) DMAKE(1) -Version 4.01 PL0 UW 14 + MACRO = LINE This is the most common and familiar form of macro + assignment. It assigns LINE literally as the value of + MACRO. Future expansions of MACRO recursively expand + its value. + MACRO *= LINE This form behaves exactly as the simple '=' form with + the exception that if MACRO already has a value then + the assignment is not performed. + MACRO := LINE This form differs from the simple '=' form in that it + expands LINE prior to assigning it as the value of + MACRO. Future expansions of MACRO do not recursively + expand its value. + MACRO *:= LINE This form behaves exactly as the ':=' form with the + exception that if MACRO already has a value then the + assignment and expansion are not performed. + MACRO += LINE This form of macro assignment allows macro values to + grow. It takes the literal value of LINE and appends + it to the previous value of MACRO separating the two by + a single space. Future expansions of MACRO recursively + expand its value. -DMAKE(p) Unsupported Free Software DMAKE(p) + MACRO +:= LINE This form is similar to the '+=' form except that the + value of LINE is expanded prior to being added to the + value of MACRO. + Macro expressions specified on the command line allow the macro value + to be redefined within the makefile only if the macro is defined using + the '+=' and '+:=' operators. Other operators will define a macro that + cannot be further modified. - the macro is defined using the '+=' and '+:=' operators. - Other operators will define a macro that cannot be further - modified. + Each of the preceeding macro assignment operators may be prefixed by ! + to indicate that the assignment should be forced and that no warnings + should be issued. Thus, specifying ! has the effect of silently forc- + ing the specified macro assignment. - Each of the preceeding macro assignment operators may be - prefixed by ! to indicate that the assignment should be - forced and that no warnings should be issued. Thus, spec- - ifying ! has the effect of silently forcing the specified - macro assignment. + When dmake defines a non-environment macro it strips leading and trail- + ing white space from the macro value. Macros imported from the envi- + ronment via either the .IMPORT special target (see the SPECIAL TARGETS + section), or the -e, or -E flags are an exception to this rule. Their + values are always taken literally and white space is never stripped. + In addition, named macros defined using the .IMPORT special target do + not have their values expanded when they are used within a makefile. + In contrast, environment macros that are imported due to the specifica- + tion of the -e or -E flags are subject to expansion when used. - When dmake defines a non-environment macro it strips lead- - ing and trailing white space from the macro value. Macros - imported from the environment via either the .IMPORT spe- - cial target (see the SPECIAL TARGETS section), or the -e, - or -E flags are an exception to this rule. Their values - are always taken literally and white space is never - stripped. In addition, named macros defined using the - .IMPORT special target do not have their values expanded - when they are used within a makefile. In contrast, envi- - ronment macros that are imported due to the specification - of the -e or -E flags are subject to expansion when used. + To specify a macro expansion enclose the name in () or {} and precede + it with a dollar sign $. Thus $(TEST) represents an expansion of the + macro variable named TEST. If TEST is defined then $(TEST) is replaced + by its expanded value. If TEST is not defined then $(TEST) expands to + the NULL string (this is equivalent to defining a macro as 'TEST=' ). + A short form may be used for single character named macros. In this + case the parentheses are optional, and $(I) is equivalent to $I. Macro - To specify a macro expansion enclose the name in () or {} - and precede it with a dollar sign $. Thus $(TEST) repre- - sents an expansion of the macro variable named TEST. If - TEST is defined then $(TEST) is replaced by its expanded - value. If TEST is not defined then $(TEST) expands to the - NULL string (this is equivalent to defining a macro as - 'TEST=' ). A short form may be used for single character - named macros. In this case the parentheses are optional, - and $(I) is equivalent to $I. Macro expansion is recur- - sive, hence, if the value string contains an expression - representing a macro expansion, the expansion is per- - formed. Circular macro expansions are detected and cause - an error to be issued. - When defining a macro the given macro name is first - expanded before being used to define the macro. Thus it - is possible to define macros whose names depend on values - of other macros. For example, suppose CWD is defined as - CWD = $(PWD:b) +Version 4.10 UW 13 - then the value of $(CWD) is the name of the current direc- - tory. This can be used to define macros specific to this - directory, for example: - _$(CWD).prt = list of files to print... - The actual name of the defined macro is a function of the - current directory. A construct such as this is useful - when processing a hierarchy of directories using .SETDIR - attributed targets and a collection of small distributed - makefile stubs. +DMAKE(1) DMAKE(1) -Version 4.01 PL0 UW 15 + expansion is recursive, hence, if the value string contains an expres- + sion representing a macro expansion, the expansion is performed. Cir- + cular macro expansions are detected and cause an error to be issued. + When defining a macro the given macro name is first expanded before + being used to define the macro. Thus it is possible to define macros + whose names depend on values of other macros. For example, suppose CWD + is defined as + CWD = $(PWD:b) + then the value of $(CWD) is the name of the current directory. This + can be used to define macros specific to this directory, for example: -DMAKE(p) Unsupported Free Software DMAKE(p) + _$(CWD).prt = list of files to print... + The actual name of the defined macro is a function of the current + directory. A construct such as this is useful when processing a hier- + archy of directories using .SETDIR attributed targets and a collection + of small distributed makefile stubs. - Macro variables may be defined within the makefile, on the - command line, or imported from the environment. + Macro variables may be defined within the makefile, on the command + line, or imported from the environment. - dmake supports several non-standard macro expansions: The - first is of the form: + dmake supports several non-standard macro expansions: The first is of + the form: $(macro_name:modifier_list:modifier_list:...) - where modifier_list is chosen from the set { B or b, D or - d, E or e, F or f, I or i, L or l, S or s, T or t, U or u, - ^, +, 1 } and + where modifier_list is chosen from the set { B or b, D or d, E or e, F + or f, I or i, L or l, S or s, T or t, U or u, ^, +, 1 } and b - file (not including suffix) portion of path names d - directory portion of all path names @@ -1021,8 +919,8 @@ DMAKE(p) Unsupported Free Software DMAKE(p) Thus if we have the example: test = d1/d2/d3/a.out f.out d1/k.out - The following macro expansions produce the values on the - right of '->' after expansion. + The following macro expansions produce the values on the right of '->' + after expansion. $(test:d) -> d1/d2/d3/ d1/ $(test:b) -> a f k @@ -1034,34 +932,30 @@ DMAKE(p) Unsupported Free Software DMAKE(p) $(test:u) -> D1/D2/D3/A.OUT F.OUT D1/K.OUT $(test:1) -> d1/d2/d3/a.out - If a token ends in a string composed from the value of the - macro DIRBRKSTR (ie. ends in a directory separator string, - e.g. '/' in UNIX) and you use the :d modifier then the - expansion returns the directory name less the final direc- - tory separator string. Thus successive pairs of :d modi- - fiers each remove a level of directory in the token - string. - The tokenization modifier takes all white space separated - tokens from the macro value and separates them by the - quoted separator string. The separator string may contain - the following escape codes \a => <bel>, \b => <backspace>, - \f => <formfeed>, \n => <nl>, \r => <cr>, \t => <tab>, \v - => <vertical tab>, \" => ", and \xxx => <xxx> where xxx is +Version 4.10 UW 14 -Version 4.01 PL0 UW 16 +DMAKE(1) DMAKE(1) -DMAKE(p) Unsupported Free Software DMAKE(p) + If a token ends in a string composed from the value of the macro + DIRBRKSTR (ie. ends in a directory separator string, e.g. '/' in UNIX) + and you use the :d modifier then the expansion returns the directory + name less the final directory separator string. Thus successive pairs + of :d modifiers each remove a level of directory in the token string. - the octal representation of a character. Thus the expan- - sion: + The tokenization modifier takes all white space separated tokens from + the macro value and separates them by the quoted separator string. The + separator string may contain the following escape codes \a => <bel>, \b + => <backspace>, \f => <formfeed>, \n => <nl>, \r => <cr>, \t => <tab>, + \v => <vertical tab>, \" => ", and \xxx => <xxx> where xxx is the octal + representation of a character. Thus the expansion: $(test:f:t"+\n") produces: @@ -1069,34 +963,32 @@ DMAKE(p) Unsupported Free Software DMAKE(p) f.out+ k.out - The prefix operator ^ takes all white space separated - tokens from the macro value and prepends string to each. + The prefix operator ^ takes all white space separated tokens from the + macro value and prepends string to each. $(test:f:^mydir/) produces: mydir/a.out mydir/f.out mydir/k.out - The suffix operator + takes all white space separated - tokens from the macro value and appends string to each. + The suffix operator + takes all white space separated tokens from the + macro value and appends string to each. $(test:b:+.c) produces: a.c f.c k.c - The next non-standard form of macro expansion allows for - recursive macros. It is possible to specify a - $(macro_name) or ${macro_name} expansion where macro_name - contains more $( ... ) or ${ ... } macro expansions - itself. - - For example $(CC$(_HOST)$(_COMPILER)) will first expand - CC$(_HOST)$(_COMPILER) to get a result and use that result - as the name of the macro to expand. This is useful for - writing a makefile for more than one target environment. - As an example consider the following hypothetical case. - Suppose that _HOST and _COMPILER are imported from the - environment and are set to represent the host machine type - and the host compiler respectively. + The next non-standard form of macro expansion allows for recursive + macros. It is possible to specify a $(macro_name) or ${macro_name} + expansion where macro_name contains more $( ... ) or ${ ... } macro + expansions itself. + + For example $(CC$(_HOST)$(_COMPILER)) will first expand + CC$(_HOST)$(_COMPILER) to get a result and use that result as the name + of the macro to expand. This is useful for writing a makefile for more + than one target environment. As an example consider the following + hypothetical case. Suppose that _HOST and _COMPILER are imported from + the environment and are set to represent the host machine type and the + host compiler respectively. CFLAGS_VAX_CC = -c -O # _HOST == "_VAX", _COMPILER == "_CC" CFLAGS_PC_MSC = -c -ML # _HOST == "_PC", _COMPILER == "_MSC" @@ -1105,32 +997,31 @@ DMAKE(p) Unsupported Free Software DMAKE(p) CFLAGS := $(CFLAGS$(_HOST)$(_COMPILER)) - This causes CFLAGS to take on a value that corresponds to - the environment in which the make is being invoked. + This causes CFLAGS to take on a value that corresponds to the environ- + ment in which the make is being invoked. The final non-standard macro expansion is of the form: string1{token_list}string2 - where string1, string2 and token_list are expanded. After - expansion, string1 is prepended to each token found in -Version 4.01 PL0 UW 17 +Version 4.10 UW 15 -DMAKE(p) Unsupported Free Software DMAKE(p) +DMAKE(1) DMAKE(1) - token_list and string2 is appended to each resulting token - from the previous prepend. string1 and string2 are not - delimited by white space whereas the tokens in token_list - are. A null token in the token list is specified using - "". Thus using another example we have: + where string1, string2 and token_list are expanded. After expansion, + string1 is prepended to each token found in token_list and string2 is + appended to each resulting token from the previous prepend. string1 + and string2 are not delimited by white space whereas the tokens in + token_list are. A null token in the token list is specified using "". + Thus using another example we have: test/{f1 f2}.o --> test/f1.o test/f2.o test/ {f1 f2}.o --> test/ f1.o f2.o @@ -1142,11 +1033,10 @@ DMAKE(p) Unsupported Free Software DMAKE(p) test/{d1 d2}/{f1 f2}.o --> test/d1/f1.o test/d1/f2.o test/d2/f1.o test/d2/f2.o - This last expansion is activated only when the first char- - acters of token_list appear immediately after the opening - '{' with no intervening white space. The reason for this - restriction is the following incompatibility with Bourne - Shell recipes. The line + This last expansion is activated only when the first characters of + token_list appear immediately after the opening '{' with no intervening + white space. The reason for this restriction is the following incom- + patibility with Bourne Shell recipes. The line { echo hello;} @@ -1154,82 +1044,74 @@ DMAKE(p) Unsupported Free Software DMAKE(p) {echo hello;} - is not. Hence the latter triggers the enhanced macro - expansion while the former causes it to be suppressed. - See the SPECIAL MACROS section for a description of the - special macros that dmake defines and understands. + is not. Hence the latter triggers the enhanced macro expansion while + the former causes it to be suppressed. See the SPECIAL MACROS section + for a description of the special macros that dmake defines and under- + stands. RULES AND TARGETS - A makefile contains a series of entries that specify - dependencies. Such entries are called target/prerequisite - or rule definitions. Each rule definition is optionally - followed by a set of lines that provide a recipe for - updating any targets defined by the rule. Whenever dmake - attempts to bring a target up to date and an explicit - recipe is provided with a rule defining the target, that - recipe is used to update the target. A rule definition - begins with a line having the following syntax: + A makefile contains a series of entries that specify dependencies. + Such entries are called target/prerequisite or rule definitions. Each + rule definition is optionally followed by a set of lines that provide a + recipe for updating any targets defined by the rule. Whenever dmake + attempts to bring a target up to date and an explicit recipe is pro- + vided with a rule defining the target, that recipe is used to update + the target. A rule definition begins with a line having the following + syntax: <targets> [<attributes>] <ruleop> [<prerequisites>] [;<recipe>] - targets is a non-empty list of targets. If the target is - a special target (see SPECIAL TARGETS section below) then - it must appear alone on the rule line. For example: + targets is a non-empty list of targets. If the target is a special + target (see SPECIAL TARGETS section below) then it must appear alone on + the rule line. For example: .IMPORT .ERROR : ... - is not allowed since both .IMPORT and .ERROR are special - targets. Special targets are not used in the construction - + is not allowed since both .IMPORT and .ERROR are special targets. Spe- + cial targets are not used in the construction of the dependency graph + and will not be made. + attributes is a possibly empty list of attributes. Any attribute + defined in the ATTRIBUTES section above may be specified. All + attributes will be applied to the list of named targets in the rule + definition. No other targets will be affected. -Version 4.01 PL0 UW 18 +Version 4.10 UW 16 -DMAKE(p) Unsupported Free Software DMAKE(p) - of the dependency graph and will not be made. - attributes is a possibly empty list of attributes. Any - attribute defined in the ATTRIBUTES section above may be - specified. All attributes will be applied to the list of - named targets in the rule definition. No other targets - will be affected. +DMAKE(1) DMAKE(1) - NOTE: As stated earlier, if both the target list and - prerequisite list are empty but the attributes - list is not, then the specified attributes affect - all targets in the makefile. + NOTE: As stated earlier, if both the target list and prerequisite + list are empty but the attributes list is not, then the speci- + fied attributes affect all targets in the makefile. - ruleop is a separator which is used to identify the tar- - gets from the prerequisites. Optionally it also provides - a facility for modifying the way in which dmake handles - the making of the associated targets. In its simplest - form the operator is a single ':', and need not be sepa- - rated by white space from its neighboring tokens. It may - additionally be followed by any of the modifiers { !, ^, - -, :, | }, where: + ruleop is a separator which is used to identify the targets from the + prerequisites. Optionally it also provides a facility for modifying + the way in which dmake handles the making of the associated targets. + In its simplest form the operator is a single ':', and need not be sep- + arated by white space from its neighboring tokens. It may additionally + be followed by any of the modifiers { !, ^, -, :, | }, where: - ! says execute the recipe for the associated targets - once for each out of date prerequisite. Ordinarily - the recipe is executed once for all out of date - prerequisites at the same time. + ! says execute the recipe for the associated targets once for each + out of date prerequisite. Ordinarily the recipe is executed + once for all out of date prerequisites at the same time. - ^ says to insert the specified prerequisites, if any, - before any other prerequisites already associated - with the specified targets. In general, it is not - useful to specify ^ with an empty list of prerequi- - sites. + ^ says to insert the specified prerequisites, if any, before any + other prerequisites already associated with the specified tar- + gets. In general, it is not useful to specify ^ with an empty + list of prerequisites. - - says to clear the previous list of prerequisites - before adding the new prerequisites. Thus, + - says to clear the previous list of prerequisites before adding + the new prerequisites. Thus, .SUFFIXES : .SUFFIXES : .a .b @@ -1238,66 +1120,57 @@ DMAKE(p) Unsupported Free Software DMAKE(p) .SUFFIXES :- .a .b - however the old form still works as expected. - NOTE: .SUFFIXES is ignored by dmake it is used - here simply as an example. - - : When the rule operator is not modified by a second - ':' only one set of rules may be specified for mak- - ing a target. Multiple definitions may be used to - add to the list of prerequisites that a target + however the old form still works as expected. NOTE: .SUFFIXES + is ignored by dmake it is used here simply as an example. + + : When the rule operator is not modified by a second ':' only one + set of rules may be specified for making a target. Multiple + definitions may be used to add to the list of prerequisites that + a target depends on. However, if a target is multiply defined + only one definition may specify a recipe for making the target. + + When a target's rule operator is modified by a second ':' (:: + for example) then this definition may not be the only definition + with a recipe for the target. There may be other :: target def- + inition lines that specify a different set of prerequisites with + a different recipe for updating the target. Any such target is + made if any of the definitions find it to be out of date with + respect to the related prerequisites and the corresponding + recipe is used to update the target. By definition all '::' + recipes that are found to be out of date for are executed. + + In the following simple example, each rule has a `::' ruleop. + In such an operator we call the first `:' the operator, and the + second `:' the modifier. + a.o :: a.c b.h + first recipe for making a.o + a.o :: a.y b.h + second recipe for making a.o -Version 4.01 PL0 UW 19 +Version 4.10 UW 17 -DMAKE(p) Unsupported Free Software DMAKE(p) - depends on. However, if a target is multiply - defined only one definition may specify a recipe - for making the target. +DMAKE(1) DMAKE(1) - When a target's rule operator is modified by a sec- - ond ':' (:: for example) then this definition may - not be the only definition with a recipe for the - target. There may be other :: target definition - lines that specify a different set of prerequisites - with a different recipe for updating the target. - Any such target is made if any of the definitions - find it to be out of date with respect to the - related prerequisites and the corresponding recipe - is used to update the target. By definition all - '::' recipes that are found to be out of date for - are executed. - In the following simple example, each rule has a - `::' ruleop. In such an operator we call the first - `:' the operator, and the second `:' the modifier. + If a.o is found to be out of date with respect to a.c then the + first recipe is used to make a.o. If it is found out of date + with respect to a.y then the second recipe is used. If a.o is + out of date with respect to b.h then both recipes are invoked to + make a.o. In the last case the order of invocation corresponds + to the order in which the rule definitions appear in the make- + file. - a.o :: a.c b.h - first recipe for making a.o - - a.o :: a.y b.h - second recipe for making a.o - - If a.o is found to be out of date with respect to - a.c then the first recipe is used to make a.o. If - it is found out of date with respect to a.y then - the second recipe is used. If a.o is out of date - with respect to b.h then both recipes are invoked - to make a.o. In the last case the order of invoca- - tion corresponds to the order in which the rule - definitions appear in the makefile. - - | Is defined only for PERCENT rule target defini- - tions. When specified it indicates that the fol- - lowing construct should be parsed using the old - semantinc meaning: + | Is defined only for PERCENT rule target definitions. When spec- + ified it indicates that the following construct should be parsed + using the old semantinc meaning: %.o :| %.c %.r %.f ; some rule @@ -1307,30 +1180,16 @@ DMAKE(p) Unsupported Free Software DMAKE(p) %.o : %.r ; some rule %.o : %.f ; some rule - Targets defined using a single `:' operator with a recipe - may be redefined again with a new recipe by using a `:' - operator with a `:' modifier. This is equivalent to a - target having been initially defined with a rule using a - `:' modifier. Once a target is defined using a `:' - - - -Version 4.01 PL0 UW 20 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) - - - modifier it may not be defined again with a recipe using - only the `:' operator with no `:' modifier. In both cases - the use of a `:' modifier creates a new list of prerequi- - sites and makes it the current prerequisite list for the - target. The `:' operator with no recipe always modifies - the current list of prerequisites. Thus assuming each of - the following definitions has a recipe attached, then: + Targets defined using a single `:' operator with a recipe may be rede- + fined again with a new recipe by using a `:' operator with a `:' modi- + fier. This is equivalent to a target having been initially defined + with a rule using a `:' modifier. Once a target is defined using a `:' + modifier it may not be defined again with a recipe using only the `:' + operator with no `:' modifier. In both cases the use of a `:' modifier + creates a new list of prerequisites and makes it the current prerequi- + site list for the target. The `:' operator with no recipe always modi- + fies the current list of prerequisites. Thus assuming each of the fol- + lowing definitions has a recipe attached, then: joe : fred ... (1) joe :: more ... (2) @@ -1340,9 +1199,9 @@ DMAKE(p) Unsupported Free Software DMAKE(p) joe :: fred ... (3) joe :: more ... (4) - are legal and mean: add the recipe associated with (2), - or (4) to the set of recipes for joe, placing them after - existing recipes for making joe. The constructs: + are legal and mean: add the recipe associated with (2), or (4) to the + set of recipes for joe, placing them after existing recipes for making + joe. The constructs: joe :: fred ... (5) joe : more ... (6) @@ -1352,64 +1211,56 @@ DMAKE(p) Unsupported Free Software DMAKE(p) joe : fred ... (7) joe : more ... (8) - are errors since we have two sets of perfectly good - recipes for making the target. - - prerequisites is a possibly empty list of targets that - must be brought up to date before making the current tar- - get. - - recipe is a short form and allows the user to specify - short rule definitions on a single line. It is taken to - be the first recipe line in a larger recipe if additional - lines follow the rule definition. If the semi-colon is - present but the recipe line is empty (ie. null string) - then it is taken to be an empty rule. Any target so - defined causes the Don't know how to make ... error mes- - sage to be suppressed when dmake tries to make the target - and fails. This silence is maintained for rules that are - terminated by a semicolon and have no following recipe - lines, for targets listed on the command line, for the - first target found in the makefile, and for any target - having no recipe but containing a list of prerequisites - (see the COMPATIBILITY section for an exception to this - rule if the AUGMAKE (-A) flag was specified. + are errors since we have two sets of perfectly good recipes for making + the target. -RECIPES - The traditional format used by most versions of Make - defines the recipe lines as arbitrary strings that may + prerequisites is a possibly empty list of targets that must be brought + up to date before making the current target. + recipe is a short form and allows the user to specify short rule defi- + nitions on a single line. It is taken to be the first recipe line in a + larger recipe if additional lines follow the rule definition. If the -Version 4.01 PL0 UW 21 +Version 4.10 UW 18 -DMAKE(p) Unsupported Free Software DMAKE(p) +DMAKE(1) DMAKE(1) - contain macro expansions. They follow a rule definition - line and may be spaced apart by comment or blank lines. - The list of recipe lines defining the recipe is terminated - by a new target definition, a macro definition, or end-of- - file. Each recipe line MUST begin with a <TAB> character - which may optionally be followed with one or all of the - characters '@%+-'. The '-' indicates that non-zero exit - values (ie. errors) are to be ignored when this recipe - line is executed, the '+' indicates that the current - recipe line is to be executed using the shell, the '%' - indicates that dmake should swap itself out to secondary - storage (MSDOS only) before running the recipe and the '@' - indicates that the recipe line should NOT be echoed to the - terminal prior to being executed. Each switch is off by - default (ie. by default, errors are significant, commands - are echoed, no swapping is done and a shell is used only - if the recipe line contains a character found in the value - of the SHELLMETAS macro). Global settings activated via - command line options or special attribute or target names - may also affect these settings. An example recipe: + + semi-colon is present but the recipe line is empty (ie. null string) + then it is taken to be an empty rule. Any target so defined causes the + Don't know how to make ... error message to be suppressed when dmake + tries to make the target and fails. This silence is maintained for + rules that are terminated by a semicolon and have no following recipe + lines, for targets listed on the command line, for the first target + found in the makefile, and for any target having no recipe but contain- + ing a list of prerequisites (see the COMPATIBILITY section for an + exception to this rule if the AUGMAKE (-A) flag was specified. + +RECIPES + The traditional format used by most versions of Make defines the recipe + lines as arbitrary strings that may contain macro expansions. They + follow a rule definition line and may be spaced apart by comment or + blank lines. The list of recipe lines defining the recipe is termi- + nated by a new target definition, a macro definition, or end-of-file. + Each recipe line MUST begin with a <TAB> character which may optionally + be followed with one or all of the characters '@%+-'. The '-' indi- + cates that non-zero exit values (ie. errors) are to be ignored when + this recipe line is executed, the '+' indicates that the current recipe + line is to be executed using the shell, the '%' indicates that dmake + should swap itself out to secondary storage (MSDOS only) before running + the recipe and the '@' indicates that the recipe line should NOT be + echoed to the terminal prior to being executed. Each switch is off by + default (ie. by default, errors are significant, commands are echoed, + no swapping is done and a shell is used only if the recipe line con- + tains a character found in the value of the SHELLMETAS macro). Global + settings activated via command line options or special attribute or + target names may also affect these settings. An example recipe: target : first recipe line @@ -1419,22 +1270,19 @@ DMAKE(p) Unsupported Free Software DMAKE(p) %and one that causes dmake to swap out +and one that is executed using a shell. - The second and new format of the recipe block begins the - block with the character '[' (the open group character) in - the last non-white space position of a line, and termi- - nates the block with the character ']' (the close group - character) in the first non-white space position of a - line. In this form each recipe line need not have a lead- - ing TAB. This is called a recipe group. Groups so - defined are fed intact as a single unit to a shell for - execution whenever the corresponding target needs to be - updated. If the open group character '[' is preceded by - one or all of -, @ or % then they apply to the entire - group in the same way that they apply to single recipe - lines. You may also specify '+' but it is redundant as a - shell is already being used to run the recipe. See the - MAKING TARGETS section for a description of how dmake - invokes recipes. Here is an example of a group recipe: + The second and new format of the recipe block begins the block with the + character '[' (the open group character) in the last non-white space + position of a line, and terminates the block with the character ']' + (the close group character) in the first non-white space position of a + line. In this form each recipe line need not have a leading TAB. This + is called a recipe group. Groups so defined are fed intact as a single + unit to a shell for execution whenever the corresponding target needs + to be updated. If the open group character '[' is preceded by one or + all of -, @ or % then they apply to the entire group in the same way + that they apply to single recipe lines. You may also specify '+' but + it is redundant as a shell is already being used to run the recipe. + See the MAKING TARGETS section for a description of how dmake invokes + recipes. Here is an example of a group recipe: target : [ @@ -1447,31 +1295,29 @@ DMAKE(p) Unsupported Free Software DMAKE(p) -Version 4.01 PL0 UW 22 +Version 4.10 UW 19 -DMAKE(p) Unsupported Free Software DMAKE(p) +DMAKE(1) DMAKE(1) TEXT DIVERSIONS - dmake supports the notion of text diversions. If a recipe - line contains the macro expression + dmake supports the notion of text diversions. If a recipe line con- + tains the macro expression $(mktmp[,[file][,text]] data) - then all text contained in the data expression is expanded - and is written to a temporary file. The return value of - the macro is the name of the temporary file. + then all text contained in the data expression is expanded and is writ- + ten to a temporary file. The return value of the macro is the name of + the temporary file. - data can be any text and must be separated from the - 'mktmp' portion of the macro name by white-space. The - only restriction on the data text is that it must contain - a balanced number of parentheses of the same kind as are - used to initiate the $(mktmp ...) expression. For exam- - ple: + data can be any text and must be separated from the 'mktmp' portion of + the macro name by white-space. The only restriction on the data text + is that it must contain a balanced number of parentheses of the same + kind as are used to initiate the $(mktmp ...) expression. For example: $(mktmp $(XXX)) @@ -1479,21 +1325,18 @@ TEXT DIVERSIONS $(mktmp text (to dump to file) - is not legal. You can achieve what you wish by either - defining a macro that expands to '(' or by using {} in the - macro expression; like this: + is not legal. You can achieve what you wish by either defining a macro + that expands to '(' or by using {} in the macro expression; like this: ${mktmp text (to dump to file} - Since the temporary file is opened when the macro contain- - ing the text diversion expression is expanded, diversions - may be nested and any diversions that are created as part - of ':=' macro expansions persist for the duration of the - dmake run. The diversion text may contain the same escape - codes as those described in the MACROS section. Thus if - the data text is to contain new lines they must be - inserted using the \n escape sequence. For example the - expression: + Since the temporary file is opened when the macro containing the text + diversion expression is expanded, diversions may be nested and any + diversions that are created as part of ':=' macro expansions persist + for the duration of the dmake run. The diversion text may contain the + same escape codes as those described in the MACROS section. Thus if + the data text is to contain new lines they must be inserted using the + \n escape sequence. For example the expression: all: cat $(mktmp this is a\n\ @@ -1503,666 +1346,538 @@ TEXT DIVERSIONS cat /tmp/mk12294AA - where the temporary file contains two lines both of which - are terminated by a new-line. If the data text spans mul- - tiple lines in the makefile then each line must be contin- - ued via the use of a \. A second more illustrative exam- - ple generates a response file to an MSDOS link command: + where the temporary file contains two lines both of which are termi- + nated by a new-line. If the data text spans multiple lines in the + makefile then each line must be continued via the use of a \. A second + more illustrative example generates a response file to an MSDOS link + command: OBJ = fred.obj mary.obj joe.obj + all : $(OBJ) + link @$(mktmp $(^:t"+\n")\n) + The result of making `all' in the second example is the command: + link @/tmp/mk02394AA -Version 4.01 PL0 UW 23 + where the temporary file contains: + fred.obj+ + mary.obj+ +Version 4.10 UW 20 -DMAKE(p) Unsupported Free Software DMAKE(p) - all : $(OBJ) - link @$(mktmp $(^:t"+\n")\n) - The result of making `all' in the second example is the - command: - link @/tmp/mk02394AA +DMAKE(1) DMAKE(1) - where the temporary file contains: - fred.obj+ - mary.obj+ joe.obj - The last line of the file is terminated by a new-line - which is inserted due to the \n found at the end of the - data string. + The last line of the file is terminated by a new-line which is inserted + due to the \n found at the end of the data string. - If the optional file specifier is present then its - expanded value is the name of the temporary file to cre- - ate. Whenever a $(mktmp ...) macro is expanded the macro - $(TMPFILE) is set to a new temporary file name. Thus the - construct: + If the optional file specifier is present then its expanded value is + the name of the temporary file to create. An example that would be + useful for MSDOS users with a Turbo-C compiler - $(mktmp,$(TMPFILE) data) + $(mktmp,turboc.cfg $(CFLAGS)) - is completely equivalent to not specifying the $(TMPFILE) - optional argument. Another example that would be useful - for MSDOS users with a Turbo-C compiler + will place the contents of CFLAGS into a local turboc.cfg file. The + second optional argument, text, if present alters the name of the value + returned by the $(mktmp ...) macro. + + Under MS-DOS text diversions may be a problem. Many DOS tools require + that path names which contain directories use the \ character to + delimit the directories. Some users however wish to use the '/' to + delimit pathnames and use environments that allow them to do so. The + macro USESHELL is set to "yes" if the current recipe is forced to use a + shell via the .USESHELL or '+' directives, otherwise its value is "no". + The dmake startup files define the macro DIVFILE whose value is either + the value of TMPFILE or the value of TMPFILE edited to replace any '/' + characters to the appropriate value based on the current shell and + whether it will be used to execute the recipe. + + Previous versions of dmake defined text diversions using <+, +> + strings, where <+ started a text diversion and +> terminated one. + dmake is backward compatible with this construct only if the <+ and +> + appear literally on the same recipe line or in the same macro value + string. In such instances the expression: - $(mktmp,turboc.cfg $(CFLAGS)) + <+data+> - will place the contents of CFLAGS into a local turboc.cfg - file. The second optional argument, text, if present - alters the name of the value returned by the $(mktmp ...) - macro. + is mapped to: - Under MS-DOS text diversions may be a problem. Many DOS - tools require that path names which contain directories - use the \ character to delimit the directories. Some - users however wish to use the '/' to delimit pathnames and - use environments that allow them to do so. The macro USE- - SHELL is set to "yes" if the current recipe is forced to - use a shell via the .USESHELL or '+' directives, otherwise - its value is "no". The dmake startup files define the - macro DIVFILE whose value is either the value of TMPFILE - or the value of TMPFILE edited to replace any '/' charac- - ters to the appropriate value based on the current shell - and whether it will be used to execute the recipe. + $(mktmp data) - Previous versions of dmake defined text diversions using - <+, +> strings, where <+ started a text diversion and +> - terminated one. dmake is backward compatible with this - construct only if the <+ and +> appear literally on the + which is fully output compatible with the earlier construct. <+, +> + constructs whose text spans multiple lines must be converted by hand to + use $(mktmp ...). + If the environment variable TMPDIR is defined then the temporary file + is placed into the directory specified by that variable. A makefile + can modify the location of temporary files by defining a macro named + TMPDIR and exporting it using the .EXPORT special target. +SPECIAL TARGETS + This section describes the special targets that are recognized by + dmake. Some are affected by attributes and others are not. -Version 4.01 PL0 UW 24 + .ERROR If defined then the recipe associated with this target is + executed whenever an error condition is detected by + dmake. All attributes that can be used with any other + target may be used with this target. Any prerequisites + of this target will be brought up to date during its pro- + cessing. NOTE: errors will be ignored while making this + target, in extreme cases this may cause some problems. + .EXIT If this target is encountered while parsing a makefile + then the parsing of the makefile is immediately +Version 4.10 UW 21 -DMAKE(p) Unsupported Free Software DMAKE(p) - same recipe line or in the same macro value string. In - such instances the expression: - <+data+> - is mapped to: +DMAKE(1) DMAKE(1) - $(mktmp data) - which is fully output compatible with the earlier con- - struct. <+, +> constructs whose text spans multiple lines - must be converted by hand to use $(mktmp ...). + terminated at that point. - If the environment variable TMPDIR is defined then the - temporary file is placed into the directory specified by - that variable. A makefile can modify the location of tem- - porary files by defining a macro named TMPDIR and export- - ing it using the .EXPORT special target. + .EXPORT All prerequisites associated with this target are assumed + to correspond to macro names and they and their values + are exported to the environment as environment strings at + the point in the makefile at which this target appears. + Any attributes specified with this target are ignored. + Only macros which have been assigned a value in the make- + file prior to the export directive are exported, macros + as yet undefined or macros whose value contains any of + the characters "+=:*" are not exported. is suppre -SPECIAL TARGETS - This section describes the special targets that are recog- - nized by dmake. Some are affected by attributes and oth- - ers are not. - - .ERROR If defined then the recipe associated with - this target is executed whenever an error - condition is detected by dmake. All - attributes that can be used with any other - target may be used with this target. Any - prerequisites of this target will be brought - up to date during its processing. NOTE: - errors will be ignored while making this - target, in extreme cases this may cause some - problems. - - .EXIT If this target is encountered while parsing - a makefile then the parsing of the makefile - is immediately terminated at that point. - - .EXPORT All prerequisites associated with this tar- - get are assumed to correspond to macro names - and they and their values are exported to - the environment as environment strings at - the point in the makefile at which this tar- - get appears. Any attributes specified with - this target are ignored. Only macros which - have been assigned a value in the makefile - prior to the export directive are exported, - macros as yet undefined or macros whose - value contains any of the characters "+=:*" - are not exported. is suppre - - .IMPORT Prerequisite names specified for this target - are searched for in the environment and - - - -Version 4.01 PL0 UW 25 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) - - - defined as macros with their value taken - from the environment. If the special name - .EVERYTHING is used as a prerequisite name - then all environment variables defined in - the environment are imported. The function- - ality of the -E flag can be forced by plac- - ing the construct .IMPORT : .EVERYTHING at - the start of a makefile. Similarly, by - placing the construct at the end, one can - emulate the effect of the -e command line - flag. If a prerequisite name cannot be - found in the environment an error message is - issued. .IMPORT accepts the .IGNORE - attribute. When given, it causes dmake to - ignore the above error. See the MACROS sec- - tion for a description of the processing of - imported macro values. - - .INCLUDE Parse another makefile just as if it had - been located at the point of the .INCLUDE in - the current makefile. The list of prerequi- - sites gives the list of makefiles to try to - read. If the list contains multiple make- - files then they are read in order from left - to right. The following search rules are - used when trying to locate the file. If the - filename is surrounded by " or just by - itself then it is searched for in the cur- - rent directory. If it is not found it is - then searched for in each of the directories - specified as prerequisites of the - .INCLUDEDIRS special target. If the file - name is surrounded by < and >, (ie. - <my_spiffy_new_makefile>) then it is - searched for only in the directories given - by the .INCLUDEDIRS special target. In both - cases if the file name is a fully qualified - name starting at the root of the file system - then it is only searched for once, and the - .INCLUDEDIRS list is ignored. If .INCLUDE - fails to find the file it invokes the infer- - ence engine to try to infer and hence make - the file to be included. In this way the - file can be checked out of an RCS repository - for example. .INCLUDE accepts the .IGNORE, - .SETDIR, and .NOINFER attributes. If the - .IGNORE attribute is given and the file can- - not be found then dmake continues process- - ing, otherwise an error message is gener- - ated. If the .NOINFER attribute is given - and the file cannot be found then dmake will - not attempt to infer and make the file. The - .SETDIR attribute causes dmake to change - directories to the specified directory prior - - - -Version 4.01 PL0 UW 26 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) - - - to attempting the include operation. If all - fails dmake attempts to make the file to be - included. If making the file fails then - dmake terminates unless the .INCLUDE direc- - tive also specified the .IGNORE attribute. - If .FIRST is specified along with .INCLUDE - then dmake attempts to include each named - prerequisite and will terminate the inclu- - sion with the first prerequisite that - results in a successful inclusion. + .IMPORT Prerequisite names specified for this target are searched + for in the environment and defined as macros with their + value taken from the environment. If the special name + .EVERYTHING is used as a prerequisite name then all envi- + ronment variables defined in the environment are + imported. The functionality of the -E flag can be forced + by placing the construct .IMPORT : .EVERYTHING at the + start of a makefile. Similarly, by placing the construct + at the end, one can emulate the effect of the -e command + line flag. If a prerequisite name cannot be found in the + environment an error message is issued. .IMPORT accepts + the .IGNORE attribute. When given, it causes dmake to + ignore the above error. See the MACROS section for a + description of the processing of imported macro values. - .INCLUDEDIRS The list of prerequisites specified for this - target defines the set of directories to - search when trying to include a makefile. + .INCLUDE Parse another makefile just as if it had been located at + the point of the .INCLUDE in the current makefile. The + list of prerequisites gives the list of makefiles to try + to read. If the list contains multiple makefiles then + they are read in order from left to right. The following + search rules are used when trying to locate the file. If + the filename is surrounded by " or just by itself then it + is searched for in the current directory. If it is not + found it is then searched for in each of the directories + specified as prerequisites of the .INCLUDEDIRS special + target. If the file name is surrounded by < and >, (ie. + <my_spiffy_new_makefile>) then it is searched for only in + the directories given by the .INCLUDEDIRS special target. + In both cases if the file name is a fully qualified name + starting at the root of the file system then it is only + searched for once, and the .INCLUDEDIRS list is ignored. + If .INCLUDE fails to find the file it invokes the infer- + ence engine to try to infer and hence make the file to be + included. In this way the file can be checked out of an + RCS repository for example. .INCLUDE accepts the + .IGNORE, .SETDIR, and .NOINFER attributes. If the + .IGNORE attribute is given and the file cannot be found + then dmake continues processing, otherwise an error mes- + sage is generated. If the .NOINFER attribute is given + and the file cannot be found then dmake will not attempt + to infer and make the file. The .SETDIR attribute causes + dmake to change directories to the specified directory + prior to attempting the include operation. If all fails + dmake attempts to make the file to be included. If mak- + ing the file fails then dmake terminates unless the + .INCLUDE directive also specified the .IGNORE attribute. + If .FIRST is specified along with .INCLUDE then dmake + attempts to include each named prerequisite and will ter- + minate the inclusion with the first prerequisite that - .KEEP_STATE This special target is a synonym for the - macro definition - .KEEP_STATE := _state.mk - It's effect is to turn on STATE keeping and - to define _state.mk as the state file. +Version 4.10 UW 22 - .MAKEFILES The list of prerequisites is the set of - files to try to read as the default make- - file. By default this target is defined as: - .MAKEFILES : makefile.mk Makefile makefile - .SOURCE The prerequisite list of this target defines - a set of directories to check when trying to - locate a target file name. See the section - on BINDING of targets for more information. - .SOURCE.suff The same as .SOURCE, except that the - .SOURCE.suff list is searched first when - trying to locate a file matching the a tar- - get whose name ends in the suffix .suff. +DMAKE(1) DMAKE(1) - .REMOVE The recipe of this target is used whenever - dmake needs to remove intermediate targets - that were made but do not need to be kept - around. Such targets result from the appli- - cation of transitive closure on the depen- - dency graph. - In addition to the special targets above, several other - forms of targets are recognized and are considered spe- - cial, their exact form and use is defined in the sections - that follow. + results in a successful inclusion. -SPECIAL MACROS - dmake defines a number of special macros. They are + .INCLUDEDIRS The list of prerequisites specified for this target + defines the set of directories to search when trying to + include a makefile. + + .KEEP_STATE This special target is a synonym for the macro definition + .KEEP_STATE := _state.mk + It's effect is to turn on STATE keeping and to define + _state.mk as the state file. -Version 4.01 PL0 UW 27 + .MAKEFILES The list of prerequisites is the set of files to try to + read as the default makefile. By default this target is + defined as: + .MAKEFILES : makefile.mk Makefile makefile + .SOURCE The prerequisite list of this target defines a set of + directories to check when trying to locate a target file + name. See the section on BINDING of targets for more + information. + .SOURCE.suff The same as .SOURCE, except that the .SOURCE.suff list is + searched first when trying to locate a file matching the + a target whose name ends in the suffix .suff. -DMAKE(p) Unsupported Free Software DMAKE(p) + .REMOVE The recipe of this target is used whenever dmake needs to + remove intermediate targets that were made but do not + need to be kept around. Such targets result from the + application of transitive closure on the dependency + graph. + In addition to the special targets above, several other forms of tar- + gets are recognized and are considered special, their exact form and + use is defined in the sections that follow. - divided into three classes: control macros, run-time - macros, and function macros. The control macros are used - by dmake to configure its actions, and are the preferred - method of doing so. In the case when a control macro has - the same function as a special target or attribute they - share the same name as the special target or attribute. - The run-time macros are defined when dmake makes targets - and may be used by the user inside recipes. The function - macros provide higher level functions dealing with macro +SPECIAL MACROS + dmake defines a number of special macros. They are divided into three + classes: control macros, run-time macros, and function macros. The + control macros are used by dmake to configure its actions, and are the + preferred method of doing so. In the case when a control macro has the + same function as a special target or attribute they share the same name + as the special target or attribute. The run-time macros are defined + when dmake makes targets and may be used by the user inside recipes. + The function macros provide higher level functions dealing with macro expansion and diversion file processing. CONTROL MACROS - To use the control macros simply assign them a value just - like any other macro. The control macros are divided into - three groups: string valued macros, character valued - macros, and boolean valued macros. + To use the control macros simply assign them a value just like any + other macro. The control macros are divided into three groups: string + valued macros, character valued macros, and boolean valued macros. - The following are all of the string valued macros. This - list is divided into two groups. The first group gives - the string valued macros that are defined internally and - cannot be directly set by the user. + The following are all of the string valued macros. This list is + divided into two groups. The first group gives the string valued + macros that are defined internally and cannot be directly set by the + user. - INCDEPTH This macro's value is a string of digits - representing the current depth of makefile - inclusion. In the first makefile level - this value is zero. + INCDEPTH This macro's value is a string of digits representing + the current depth of makefile inclusion. In the first - MFLAGS Is the list of flags that were given on - the command line including a leading - switch character. The -f flag is not - included in this list. - MAKECMD Is the name with which dmake was invoked. - MAKEDIR Is the full path to the initial directory - in which dmake was invoked. +Version 4.10 UW 23 - MAKEFILE Contains the string "-f makefile" where, - makefile is the name of initial user make- - file that was first read. - MAKEFLAGS Is the same as $(MFLAGS) but has no lead- - ing switch character. (ie. MFLAGS = - -$(MAKEFLAGS)) - MAKEMACROS Contains the complete list of macro - expressions that were specified on the - command line. - MAKETARGETS Contains the name(s) of the target(s), if - any, that were specified on the command - line. - MAKEVERSION Contains a string indicating the current +DMAKE(1) DMAKE(1) + makefile level this value is zero. -Version 4.01 PL0 UW 28 + MFLAGS Is the list of flags that were given on the command + line including a leading switch character. The -f flag + is not included in this list. + MAKECMD Is the name with which dmake was invoked. + MAKEDIR Is the full path to the initial directory in which + dmake was invoked. + MAKEFILE Contains the string "-f makefile" where, makefile is + the name of initial user makefile that was first read. + MAKEFLAGS Is the same as $(MFLAGS) but has no leading switch + character. (ie. MFLAGS = -$(MAKEFLAGS)) -DMAKE(p) Unsupported Free Software DMAKE(p) + MAKEMACROS Contains the complete list of macro expressions that + were specified on the command line. + MAKETARGETS Contains the name(s) of the target(s), if any, that + were specified on the command line. - dmake version number. + MAKEVERSION Contains a string indicating the current dmake version + number. - MAXPROCESSLIMIT Is a numeric string representing the maxi- - mum number of processes that dmake can use - when making targets using parallel mode. + MAXPROCESSLIMIT Is a numeric string representing the maximum number of + processes that dmake can use when making targets using + parallel mode. - NULL Is permanently defined to be the NULL - string. This is useful when comparing a - conditional expression to an NULL value. + NULL Is permanently defined to be the NULL string. This is + useful when comparing a conditional expression to an + NULL value. - PWD Is the full path to the current directory - in which make is executing. + PWD Is the full path to the current directory in which make + is executing. - TMPFILE Is set to the name of the most recent tem- - porary file opened by dmake. Temporary - files are used for text diversions and for - group recipe processing. + TMPFILE Is set to the name of the most recent temporary file + opened by dmake. Temporary files are used for text + diversions and for group recipe processing. - TMD Stands for "To Make Dir", and is the path - from the present directory (value of - $(PWD)) to the directory that dmake was - started up in (value of $(MAKEDIR)). This - macro is modified when .SETDIR attributes - are processed. + TMD Stands for "To Make Dir", and is the path from the + present directory (value of $(PWD)) to the directory + that dmake was started up in (value of $(MAKEDIR)). + This macro is modified when .SETDIR attributes are pro- + cessed. - USESHELL The value of this macro is set to "yes" if - the current recipe is forced to use a - shell for its execution via the .USESHELL - or '+' directives, its value is "no" oth- + USESHELL The value of this macro is set to "yes" if the current + recipe is forced to use a shell for its execution via + the .USESHELL or '+' directives, its value is "no" oth- erwise. - The second group of string valued macros control dmake - behavior and may be set by the user. + The second group of string valued macros control dmake behavior and may + be set by the user. - .DIRCACHE If set to "yes" enables the directory - cache (this is the default). If set to - "no" disables the directory cache (equiva- - lent to -d command-line flag). + .DIRCACHE If set to "yes" enables the directory cache (this is + the default). If set to "no" disables the directory + cache (equivalent to -d command-line flag). .DIRCACHERESPCASE - If set to "yes" causes the directory - cache, if enabled, to respect file case, - if set to "no" facilities of the native OS - are used to match file case. + If set to "yes" causes the directory cache, if enabled, + to respect file case, if set to "no" facilities of the - .NAMEMAX Defines the maximum length of a filename - component. The value of the variable is - initialized at startup to the value of the - compiled macro NAME_MAX. On some systems - the value of NAME_MAX is too short by - default. Setting a new value for .NAMEMAX - will override the compiled value. +Version 4.10 UW 24 -Version 4.01 PL0 UW 29 +DMAKE(1) DMAKE(1) -DMAKE(p) Unsupported Free Software DMAKE(p) + native OS are used to match file case. + .NAMEMAX Defines the maximum length of a filename component. + The value of the variable is initialized at startup to + the value of the compiled macro NAME_MAX. On some sys- + tems the value of NAME_MAX is too short by default. + Setting a new value for .NAMEMAX will override the com- + piled value. - .NOTABS When set to "yes" enables the use of - spaces as well as <tabs> to begin recipe - lines. By default a non-group recipe is - terminated by a line without any leading - white-space or by a line not beggining - with a <tab> character. Enabling this - mode modifies the first condition of the - above termination rule to terminate a - non-group recipe with a line that contains - only white-space. This mode does not - effect the parsing of group recipes brack- - eted by []. + .NOTABS When set to "yes" enables the use of spaces as well as + <tabs> to begin recipe lines. By default a non-group + recipe is terminated by a line without any leading + white-space or by a line not beggining with a <tab> + character. Enabling this mode modifies the first con- + dition of the above termination rule to terminate a + non-group recipe with a line that contains only + white-space. This mode does not effect the parsing of + group recipes bracketed by []. - AUGMAKE If set to "yes" value will enable the - transformation of special meta targets to - support special AUGMAKE inferences (See - the COMPATIBILITY section). + AUGMAKE If set to "yes" value will enable the transformation of + special meta targets to support special AUGMAKE infer- + ences (See the COMPATIBILITY section). - DIRBRKSTR Contains the string of chars used to ter- - minate the name of a directory in a path- - name. Under UNIX its value is "/", under - MSDOS its value is "/\:". + DIRBRKSTR Contains the string of chars used to terminate the name + of a directory in a pathname. Under UNIX its value is + "/", under MSDOS its value is "/\:". - DIRSEPSTR Contains the string that is used to sepa- - rate directory components when path names - are constructed. It is defined with a - default value at startup. + DIRSEPSTR Contains the string that is used to separate directory + components when path names are constructed. It is + defined with a default value at startup. - DIVFILE Is defined in the startup file and gives - the name that should be returned for the - diversion file name when used in $(mktmp - ...) expansions, see the TEXT DIVERSION + DIVFILE Is defined in the startup file and gives the name that + should be returned for the diversion file name when + used in $(mktmp ...) expansions, see the TEXT DIVERSION section for details. DYNAMICNESTINGLEVEL - Specifies the maximum number of recursive - dynamic macro expansions. Its initial - value is 100. - - .KEEP_STATE Assigning this macro a value tells dmake - the name of the state file to use and - turns on the keeping of state information - for any targets that are brought up to - date by the make. - - GROUPFLAGS This macro gives the set of flags to pass - to the shell when invoking it to execute a - group recipe. The value of the macro is - the list of flags with a leading switch + Specifies the maximum number of recursive dynamic macro + expansions. Its initial value is 100. + + .KEEP_STATE Assigning this macro a value tells dmake the name of + the state file to use and turns on the keeping of state + information for any targets that are brought up to date + by the make. + + GROUPFLAGS This macro gives the set of flags to pass to the shell + when invoking it to execute a group recipe. The value + of the macro is the list of flags with a leading switch indicator. (ie. `-' under UNIX) - GROUPSHELL This macro defines the full path to the - executable image to be used as the shell - when processing group recipes. This macro + GROUPSHELL This macro defines the full path to the executable + image to be used as the shell when processing group + recipes. This macro must be defined if group recipes + are used. It is assigned a default value in the + startup makefile. Under UNIX this value is /bin/sh. + GROUPSUFFIX If defined, this macro gives the string to use as a + suffix when creating group recipe files to be handed to + the command interpreter. For example, if it is defined + as .sh, then all temporary files created by dmake will + end in the suffix .sh. Under MSDOS if you are using + command.com as your GROUPSHELL, then this suffix must + be set to .bat in order for group recipes to function -Version 4.01 PL0 UW 30 +Version 4.10 UW 25 -DMAKE(p) Unsupported Free Software DMAKE(p) +DMAKE(1) DMAKE(1) - must be defined if group recipes are used. - It is assigned a default value in the - startup makefile. Under UNIX this value - is /bin/sh. - GROUPSUFFIX If defined, this macro gives the string to - use as a suffix when creating group recipe - files to be handed to the command inter- - preter. For example, if it is defined as - .sh, then all temporary files created by - dmake will end in the suffix .sh. Under - MSDOS if you are using command.com as your - GROUPSHELL, then this suffix must be set - to .bat in order for group recipes to - function correctly. The setting of GROUP- - SUFFIX and GROUPSHELL is done automati- - cally for command.com in the startup.mk + correctly. The setting of GROUPSUFFIX and GROUPSHELL + is done automatically for command.com in the startup.mk files. - MAKE Is defined in the startup file by default. - Initially this macro is defined to have - the value "$(MAKECMD) $(MFLAGS)". The - string $(MAKE) is recognized when using - the -n switch. - - MAKESTARTUP This macro defines the full path to the - initial startup makefile. Use the -V com- - mand line option to discover its initial - value. - - MAXLINELENGTH This macro defines the maximum size of a - single line of makefile input text. The - size is specified as a number, the default - value is defined internally and is shown - via the -V option. A buffer of this size - plus 2 is allocated for reading makefile - text. The buffer is freed before any tar- - gets are made, thereby allowing files con- - taining long input lines to be processed - without consuming memory during the actual - make. This macro can only be used to - extend the line length beyond it's default - minimum value. - - MAXPROCESS Specify the maximum number of child pro- - cesses to use when making targets. The - default value of this macro is "1" and its - value cannot exceed the value of the macro - MAXPROCESSLIMIT. Setting the value of - MAXPROCESS on the command line or in the - makefile is equivalent to supplying a cor- - responding value to the -P flag on the + MAKE Is defined in the startup file by default. Initially + this macro is defined to have the value "$(MAKECMD) + $(MFLAGS)". The string $(MAKE) is recognized when + using the -n switch. + + MAKESTARTUP This macro defines the full path to the initial startup + makefile. Use the -V command line option to discover + its initial value. + + MAXLINELENGTH This macro defines the maximum size of a single line of + makefile input text. The size is specified as a num- + ber, the default value is defined internally and is + shown via the -V option. A buffer of this size plus 2 + is allocated for reading makefile text. The buffer is + freed before any targets are made, thereby allowing + files containing long input lines to be processed with- + out consuming memory during the actual make. This + macro can only be used to extend the line length beyond + it's default minimum value. + + MAXPROCESS Specify the maximum number of child processes to use + when making targets. The default value of this macro + is "1" and its value cannot exceed the value of the + macro MAXPROCESSLIMIT. Setting the value of MAXPROCESS + on the command line or in the makefile is equivalent to + supplying a corresponding value to the -P flag on the command line. + PREP This macro defines the number of iterations to be + expanded automatically when processing % rule defini- + tions of the form: + % : %.suff + See the sections on PERCENT(%) RULES for details on how + PREP is used. -Version 4.01 PL0 UW 31 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) - - - PREP This macro defines the number of itera- - tions to be expanded automatically when - processing % rule definitions of the form: - - % : %.suff + SHELL This macro defines the full path to the executable + image to be used as the shell when processing single + line recipes. This macro must be defined if recipes + requiring the shell for execution are to be used. It + is assigned a default value in the startup makefile. + Under UNIX this value is /bin/sh. - See the sections on PERCENT(%) RULES for - details on how PREP is used. - - SHELL This macro defines the full path to the - executable image to be used as the shell - when processing single line recipes. This - macro must be defined if recipes requiring - the shell for execution are to be used. - It is assigned a default value in the - startup makefile. Under UNIX this value - is /bin/sh. - - SHELLFLAGS This macro gives the set of flags to pass - to the shell when invoking it to execute a - single line recipe. The value of the - macro is the list of flags with a leading + SHELLFLAGS This macro gives the set of flags to pass to the shell + when invoking it to execute a single line recipe. The + value of the macro is the list of flags with a leading switch indicator. (ie. `-' under UNIX) - SHELLMETAS Each time dmake executes a single recipe - line (not a group recipe) the line is - searched for any occurrence of a character - defined in the value of SHELLMETAS. If - such a character is found the recipe line - is defined to require a shell to ensure - its correct execution. In such instances - a shell is used to invoke the recipe line. - If no match is found the recipe line is - executed without the use of a shell. + SHELLMETAS Each time dmake executes a single recipe line (not a + group recipe) the line is searched for any occurrence + of a character defined in the value of SHELLMETAS. If + such a character is found the recipe line is defined to + require a shell to ensure its correct execution. In + such instances a shell is used to invoke the recipe + line. If no match is found the recipe line is executed + without the use of a shell. - There is only one character valued macro defined by dmake: - SWITCHAR contains the switch character used to introduce - options on command lines. For UNIX its value is `-', and - for MSDOS its value may be `/' or `-'. The macro is - internally defined and is not user setable. The MSDOS - version of dmake attempts to first extract SWITCHAR from - an environment variable of the same name. If that fails - it then attempts to use the undocumented getswitchar sys- - tem call, and returns the result of that. Under MSDOS - version 4.0 you must set the value of the environment - macro SWITCHAR to '/' to obtain predictable behavior. - All boolean macros currently understood by dmake corre- - spond directly to the previously defined attributes. - These macros provide a second way to apply global - attributes, and represent the preferred method of doing - so. They are used by assigning them a value. If the - value is not a NULL string then the boolean condition is +Version 4.10 UW 26 -Version 4.01 PL0 UW 32 +DMAKE(1) DMAKE(1) -DMAKE(p) Unsupported Free Software DMAKE(p) + There is only one character valued macro defined by dmake: SWITCHAR + contains the switch character used to introduce options on command + lines. For UNIX its value is `-', and for MSDOS its value may be `/' + or `-'. The macro is internally defined and is not user setable. The + MSDOS version of dmake attempts to first extract SWITCHAR from an envi- + ronment variable of the same name. If that fails it then attempts to + use the undocumented getswitchar system call, and returns the result of + that. Under MSDOS version 4.0 you must set the value of the environ- + ment macro SWITCHAR to '/' to obtain predictable behavior. - set to on. If the value is a NULL string then the condi- - tion is set to off. There are five conditions defined and - they correspond directly to the attributes of the same - name. Their meanings are defined in the ATTRIBUTES sec- - tion above. The macros are: .EPILOG, .IGNORE, .MKSARGS, - .NOINFER, .PRECIOUS, .PROLOG, .SEQUENTIAL, .SILENT, .SWAP, - and .USESHELL. Assigning any of these a non NULL value - will globally set the corresponding attribute to on. + All boolean macros currently understood by dmake correspond directly to + the previously defined attributes. These macros provide a second way + to apply global attributes, and represent the preferred method of doing + so. They are used by assigning them a value. If the value is not a + NULL string then the boolean condition is set to on. If the value is a + NULL string then the condition is set to off. There are five condi- + tions defined and they correspond directly to the attributes of the + same name. Their meanings are defined in the ATTRIBUTES section above. + The macros are: .EPILOG, .IGNORE, .MKSARGS, .NOINFER, .PRECIOUS, .PRO- + LOG, .SEQUENTIAL, .SILENT, .SWAP, and .USESHELL. Assigning any of + these a non NULL value will globally set the corresponding attribute to + on. RUNTIME MACROS - These macros are defined when dmake is making targets, and - may take on different values for each target. $@ is - defined to be the full target name, $? is the list of all - out of date prerequisites, $& is the list of all prerequi- - sites, $> is the name of the library if the current target - is a library member, and $< is the list of prerequisites - specified in the current rule. If the current target had - a recipe inferred then $< is the name of the inferred pre- - requisite even if the target had a list of prerequisites - supplied using an explicit rule that did not provide a - recipe. In such situations $& gives the full list of pre- - requisites. - - $* is defined as $(@:db) when making targets with explicit - recipes and is defined as the value of % when making tar- - gets whose recipe is the result of an inference. In the - first case $* is the target name with no suffix, and in - the second case, is the value of the matched % pattern - from the associated %-rule. $^ expands to the set of out - of date prerequisites taken from the current value of $<. - In addition to these, $$ expands to $, {{ expands to {, }} - expands to }, and the strings <+ and +> are recognized as - respectively starting and terminating a text diversion - when they appear literally together in the same input - line. - - The difference between $? and $^ can best be illustrated - by an example, consider: + These macros are defined when dmake is making targets, and may take on + different values for each target. $@ is defined to be the full target + name, $? is the list of all out of date prerequisites, $& is the list + of all prerequisites, $> is the name of the library if the current tar- + get is a library member, and $< is the list of prerequisites specified + in the current rule. If the current target had a recipe inferred then + $< is the name of the inferred prerequisite even if the target had a + list of prerequisites supplied using an explicit rule that did not pro- + vide a recipe. In such situations $& gives the full list of prerequi- + sites. + + $* is defined as $(@:db) when making targets with explicit recipes and + is defined as the value of % when making targets whose recipe is the + result of an inference. In the first case $* is the target name with + no suffix, and in the second case, is the value of the matched % pat- + tern from the associated %-rule. $^ expands to the set of out of date + prerequisites taken from the current value of $<. In addition to + these, $$ expands to $, {{ expands to {, }} expands to }, and the + strings <+ and +> are recognized as respectively starting and terminat- + ing a text diversion when they appear literally together in the same + input line. + + The difference between $? and $^ can best be illustrated by an example, + consider: fred.out : joe amy hello rules for making fred fred.out : my.c your.h his.h her.h # more prerequisites - Assume joe, amy, and my.c are newer then fred.out. When - dmake executes the recipe for making fred.out the values - of the following macros will be: + Assume joe, amy, and my.c are newer then fred.out. When dmake executes + the recipe for making fred.out the values of the following macros will + be: $@ --> fred.out $* --> fred @@ -2173,109 +1888,102 @@ RUNTIME MACROS -Version 4.01 PL0 UW 33 +Version 4.10 UW 27 -DMAKE(p) Unsupported Free Software DMAKE(p) + +DMAKE(1) DMAKE(1) FUNCTION MACROS - dmake supports a full set of functional macros. One of - these, the $(mktmp ...) macro, is discussed in detail in - the TEXT DIVERSION section and is not covered here. + dmake supports a full set of functional macros. One of these, the + $(mktmp ...) macro, is discussed in detail in the TEXT DIVERSION sec- + tion and is not covered here. $(and macroterm ...) - expands each macroterm in turn until there - are no more or one of them returns an empty - string. If all expand to non-empty strings - the macro returs the string "t" otherwise it - returns an empty string. + expands each macroterm in turn until there are no more or + one of them returns an empty string. If all expand to + non-empty strings the macro returs the string "t" other- + wise it returns an empty string. $(assign expression) - Causes expression to be parsed as a macro - assignment expression and results in the - specified assignment being made. An error - is issued if the assignment is not syntati- - cally correct. expression may contain white - space. This is in effect a dynamic macro - assignment facility and may appear anywhere - any other macro may appear. The result of - the expanding a dynamic macro assignment - expression is the name of the macro that was - assigned and $(NULL) if the expression is - not a valid macro assignment expression. - Some examples are: + Causes expression to be parsed as a macro assignment + expression and results in the specified assignment being + made. An error is issued if the assignment is not + syntatically correct. expression may contain white + space. This is in effect a dynamic macro assignment + facility and may appear anywhere any other macro may + appear. The result of the expanding a dynamic macro + assignment expression is the name of the macro that was + assigned and $(NULL) if the expression is not a valid + macro assignment expression. Some examples are: $(assign foo := fred) $(assign $(ind_macro_name) +:= $(morejunk)) $(echo list) - Echo's the value of list. list is not - expanded. + Echo's the value of list. list is not expanded. $(eq,text_a,text_b true false) - expands text_a and text_b and compares their - results. If equal it returns the result of - the expansion of the true term, otherwise it - returns the expansion of the false term. + expands text_a and text_b and compares their results. If + equal it returns the result of the expansion of the true + term, otherwise it returns the expansion of the false + term. $(!eq,text_a,text_b true false) - Behaves identically to the previous macro - except that the true string is chosen if the - expansions of the two strings are not equal + Behaves identically to the previous macro except that the + true string is chosen if the expansions of the two + strings are not equal $(foreach,var,list data) - Implements iterative macro expansion over - data using var as the iterator taking on - values from list. var and list are expanded - and the result is the concatenation of - expanding data with var being set to each - whitespace separated token from list. For - + Implements iterative macro expansion over data using var + as the iterator taking on values from list. var and list + are expanded and the result is the concatenation of + expanding data with var being set to each whitespace sep- + arated token from list. For example: + list = a b c + all :; echo [$(foreach,i,$(list) [$i])] -Version 4.01 PL0 UW 34 + will output + [[a] [b] [c]] + The iterator variable is defined as a local variable to + this foreach instance. The following expression illus- + trates this: + $(foreach,i,$(foreach,i,$(sort c a b) root/$i) [$i/f.h]) + when evaluated the result is: -DMAKE(p) Unsupported Free Software DMAKE(p) + [root/a/f.h] [root/b/f.h] [root/c/f.h] - example: - list = a b c - all :; echo [$(foreach,i,$(list) [$i])] +Version 4.10 UW 28 - will output - [[a] [b] [c]] - The iterator variable is defined as a local - variable to this foreach instance. The fol- - lowing expression illustrates this: - $(foreach,i,$(foreach,i,$(sort c a b) root/$i) [$i/f.h]) - when evaluated the result is: +DMAKE(1) DMAKE(1) - [root/a/f.h] [root/b/f.h] [root/c/f.h] - The specification of list must be a valid - macro expression, such as: + The specification of list must be a valid macro expres- + sion, such as: $($(assign list=a b c)) $(sort d a b c) $(echo a b c) - and cannot just be the list itself. That - is, the following foreach expression: + and cannot just be the list itself. That is, the follow- + ing foreach expression: $(foreach,i,a b c [$i]) @@ -2286,125 +1994,100 @@ DMAKE(p) Unsupported Free Software DMAKE(p) when evaluated. $(nil expression) - Always returns the value of $(NULL) regard- - less of what expression is. This function - macro can be used to discard results of - expanding macro expressions. + Always returns the value of $(NULL) regardless of what + expression is. This function macro can be used to dis- + card results of expanding macro expressions. $(not macroterm) - expands macroterm and returs the string "t" - if the result of the expansion is the empty - string; otherwise, it returns the empty - string. + expands macroterm and returs the string "t" if the result + of the expansion is the empty string; otherwise, it + returns the empty string. $(null,text true false) - expands the value of text. If it is NULL - then the macro returns the value of the - expansion of true and the expansion of false - otherwise. The terms true, and false must - - - -Version 4.01 PL0 UW 35 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) - - + expands the value of text. If it is NULL then the macro + returns the value of the expansion of true and the expan- + sion of false otherwise. The terms true, and false must be strings containing no white-space. $(!null,text true false) - Behaves identically to the previous macro - except that the true string is chosen if the - expansion of text is not NULL. + Behaves identically to the previous macro except that the + true string is chosen if the expansion of text is not + NULL. $(or macroterm ...) - expands each macroterm in turn and returs - the empty string if each term expands to the - empty string; otherwise, it returs the - string "t". + expands each macroterm in turn and returs the empty + string if each term expands to the empty string; other- + wise, it returs the string "t". $(shell command) - Runs command as if it were part of a recipe - and returns, separated by a single space, - all the non-white space terms written to - stdout by the command. For example: + Runs command as if it were part of a recipe and returns, + separated by a single space, all the non-white space + terms written to stdout by the command. For example: $(shell ls *.c) - will return "a.c b.c c.c d.c" if the files - exist in the current directory. The recipe - modification flags [+@%-] are honored if - they appear as the first characters in the + will return "a.c b.c c.c d.c" if the files exist in the + current directory. The recipe modification flags [+@%-] + are honored if they appear as the first characters in the command. For example: $(shell +ls *.c) - will run the command using the current - shell. + will run the command using the current shell. $(shell,expand command) - Is an extension to the $(shell... function - macro that expands the result of running - command. + Is an extension to the $(shell... function macro that + expands the result of running command. $(sort list) - Will take all white-space separated tokens - in list and will return their sorted equiva- - lent list. + Will take all white-space separated tokens in list and + will return their sorted equivalent list. - $(strip data) - Will replace all strings of white-space in - data by a single space. - $(subst,pat,replacement data) - Will search for pat in data and will replace - any occurrence of pat with the replacement - string. The expansion - $(subst,.o,.c $(OBJECTS)) +Version 4.10 UW 29 - is equivalent to: -Version 4.01 PL0 UW 36 +DMAKE(1) DMAKE(1) + $(strip data) + Will replace all strings of white-space in data by a sin- + gle space. + $(subst,pat,replacement data) + Will search for pat in data and will replace any occur- + rence of pat with the replacement string. The expansion -DMAKE(p) Unsupported Free Software DMAKE(p) + $(subst,.o,.c $(OBJECTS)) + is equivalent to: $(OBJECTS:s/.o/.c/) $(uniq list) - Will take all white-space separated tokens - in list and will return their sorted equiva- - lent list containing no duplicates. + Will take all white-space separated tokens in list and + will return their sorted equivalent list containing no + duplicates. CONDITIONAL MACROS - dmake supports conditional macros. These allow the defi- - nition of target specific macro values. You can now say - the following: + dmake supports conditional macros. These allow the definition of tar- + get specific macro values. You can now say the following: target ?= MacroName MacroOp Value - This creates a definition for MacroName whose value is - Value only when target is being made. You may use a con- - ditional macro assignment anywhere that a regular macro - assignment may appear, including as the value of a - $(assign ...) macro. + This creates a definition for MacroName whose value is Value only when + target is being made. You may use a conditional macro assignment any- + where that a regular macro assignment may appear, including as the + value of a $(assign ...) macro. - The new definition is associated with the most recent cell - definition for target. If no prior definition exists then - one is created. The implications of this are immediately - evident in the following example: + The new definition is associated with the most recent cell definition + for target. If no prior definition exists then one is created. The + implications of this are immediately evident in the following example: foo := hello @@ -2418,200 +2101,160 @@ CONDITIONAL MACROS cond .SETDIR=msdos::;@echo $(foo) $(bar) cond ?= foo := hihi - The first conditional assignment creates a binding for - 'bar' that is activated when 'cond' is made. The bindings - following the :: definitions are activated when their - respective recipe rules are used. Thus the first binding - serves to provide a global value for 'bar' while any of - the cond :: rules are processed, and the local bindings - for 'foo' come into effect when their associated :: rule - is processed. - - Conditionals for targets of .UPDATEALL are all activated - before the target group is made. Assignments are pro- - cessed in order. Note that the value of a conditional - macro assignment is NOT AVAILABLE until the associated - target is made, thus the construct - - mytarget ?= bar := hello - - - -Version 4.01 PL0 UW 37 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) + The first conditional assignment creates a binding for 'bar' that is + activated when 'cond' is made. The bindings following the :: defini- + tions are activated when their respective recipe rules are used. Thus + the first binding serves to provide a global value for 'bar' while any + of the cond :: rules are processed, and the local bindings for 'foo' + come into effect when their associated :: rule is processed. + Conditionals for targets of .UPDATEALL are all activated before the + target group is made. Assignments are processed in order. Note that + the value of a conditional macro assignment is NOT AVAILABLE until the + associated target is made, thus the construct + mytarget ?= bar := hello mytarget ?= foo := $(bar) - results in $(foo) expanding to "", if you want the result - to be "hello" you must use: + results in $(foo) expanding to "", if you want the result to be "hello" + you must use: mytarget ?= bar := hello mytarget ?= foo = $(bar) - Once a target is made any associated conditional macros - are deactivated and their values are no longer available. - Activation occurrs after all inference, and .SETDIR direc- - tives have been processed and after $@ is assigned, but - before prerequisites are processed; thereby making the - values of conditional macro definitions available during - construction of prerequisites. - If a %-meta rule target has associated conditional macro - assignments, and the rule is chosen by the inference algo- - rithm then the conditional macro assignments are inferred - together with the associated recipe. -DYNAMIC PREREQUISITES - dmake looks for prerequisites whose names contain macro - expansions during target processing. Any such prerequi- - sites are expanded and the result of the expansion is used - as the prerequisite name. As an example the line: +Version 4.10 UW 30 - fred : $$@.c - causes the $$@ to be expanded when dmake is making fred, - and it resolves to the target fred. This enables dynamic - prerequisites to be generated. The value of @ may be mod- - ified by any of the valid macro modifiers. So you can say - for example: - fred.out : $$(@:b).c - - where the $$(@:b) expands to fred. Note the use of $$ - instead of $ to indicate the dynamic expansion, this is - due to the fact that the rule line is expanded when it is - initially parsed, and $$ then returns $ which later trig- - gers the dynamic prerequisite expansion. If you really - want a $ to be part of a prerequisite name you must use - $$$$. Dynamic macro expansion is performed in all user - defined rules, and the special targets .SOURCE*, and - .INCLUDEDIRS. - - If dynamic macro expansion results in multiple white space - separated tokens then these are inserted into the prereq- - uisite list inplace of the dynamic prerequisite. If the - new list contains additional dynamic prerequisites they - will be expanded when they are processed. The level of - recursion in this expansion is controlled by the value of - the variable DYNAMICNESTINGLEVEL and is set to 100 by +DMAKE(1) DMAKE(1) -Version 4.01 PL0 UW 38 + Once a target is made any associated conditional macros are deactivated + and their values are no longer available. Activation occurrs after all + inference, and .SETDIR directives have been processed and after $@ is + assigned, but before prerequisites are processed; thereby making the + values of conditional macro definitions available during construction + of prerequisites. + If a %-meta rule target has associated conditional macro assignments, + and the rule is chosen by the inference algorithm then the conditional + macro assignments are inferred together with the associated recipe. +DYNAMIC PREREQUISITES + dmake looks for prerequisites whose names contain macro expansions dur- + ing target processing. Any such prerequisites are expanded and the + result of the expansion is used as the prerequisite name. As an exam- + ple the line: + fred : $$@.c -DMAKE(p) Unsupported Free Software DMAKE(p) + causes the $$@ to be expanded when dmake is making fred, and it + resolves to the target fred. This enables dynamic prerequisites to be + generated. The value of @ may be modified by any of the valid macro + modifiers. So you can say for example: + fred.out : $$(@:b).c - default. + where the $$(@:b) expands to fred. Note the use of $$ instead of $ to + indicate the dynamic expansion, this is due to the fact that the rule + line is expanded when it is initially parsed, and $$ then returns $ + which later triggers the dynamic prerequisite expansion. If you really + want a $ to be part of a prerequisite name you must use $$$$. Dynamic + macro expansion is performed in all user defined rules, and the special + targets .SOURCE*, and .INCLUDEDIRS. + + If dynamic macro expansion results in multiple white space separated + tokens then these are inserted into the prerequisite list inplace of + the dynamic prerequisite. If the new list contains additional dynamic + prerequisites they will be expanded when they are processed. The level + of recursion in this expansion is controlled by the value of the vari- + able DYNAMICNESTINGLEVEL and is set to 100 by default. BINDING TARGETS - This operation takes a target name and binds it to an - existing file, if possible. dmake makes a distinction - between the internal target name of a target and its asso- - ciated external file name. Thus it is possible for a tar- - get's internal name and its external file name to differ. - To perform the binding, the following set of rules is - used. Assume that we are trying to bind a target whose - name is of the form X.suff, where .suff is the suffix and - X is the stem portion (ie. that part which contains the - directory and the basename). dmake takes this target name - and performs a series of search operations that try to - find a suitably named file in the external file system. - The search operation is user controlled via the settings - of the various .SOURCE targets. - - 1. If target has the .SYMBOL attribute set then - look for it in the library. If found, - replace the target name with the library - member name and continue with step 2. If - the name is not found then return. - - 2. Extract the suffix portion (that following - the `.') of the target name. If the suffix - is not null, look up the special target - .SOURCE.<suff> (<suff> is the suffix). If - the special target exists then search each - directory given in the .SOURCE.<suff> pre- - requisite list for the target. If the tar- - get's suffix was null (ie. .suff was empty) - then perform the above search but use the - special target .SOURCE.NULL instead. If at - any point a match is found then terminate - the search. If a directory in the prerequi- - site list is the special name `.NULL ' per- - form a search for the full target name with- - out prepending any directory portion (ie. - prepend the NULL directory). - - 3. The search in step 2. failed. Repeat the - same search but this time use the special - target .SOURCE. (a default target of - '.SOURCE : .NULL' is defined by dmake at - startup, and is user redefinable) + This operation takes a target name and binds it to an existing file, if + possible. dmake makes a distinction between the internal target name + of a target and its associated external file name. Thus it is possible + for a target's internal name and its external file name to differ. To + perform the binding, the following set of rules is used. Assume that + we are trying to bind a target whose name is of the form X.suff, where + .suff is the suffix and X is the stem portion (ie. that part which con- + tains the directory and the basename). dmake takes this target name + and performs a series of search operations that try to find a suitably + named file in the external file system. The search operation is user + controlled via the settings of the various .SOURCE targets. - 4. The search in step 3. failed. If the target - has the library member attribute (.LIBMEM- - BER) set then try to find the target in the - library which was passed along with the - .LIBMEMBER attribute (see the MAKING - LIBRARIES section). The bound file name - assigned to a target which is successfully + 1. If target has the .SYMBOL attribute set then look for it + in the library. If found, replace the target name with + the library member name and continue with step 2. If the + name is not found then return. + 2. Extract the suffix portion (that following the `.') of + the target name. If the suffix is not null, look up the + special target .SOURCE.<suff> (<suff> is the suffix). If + the special target exists then search each directory + given in the .SOURCE.<suff> prerequisite list for the + target. If the target's suffix was null (ie. .suff was + empty) then perform the above search but use the special + target .SOURCE.NULL instead. If at any point a match is -Version 4.01 PL0 UW 39 +Version 4.10 UW 31 -DMAKE(p) Unsupported Free Software DMAKE(p) +DMAKE(1) DMAKE(1) - located in a library is the same name that - would be assigned had the search failed (see - 5.). - 5. The search failed. Either the target was - not found in any of the search directories - or no applicable .SOURCE special targets - exist. If applicable .SOURCE special tar- - gets exist, but the target was not found, - then dmake assigns the first name searched - as the bound file name. If no applicable - .SOURCE special targets exist, then the full - original target name becomes the bound file - name. + found then terminate the search. If a directory in the + prerequisite list is the special name `.NULL ' perform a + search for the full target name without prepending any + directory portion (ie. prepend the NULL directory). - There is potential here for a lot of search operations. - The trick is to define .SOURCE.x special targets with - short search lists and leave .SOURCE as short as possible. - The search algorithm has the following useful side effect. - When a target having the .LIBMEMBER (library member) - attribute is searched for, it is first searched for as an - ordinary file. When a number of library members require - updating it is desirable to compile all of them first and - to update the library at the end in a single operation. - If one of the members does not compile and dmake stops, - then the user may fix the error and make again. dmake - will not remake any of the targets whose object files have - already been generated as long as none of their prerequi- - site files have been modified as a result of the fix. + 3. The search in step 2. failed. Repeat the same search but + this time use the special target .SOURCE. (a default + target of '.SOURCE : .NULL' is defined by dmake at + startup, and is user redefinable) - When dmake constructs target pathnames './' substrings are - removed and substrings of the form 'foo/..' are elimi- - nated. This may result in somewhat unexpected values of - the macro expansion $@, but is infact the corect result. + 4. The search in step 3. failed. If the target has the + library member attribute (.LIBMEMBER) set then try to + find the target in the library which was passed along + with the .LIBMEMBER attribute (see the MAKING LIBRARIES + section). The bound file name assigned to a target which + is successfully located in a library is the same name + that would be assigned had the search failed (see 5.). + + 5. The search failed. Either the target was not found in + any of the search directories or no applicable .SOURCE + special targets exist. If applicable .SOURCE special + targets exist, but the target was not found, then dmake + assigns the first name searched as the bound file name. + If no applicable .SOURCE special targets exist, then the + full original target name becomes the bound file name. + + There is potential here for a lot of search operations. The trick is + to define .SOURCE.x special targets with short search lists and leave + .SOURCE as short as possible. The search algorithm has the following + useful side effect. When a target having the .LIBMEMBER (library mem- + ber) attribute is searched for, it is first searched for as an ordinary + file. When a number of library members require updating it is desir- + able to compile all of them first and to update the library at the end + in a single operation. If one of the members does not compile and + dmake stops, then the user may fix the error and make again. dmake + will not remake any of the targets whose object files have already been + generated as long as none of their prerequisite files have been modi- + fied as a result of the fix. + + When dmake constructs target pathnames './' substrings are removed and + substrings of the form 'foo/..' are eliminated. This may result in + somewhat unexpected values of the macro expansion $@, but is infact the + corect result. When defining .SOURCE and .SOURCE.x targets the construct @@ -2619,96 +2262,78 @@ DMAKE(p) Unsupported Free Software DMAKE(p) is equivalent to - dmake correctly handles the UNIX Make variable VPATH. By - definition VPATH contains a list of ':' separated directo- - ries to search when looking for a target. dmake maps - VPATH to the following special rule: + dmake correctly handles the UNIX Make variable VPATH. By definition + VPATH contains a list of ':' separated directories to search when look- + ing for a target. dmake maps VPATH to the following special rule: - Which takes the value of VPATH and sets .SOURCE to the - same set of directories as specified in VPATH. + Which takes the value of VPATH and sets .SOURCE to the same set of + directories as specified in VPATH. PERCENT(%) RULES AND MAKING INFERENCES - When dmake makes a target, the target's set of prerequi- - sites (if any) must exist and the target must have a - recipe which dmake can use to make it. If the makefile + When dmake makes a target, the target's set of prerequisites (if any) + must exist and the target must have a recipe which dmake can use to + make it. If the makefile does not specify an explicit recipe for the + target then dmake uses special rules to try to infer a recipe which it + can use to make the target. Previous versions of Make perform this + task by using rules that are defined by targets of the form .<suf- + fix>.<suffix> and by using the .SUFFIXES list of suffixes. The exact + workings of this mechanism were sometimes difficult to understand and -Version 4.01 PL0 UW 40 +Version 4.10 UW 32 -DMAKE(p) Unsupported Free Software DMAKE(p) +DMAKE(1) DMAKE(1) - does not specify an explicit recipe for the target then - dmake uses special rules to try to infer a recipe which it - can use to make the target. Previous versions of Make - perform this task by using rules that are defined by tar- - gets of the form .<suffix>.<suffix> and by using the .SUF- - FIXES list of suffixes. The exact workings of this mecha- - nism were sometimes difficult to understand and often lim- - iting in their usefulness. Instead, dmake supports the - concept of %-meta rules. The syntax and semantics of - these rules differ from standard rule lines as follows: + often limiting in their usefulness. Instead, dmake supports the con- + cept of %-meta rules. The syntax and semantics of these rules differ + from standard rule lines as follows: <%-target> [<attributes>] <ruleop> [<%-prerequisites>] [;<recipe>] - where %-target is a target containing exactly a single `%' - sign, attributes is a list (possibly empty) of attributes, - ruleop is the standard set of rule operators, %-prerequi- - sites , if present, is a list of prerequisites containing - zero or more `%' signs, and recipe, if present, is the - first line of the recipe. - - The %-target defines a pattern against which a target - whose recipe is being inferred gets matched. The pattern - match goes as follows: all chars are matched exactly from - left to right up to but not including the % sign in the - pattern, % then matches the longest string from the actual - target name not ending in the suffix given after the % - sign in the pattern. Consider the following examples: + where %-target is a target containing exactly a single `%' sign, + attributes is a list (possibly empty) of attributes, ruleop is the + standard set of rule operators, %-prerequisites , if present, is a list + of prerequisites containing zero or more `%' signs, and recipe, if + present, is the first line of the recipe. + + The %-target defines a pattern against which a target whose recipe is + being inferred gets matched. The pattern match goes as follows: all + chars are matched exactly from left to right up to but not including + the % sign in the pattern, % then matches the longest string from the + actual target name not ending in the suffix given after the % sign in + the pattern. Consider the following examples: %.c matches fred.c but not joe.c.Z dir/%.c matches dir/fred.c but not dd/fred.c fred/% matches fred/joe.c but not f/joe.c % matches anything - In each case the part of the target name that matched the - % sign is retained and is substituted for any % signs in - the prerequisite list of the %-meta rule when the rule is - selected during inference and dmake constructs the new - dependency. As an example the following %-meta rules - describe the following: + In each case the part of the target name that matched the % sign is + retained and is substituted for any % signs in the prerequisite list of + the %-meta rule when the rule is selected during inference and dmake + constructs the new dependency. As an example the following %-meta + rules describe the following: %.c : %.y ; recipe... - describes how to make any file ending in .c if a corre- - sponding file ending in .y can be found. + describes how to make any file ending in .c if a corresponding file + ending in .y can be found. foo%.o : fee%.k ; recipe... - is used to describe how to make fooxxxx.o from feexxxx.k. + is used to describe how to make fooxxxx.o from feexxxx.k. %.a :; recipe... - describes how to make a file whose suffix is .a without - inferring any prerequisites. - - - - -Version 4.01 PL0 UW 41 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) - + describes how to make a file whose suffix is .a without inferring any + prerequisites. %.c : %.y yaccsrc/%.y ; recipe... @@ -2717,130 +2342,118 @@ DMAKE(p) Unsupported Free Software DMAKE(p) %.c : %.y ; recipe... %.c : yaccsrc/%.y ; recipe... - ie. It is possible to specify the same recipe for two - %-rules by giving more than one prerequisite in the pre- - requisite list. A more interesting example is: + ie. It is possible to specify the same recipe for two %-rules by giving + more than one prerequisite in the prerequisite list. A more interest- + ing example is: % : RCS/%,v ; co $< - which describes how to take any target and check it out of - the RCS directory if the corresponding file exists in the - RCS directory. The equivalent SCCS rule would be: + which describes how to take any target and check it out of the RCS + directory if the corresponding file exists in the RCS directory. The + equivalent SCCS rule would be: % : s.% ; get $< - The previous RCS example defines an infinite rule, because - it says how to make anything from RCS/%,v, and anything - also includes RCS/fred.c,v. To limit the size of the - graph that results from such rules dmake uses the macro - variable PREP (stands for % repetition). By default the - value of this variable is 0, which says that no repeti- - tions of a %-rule are to be generated. If it is set to - something greater than 0, then that many repetitions of - any infinite %-rule are allowed. If in the above example - PREP was set to 1, then dmake would generate the depen- - dency graph: - - % --> RCS/%,v --> RCS/RCS/%,v,v - - Where each link is assigned the same recipe as the first - link. PREP should be used only in special cases, since it - may result in a large increase in the number of possible - prerequisites tested. dmake further assumes that any tar- - get that has no suffix can be made from a prerequisite - that has at least one suffix. + The previous RCS example defines an infinite rule, because it says how + to make anything from RCS/%,v, and anything also includes RCS/fred.c,v. + To limit the size of the graph that results from such rules dmake uses - dmake supports dynamic prerequisite generation for prereq- - uisites of %-meta rules. This is best illustrated by an - example. The RCS rule shown above can infer how to check - out a file from a corresponding RCS file only if the tar- - get is a simple file name with no directory information. - That is, the above rule can infer how to find RCS/fred.c,v - from the target fred.c, but cannot infer how to find - srcdir/RCS/fred.c,v from srcdir/fred.c because the above - rule will cause dmake to look for RCS/srcdir/fred.c,v; - which does not exist (assume that srcdir has its own RCS - directory as is the common case). - A more versatile formulation of the above RCS check out +Version 4.10 UW 33 -Version 4.01 PL0 UW 42 +DMAKE(1) DMAKE(1) -DMAKE(p) Unsupported Free Software DMAKE(p) + the macro variable PREP (stands for % repetition). By default the + value of this variable is 0, which says that no repetitions of a %-rule + are to be generated. If it is set to something greater than 0, then + that many repetitions of any infinite %-rule are allowed. If in the + above example PREP was set to 1, then dmake would generate the depen- + dency graph: + % --> RCS/%,v --> RCS/RCS/%,v,v - rule is the following: + Where each link is assigned the same recipe as the first link. PREP + should be used only in special cases, since it may result in a large + increase in the number of possible prerequisites tested. dmake further + assumes that any target that has no suffix can be made from a prerequi- + site that has at least one suffix. + + dmake supports dynamic prerequisite generation for prerequisites of + %-meta rules. This is best illustrated by an example. The RCS rule + shown above can infer how to check out a file from a corresponding RCS + file only if the target is a simple file name with no directory infor- + mation. That is, the above rule can infer how to find RCS/fred.c,v + from the target fred.c, but cannot infer how to find + srcdir/RCS/fred.c,v from srcdir/fred.c because the above rule will + cause dmake to look for RCS/srcdir/fred.c,v; which does not exist + (assume that srcdir has its own RCS directory as is the common case). + + A more versatile formulation of the above RCS check out rule is the + following: % : $$(@:d)RCS/$$(@:f),v : co $@ - This rule uses the dynamic macro $@ to specify the prereq- - uisite to try to infer. During inference of this rule the - macro $@ is set to the value of the target of the %-meta - rule and the appropriate prerequisite is generated by - extracting the directory portion of the target name (if - any), appending the string RCS/ to it, and appending the - target file name with a trailing ,v attached to the previ- - ous result. - - dmake can also infer indirect prerequisites. An inferred - target can have a list of prerequisites added that will - not show up in the value of $< but will show up in the - value of $? and $&. Indirect prerequisites are specified - in an inference rule by quoting the prerequisite with sin- - gle quotes. For example, if you had the explicit depen- - dency: + This rule uses the dynamic macro $@ to specify the prerequisite to try + to infer. During inference of this rule the macro $@ is set to the + value of the target of the %-meta rule and the appropriate prerequisite + is generated by extracting the directory portion of the target name (if + any), appending the string RCS/ to it, and appending the target file + name with a trailing ,v attached to the previous result. + + dmake can also infer indirect prerequisites. An inferred target can + have a list of prerequisites added that will not show up in the value + of $< but will show up in the value of $? and $&. Indirect prerequi- + sites are specified in an inference rule by quoting the prerequisite + with single quotes. For example, if you had the explicit dependency: fred.o : fred.c ; rule to make fred.o fred.o : local.h - then this can be inferred for fred.o from the following - inference rule: + then this can be inferred for fred.o from the following inference rule: %.o : %.c 'local.h' ; makes a .o from a .c - You may infer indirect prerequisites that are a function - of the value of '%' in the current rule. The meta-rule: + You may infer indirect prerequisites that are a function of the value + of '%' in the current rule. The meta-rule: - %.o : %.c '$(INC)/%.h' ; rule to make a .o from a - .c + %.o : %.c '$(INC)/%.h' ; rule to make a .o from a .c - infers an indirect prerequisite found in the INC directory - whose name is the same as the expansion of $(INC), and the - prerequisite name depends on the base name of the current - target. The set of indirect prerequisites is attached to - the meta rule in which they are specified and are inferred - only if the rule is used to infer a recipe for a target. - They do not play an active role in driving the inference - algorithm. The construct: + infers an indirect prerequisite found in the INC directory whose name + is the same as the expansion of $(INC), and the prerequisite name + depends on the base name of the current target. The set of indirect + prerequisites is attached to the meta rule in which they are specified + and are inferred only if the rule is used to infer a recipe for a tar- + get. They do not play an active role in driving the inference algo- + rithm. The construct: %.o : %.c %.f 'local.h'; recipe is equivalent to: - %.o : %.c 'local.h' : recipe - while: - %.o :| %.c %.f 'local.h'; recipe +Version 4.10 UW 34 -Version 4.01 PL0 UW 43 +DMAKE(1) DMAKE(1) + %.o : %.c 'local.h' : recipe -DMAKE(p) Unsupported Free Software DMAKE(p) + while: + %.o :| %.c %.f 'local.h'; recipe is equivalent to: @@ -2848,27 +2461,23 @@ DMAKE(p) Unsupported Free Software DMAKE(p) %.o : %.f 'local.h' : recipe - If any of the attributes .SETDIR, .EPILOG, .PROLOG, - .SILENT, .USESHELL, .SWAP, .PRECIOUS, .LIBRARY, .NOSTATE - and .IGNORE are given for a %-rule then when that rule is - bound to a target as the result of an inference, the tar- - get's set of attributes is augmented by the attributes - from the above set that are specified in the bound %-rule. - Other attributes specified for %-meta rules are not inher- - ited by the target. The .SETDIR attribute is treated in a - special way. If the target already had a .SETDIR - attribute set then dmake changes to that directory prior - to performing the inference. During inference any .SETDIR - attributes for the inferred prerequisite are honored. The - directories must exist for a %-meta rule to be selected as - a possible inference path. If the directories do not - exist no error message is issued, instead the correspond- - ing path in the inference graph is rejected. - - dmake also supports the old format special target .<suf- - fix>.<suffix> by identifying any rules of this form and - mapping them to the appropriate %-rule. So for example if - an old makefile contains the construct: + If any of the attributes .SETDIR, .EPILOG, .PROLOG, .SILENT, .USESHELL, + .SWAP, .PRECIOUS, .LIBRARY, .NOSTATE and .IGNORE are given for a %-rule + then when that rule is bound to a target as the result of an inference, + the target's set of attributes is augmented by the attributes from the + above set that are specified in the bound %-rule. Other attributes + specified for %-meta rules are not inherited by the target. The .SET- + DIR attribute is treated in a special way. If the target already had a + .SETDIR attribute set then dmake changes to that directory prior to + performing the inference. During inference any .SETDIR attributes for + the inferred prerequisite are honored. The directories must exist for + a %-meta rule to be selected as a possible inference path. If the + directories do not exist no error message is issued, instead the corre- + sponding path in the inference graph is rejected. + + dmake also supports the old format special target .<suffix>.<suffix> by + identifying any rules of this form and mapping them to the appropriate + %-rule. So for example if an old makefile contains the construct: .c.o :; cc -c $< -o $@ @@ -2876,11 +2485,10 @@ DMAKE(p) Unsupported Free Software DMAKE(p) %.o : %.c; cc -c $< -o $@ - Furthermore, dmake understands several SYSV AUGMAKE spe- - cial targets and maps them into corresponding %-meta - rules. These transformation must be enabled by providing - the -A flag on the command line or by setting the value of - AUGMAKE to non-NULL. The construct + Furthermore, dmake understands several SYSV AUGMAKE special targets and + maps them into corresponding %-meta rules. These transformation must + be enabled by providing the -A flag on the command line or by setting + the value of AUGMAKE to non-NULL. The construct .suff :; recipe @@ -2896,183 +2504,148 @@ DMAKE(p) Unsupported Free Software DMAKE(p) %.o : s.%.c ; recipe + In general, a special target of the form .<str>~ is replaced by the + %-rule construct s.%.<str>, thereby providing support for the syntax + used by SYSV AUGMAKE for providing SCCS support. When enabled, these + mappings allow processing of existing SYSV makefiles without modifica- + tions. + dmake bases all of its inferences on the inference graph constructed + from the %-rules defined in the makefile. It knows exactly which tar- + gets can be made from which prerequisites by making queries on the + inference graph. For this reason .SUFFIXES is not needed and is com- + pletely ignored. -Version 4.01 PL0 UW 44 +Version 4.10 UW 35 -DMAKE(p) Unsupported Free Software DMAKE(p) - In general, a special target of the form .<str>~ is - replaced by the %-rule construct s.%.<str>, thereby pro- - viding support for the syntax used by SYSV AUGMAKE for - providing SCCS support. When enabled, these mappings - allow processing of existing SYSV makefiles without modi- - fications. +DMAKE(1) DMAKE(1) - dmake bases all of its inferences on the inference graph - constructed from the %-rules defined in the makefile. It - knows exactly which targets can be made from which prereq- - uisites by making queries on the inference graph. For - this reason .SUFFIXES is not needed and is completely - ignored. - For a %-meta rule to be inferred as the rule whose recipe - will be used to make a target, the target's name must - match the %-target pattern, and any inferred %-prerequi- - site must already exist or have an explicit recipe so that - the prerequisite can be made. Without transitive closure - on the inference graph the above rule describes precisely - when an inference match terminates the search. If transi- - tive closure is enabled (the usual case), and a prerequi- - site does not exist or cannot be made, then dmake invokes - the inference algorithm recursively on the prerequisite to - see if there is some way the prerequisite can be manufac- - tured. For, if the prerequisite can be made then the cur- - rent target can also be made using the current %-meta - rule. This means that there is no longer a need to give a - rule for making a .o from a .y if you have already given a - rule for making a .o from a .c and a .c from a .y. In - such cases dmake can infer how to make the .o from the .y - via the intermediary .c and will remove the .c when the .o - is made. Transitive closure can be disabled by giving the - -T switch on the command line. + For a %-meta rule to be inferred as the rule whose recipe will be used + to make a target, the target's name must match the %-target pattern, + and any inferred %-prerequisite must already exist or have an explicit + recipe so that the prerequisite can be made. Without transitive clo- + sure on the inference graph the above rule describes precisely when an + inference match terminates the search. If transitive closure is + enabled (the usual case), and a prerequisite does not exist or cannot + be made, then dmake invokes the inference algorithm recursively on the + prerequisite to see if there is some way the prerequisite can be manu- + factured. For, if the prerequisite can be made then the current target + can also be made using the current %-meta rule. This means that there + is no longer a need to give a rule for making a .o from a .y if you + have already given a rule for making a .o from a .c and a .c from a .y. + In such cases dmake can infer how to make the .o from the .y via the + intermediary .c and will remove the .c when the .o is made. Transitive + closure can be disabled by giving the -T switch on the command line. - A word of caution. dmake bases its transitive closure on - the %-meta rule targets. When it performs transitive clo- - sure it infers how to make a target from a prerequisite by - performing a pattern match as if the potential prerequi- - site were a new target. The set of rules: + A word of caution. dmake bases its transitive closure on the %-meta + rule targets. When it performs transitive closure it infers how to + make a target from a prerequisite by performing a pattern match as if + the potential prerequisite were a new target. The set of rules: %.o : %.c :; rule for making .o from .c %.c : %.y :; rule for making .c from .y % : RCS/%,v :; check out of RCS file - will, by performing transitive closure, allow dmake to - infer how to make a .o from a .y using a .c as an interme- - diate temporary file. Additionally it will be able to - infer how to make a .y from an RCS file, as long as that - RCS file is in the RCS directory and has a name which ends - in .y,v. The transitivity computation is performed dynam- - ically for each target that does not have a recipe. This - has potential to be costly if the %-meta rules are not - carefully specified. The .NOINFER attribute is used to - - - -Version 4.01 PL0 UW 45 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) - - - mark a %-meta node as being a final target during infer- - ence. Any node with this attribute set will not be used - for subsequent inferences. As an example the node RCS/%,v - is marked as a final node since we know that if the RCS - file does not exist there likely is no other way to make - it. Thus the standard startup makefile contains an entry - similar to: + will, by performing transitive closure, allow dmake to infer how to + make a .o from a .y using a .c as an intermediate temporary file. + Additionally it will be able to infer how to make a .y from an RCS + file, as long as that RCS file is in the RCS directory and has a name + which ends in .y,v. The transitivity computation is performed dynami- + cally for each target that does not have a recipe. This has potential + to be costly if the %-meta rules are not carefully specified. The + .NOINFER attribute is used to mark a %-meta node as being a final tar- + get during inference. Any node with this attribute set will not be + used for subsequent inferences. As an example the node RCS/%,v is + marked as a final node since we know that if the RCS file does not + exist there likely is no other way to make it. Thus the standard + startup makefile contains an entry similar to: .NOINFER : RCS/%,v - Thereby indicating that the RCS file is the end of the - inference chain. Whenever the inference algorithm deter- - mines that a target can be made from more than one prereq- - uisite and the inference chains for the two methods are - the same length the algorithm reports an ambiguity and + Thereby indicating that the RCS file is the end of the inference chain. + Whenever the inference algorithm determines that a target can be made + from more than one prerequisite and the inference chains for the two + methods are the same length the algorithm reports an ambiguity and prints the ambiguous inference chains. - dmake tries to remove intermediate files resulting from - transitive closure if the file is not marked as being PRE- - CIOUS, or the -u flag was not given on the command line, - and if the inferred intermediate did not previously exist. - Intermediate targets that existed prior to being made are - never removed. This is in keeping with the philosophy - that dmake should never remove things from the file system - that it did not add. If the special target .REMOVE is - defined and has a recipe then dmake constructs a list of - the intermediate files to be removed and makes them pre- - requisites of .REMOVE. It then makes .REMOVE thereby - removing the prerequisites if the recipe of .REMOVE says - to. Typically .REMOVE is defined in the startup file as: + dmake tries to remove intermediate files resulting from transitive clo- + sure if the file is not marked as being PRECIOUS, or the -u flag was + not given on the command line, and if the inferred intermediate did not + previously exist. Intermediate targets that existed prior to being + made are never removed. This is in keeping with the philosophy that + dmake should never remove things from the file system that it did not + add. If the special target .REMOVE is defined and has a recipe then + dmake constructs a list of the intermediate files to be removed and + makes them prerequisites of .REMOVE. It then makes .REMOVE thereby + removing the prerequisites if the recipe of .REMOVE says to. Typically + .REMOVE is defined in the startup file as: .REMOVE :; $(RM) $< MAKING TARGETS - In order to update a target dmake must execute a recipe. - When a recipe needs to be executed it is first expanded so - that any macros in the recipe text are expanded, and it is - then either executed directly or passed to a shell. dmake - supports two types of recipes. The regular recipes and - group recipes. + In order to update a target dmake must execute a recipe. When a recipe + needs to be executed it is first expanded so that any macros in the + recipe text are expanded, and it is then either executed directly or + passed to a shell. dmake supports two types of recipes. The regular + recipes and group recipes. - When a regular recipe is invoked dmake executes each line - of the recipe separately using a new copy of a shell if a - shell is required. Thus effects of commands do not gener- - ally persist across recipe lines (e.g. cd requests in a - recipe line do not carry over to the next recipe line). - This is true even in environments such as MSDOS, where - dmake internally sets the current working director to - match the directory it was in before the command was exe- - cuted. - The decision on whether a shell is required to execute a - command is based on the value of the macro SHELLMETAS or - on the specification of '+' or .USESHELL for the current - recipe or target respectively. If any character in the - value of SHELLMETAS is found in the expanded recipe text- +Version 4.10 UW 36 -Version 4.01 PL0 UW 46 +DMAKE(1) DMAKE(1) -DMAKE(p) Unsupported Free Software DMAKE(p) + When a regular recipe is invoked dmake executes each line of the recipe + separately using a new copy of a shell if a shell is required. Thus + effects of commands do not generally persist across recipe lines (e.g. + cd requests in a recipe line do not carry over to the next recipe + line). This is true even in environments such as MSDOS, where dmake + internally sets the current working director to match the directory it + was in before the command was executed. - line or the use of a shell is requested explicitly via '+' - or .USESHELL then the command is executed using a shell, - otherwise the command is executed directly. The shell - that is used for execution is given by the value of the - macro SHELL. The flags that are passed to the shell are - given by the value of SHELLFLAGS. Thus dmake constructs + The decision on whether a shell is required to execute a command is + based on the value of the macro SHELLMETAS or on the specification of + '+' or .USESHELL for the current recipe or target respectively. If any + character in the value of SHELLMETAS is found in the expanded recipe + text-line or the use of a shell is requested explicitly via '+' or + .USESHELL then the command is executed using a shell, otherwise the + command is executed directly. The shell that is used for execution is + given by the value of the macro SHELL. The flags that are passed to + the shell are given by the value of SHELLFLAGS. Thus dmake constructs the command line: $(SHELL) $(SHELLFLAGS) $(expanded_recipe_command) - Normally dmake writes the command line that it is about to - invoke to standard output. If the .SILENT attribute is - set for the target or for the recipe line (via @), then - the recipe line is not echoed. - - Group recipe processing is similar to that of regular - recipes, except that a shell is always invoked. The shell - that is invoked is given by the value of the macro GROUP- - SHELL, and its flags are taken from the value of the macro - GROUPFLAGS. If a target has the .PROLOG attribute set - then dmake prepends to the shell script the recipe associ- - ated with the special target .GROUPPROLOG, and if the - attribute .EPILOG is set as well, then the recipe associ- - ated with the special target .GROUPEPILOG is appended to - the script file. This facility can be used to always - prepend a common header and common trailer to group - recipes. Group recipes are echoed to standard output just - like standard recipes, but are enclosed by lines beginning - with [ and ]. - - The recipe flags [+,-,%,@] are recognized at the start of - a recipe line even if they appear in a macro. For exam- - ple: + Normally dmake writes the command line that it is about to invoke to + standard output. If the .SILENT attribute is set for the target or for + the recipe line (via @), then the recipe line is not echoed. + + Group recipe processing is similar to that of regular recipes, except + that a shell is always invoked. The shell that is invoked is given by + the value of the macro GROUPSHELL, and its flags are taken from the + value of the macro GROUPFLAGS. If a target has the .PROLOG attribute + set then dmake prepends to the shell script the recipe associated with + the special target .GROUPPROLOG, and if the attribute .EPILOG is set as + well, then the recipe associated with the special target .GROUPEPILOG + is appended to the script file. This facility can be used to always + prepend a common header and common trailer to group recipes. Group + recipes are echoed to standard output just like standard recipes, but + are enclosed by lines beginning with [ and ]. + + The recipe flags [+,-,%,@] are recognized at the start of a recipe line + even if they appear in a macro. For example: SH = + all: @@ -3085,62 +2658,54 @@ DMAKE(p) Unsupported Free Software DMAKE(p) +echo hi - The last step performed by dmake prior to running a recipe - is to set the macro CMNDNAME to the name of the command to - execute (determined by finding the first white-space end- - ing token in the command line). It then sets the macro - CMNDARGS to be the remainder of the line. dmake then - expands the macro COMMAND which by default is set to + The last step performed by dmake prior to running a recipe is to set + the macro CMNDNAME to the name of the command to execute (determined by + finding the first white-space ending token in the command line). It + then sets the macro CMNDARGS to be the remainder of the line. dmake + then expands the macro COMMAND which by default is set to COMMAND = $(CMNDNAME) $(CMNDARGS) + The result of this final expansion is the command that will be exe- + cuted. The reason for this expansion is to allow for a different + interface to the argument passing facilities (esp. under DOS) than that + provided by dmake. You can for example define COMMAND to be + COMMAND = $(CMNDNAME) @$(mktmp $(CMNDARGS)) + which dumps the arguments into a temporary file and runs the command -Version 4.01 PL0 UW 47 +Version 4.10 UW 37 -DMAKE(p) Unsupported Free Software DMAKE(p) - The result of this final expansion is the command that - will be executed. The reason for this expansion is to - allow for a different interface to the argument passing - facilities (esp. under DOS) than that provided by dmake. - You can for example define COMMAND to be +DMAKE(1) DMAKE(1) - COMMAND = $(CMNDNAME) @$(mktmp $(CMNDARGS)) - - which dumps the arguments into a temporary file and runs - the command $(CMNDNAME) @/tmp/ASAD23043 - which has a much shorter argument list. It is now up to - the command to use the supplied argument as the source for - all other arguments. As an optimization, if COMMAND is - not defined dmake does not perform the above expansion. - On systems, such as UNIX, that handle long command lines - this provides a slight saving in processing the makefiles. + which has a much shorter argument list. It is now up to the command to + use the supplied argument as the source for all other arguments. As an + optimization, if COMMAND is not defined dmake does not perform the + above expansion. On systems, such as UNIX, that handle long command + lines this provides a slight saving in processing the makefiles. MAKING LIBRARIES - Libraries are easy to maintain using dmake. A library is - a file containing a collection of object files. Thus to - make a library you simply specify it as a target with the - .LIBRARY attribute set and specify its list of prerequi- - sites. The prerequisites should be the object members - that are to go into the library. When dmake makes the - library target it uses the .LIBRARY attribute to pass to - the prerequisites the .LIBMEMBER attribute and the name of - the library. This enables the file binding mechanism to - look for the member in the library if an appropriate - object file cannot be found. dmake now supports Elf - libraries on systems that support Elf and hence supports, - on those systems, long member file names. A small example - best illustrates this. + Libraries are easy to maintain using dmake. A library is a file con- + taining a collection of object files. Thus to make a library you sim- + ply specify it as a target with the .LIBRARY attribute set and specify + its list of prerequisites. The prerequisites should be the object mem- + bers that are to go into the library. When dmake makes the library + target it uses the .LIBRARY attribute to pass to the prerequisites the + .LIBMEMBER attribute and the name of the library. This enables the + file binding mechanism to look for the member in the library if an + appropriate object file cannot be found. dmake now supports Elf + libraries on systems that support Elf and hence supports, on those sys- + tems, long member file names. A small example best illustrates this. mylib.a .LIBRARY : mem1.o mem2.o mem3.o rules for making library... @@ -3149,32 +2714,19 @@ MAKING LIBRARIES # equivalent to: '%.o : %.c ; ...' .c.o :; rules for making .o from .c say - dmake will use the .c.o rule for making the library mem- - bers if appropriate .c files can be found using the search - rules. NOTE: this is not specific in any way to C pro- - grams, they are simply used as an example. - - dmake tries to handle the old library construct format in - a sensible way. The construct lib(member.o) is separated - and the lib portion is declared as a library target. The - new target is defined with the .LIBRARY attribute set and - the member.o portion of the construct is declared as a - prerequisite of the lib target. If the construct - - - -Version 4.01 PL0 UW 48 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) - + dmake will use the .c.o rule for making the library members if appro- + priate .c files can be found using the search rules. NOTE: this is + not specific in any way to C programs, they are simply used as an exam- + ple. - lib(member.o) appears as a prerequisite of a target in the - makefile, that target has the new name of the lib assigned - as its prerequisite. Thus the following example: + dmake tries to handle the old library construct format in a sensible + way. The construct lib(member.o) is separated and the lib portion is + declared as a library target. The new target is defined with the + .LIBRARY attribute set and the member.o portion of the construct is + declared as a prerequisite of the lib target. If the construct + lib(member.o) appears as a prerequisite of a target in the makefile, + that target has the new name of the lib assigned as its prerequisite. + Thus the following example: a.out : ml.a(a.o) ml.a(b.o); $(CC) -o $@ $< @@ -3197,150 +2749,131 @@ DMAKE(p) Unsupported Free Software DMAKE(p) and making a.out then works as expected. - The same thing happens for any target of the form - lib((entry)). These targets have an additional feature in - that the entry target has the .SYMBOL attribute set auto- - matically. - - NOTE: If the notion of entry points is supported by the - archive and by dmake (currently not the case) then dmake - will search the archive for the entry point and return not - only the modification time of the member which defines the - entry but also the name of the member file. This name - will then replace entry and will be used for making the - member file. Once bound to an archive member the .SYMBOL - attribute is removed from the target. This feature is - presently disabled as there is little standardization - among archive formats, and we have yet to find a makefile - utilizing this feature (possibly due to the fact that it - is unimplemented in most versions of UNIX Make). - - Finally, when dmake looks for a library member it must - first locate the library file. It does so by first look- - ing for the library relative to the current directory and - if it is not found it then looks relative to the current - value of $(TMD). This allows commonly used libraries to - be kept near the root of a source tree and to be easily - found by dmake. + The same thing happens for any target of the form lib((entry)). These + targets have an additional feature in that the entry target has the + .SYMBOL attribute set automatically. + -KEEP STATE - dmake supports the keeping of state information for tar- - gets that it makes whenever the macro .KEEP_STATE is +Version 4.10 UW 38 -Version 4.01 PL0 UW 49 +DMAKE(1) DMAKE(1) -DMAKE(p) Unsupported Free Software DMAKE(p) + NOTE: If the notion of entry points is supported by the archive and by + dmake (currently not the case) then dmake will search the archive for + the entry point and return not only the modification time of the member + which defines the entry but also the name of the member file. This + name will then replace entry and will be used for making the member + file. Once bound to an archive member the .SYMBOL attribute is removed + from the target. This feature is presently disabled as there is little + standardization among archive formats, and we have yet to find a make- + file utilizing this feature (possibly due to the fact that it is unim- + plemented in most versions of UNIX Make). - assigned a value. The value of the macro should be the - name of a state file that will contain the state informa- - tion. If state keeping is enabled then each target that - does not poses the .NOSTATE attribute will have a record - written into the state file indicating the target's name, - the current directory, the command used to update the tar- - get, and which, if any, :: rule is being used. When you - make this target again if any of this information does not - match the previous settings and the target is not out - dated it will still be re-made. The assumption is that - one of the conditions above has changed and that we wish - to remake the target. For example, state keeping is used - in the maintenance of dmake to test compile different ver- - sions of the source using different compilers. Changing - the compiler causes the compilation flags to be modified - and hence all sources to be recompiled. + Finally, when dmake looks for a library member it must first locate the + library file. It does so by first looking for the library relative to + the current directory and if it is not found it then looks relative to + the current value of $(TMD). This allows commonly used libraries to be + kept near the root of a source tree and to be easily found by dmake. - The state file is an ascii file and is portable, however - it is not in human readable form as the entries represent - hash keys of the above information. +KEEP STATE + dmake supports the keeping of state information for targets that it + makes whenever the macro .KEEP_STATE is assigned a value. The value of + the macro should be the name of a state file that will contain the + state information. If state keeping is enabled then each target that + does not poses the .NOSTATE attribute will have a record written into + the state file indicating the target's name, the current directory, the + command used to update the target, and which, if any, :: rule is being + used. When you make this target again if any of this information does + not match the previous settings and the target is not out dated it will + still be re-made. The assumption is that one of the conditions above + has changed and that we wish to remake the target. For example, state + keeping is used in the maintenance of dmake to test compile different + versions of the source using different compilers. Changing the com- + piler causes the compilation flags to be modified and hence all sources + to be recompiled. + + The state file is an ascii file and is portable, however it is not in + human readable form as the entries represent hash keys of the above + information. The Sun Microsystem's Make construct .KEEP_STATE : - is recognized and is mapped to .KEEP_STATE:=_state.mk. - The dmake version of state keeping does not include scan- - ning C source files for dependencies like Sun Make. This - is specific to C programs and it was felt that it does not - belong in make. dmake instead provides the tool, cdepend, - to scan C source files and to produce depedency informa- - tion. Users are free to modify cdepend to produce other - dependency files. (NOTE: cdepend does not come with the - distribution at this time, but will be available in a - patch in the near future) + is recognized and is mapped to .KEEP_STATE:=_state.mk. The dmake ver- + sion of state keeping does not include scanning C source files for + dependencies like Sun Make. This is specific to C programs and it was + felt that it does not belong in make. dmake instead provides the tool, + cdepend, to scan C source files and to produce depedency information. + Users are free to modify cdepend to produce other dependency files. + (NOTE: cdepend does not come with the distribution at this time, but + will be available in a patch in the near future) MULTI PROCESSING - If the architecture supports it then dmake is capable of - making a target's prerequisites in parallel. dmake will - make as much in parallel as it can and use a number of - child processes up to the maximum specified by MAXPROCESS - or by the value supplied to the -P command line flag. A - parallel make is enabled by setting the value of MAXPRO- - CESS (either directly or via -P option) to a value which - is > 1. dmake guarantees that all dependencies as speci- - fied in the makefile are honored. A target will not be - made until all of its prerequisites have been made. Note - that when you specify -P 4 then four child processes are - run concurrently but dmake actually displays the fifth - command it will run immediately upon a child process - becomming free. This is an artifact of the method used to - traverse the dependency graph and cannot be removed. If a - parallel make is being performed then the following + If the architecture supports it then dmake is capable of making a tar- + get's prerequisites in parallel. dmake will make as much in parallel + as it can and use a number of child processes up to the maximum speci- + fied by MAXPROCESS or by the value supplied to the -P command line + flag. A parallel make is enabled by setting the value of MAXPROCESS + (either directly or via -P option) to a value which is > 1. dmake + guarantees that all dependencies as specified in the makefile are hon- + ored. A target will not be made until all of its prerequisites have + been made. Note that when you specify -P 4 then four child processes + are run concurrently but dmake actually displays the fifth command it + will run immediately upon a child process becomming free. This is an + artifact of the method used to traverse the dependency graph and cannot + be removed. If a parallel make is being performed then the following restrictions on parallelism are enforced. -Version 4.01 PL0 UW 50 +Version 4.10 UW 39 -DMAKE(p) Unsupported Free Software DMAKE(p) +DMAKE(1) DMAKE(1) - 1. Individual recipe lines in a non-group - recipe are performed sequentially in the - order in which they are specified within the - makefile and in parallel with the recipes of - other targets. - 2. If a target contains multiple recipe defini- - tions (cf. :: rules) then these are per- - formed sequentially in the order in which - the :: rules are specified within the make- - file and in parallel with the recipes of - other targets. + 1. Individual recipe lines in a non-group recipe are per- + formed sequentially in the order in which they are speci- + fied within the makefile and in parallel with the recipes + of other targets. - 3. If a target rule contains the `!' modifier, - then the recipe is performed sequentially - for the list of outdated prerequisites and - in parallel with the recipes of other tar- - gets. + 2. If a target contains multiple recipe definitions (cf. :: + rules) then these are performed sequentially in the order + in which the :: rules are specified within the makefile + and in parallel with the recipes of other targets. - 4. If a target has the .SEQUENTIAL attribute - set then all of its prerequisites are made - sequentially relative to one another (as if - MAXPROCESS=1), but in parallel with other + 3. If a target rule contains the `!' modifier, then the + recipe is performed sequentially for the list of outdated + prerequisites and in parallel with the recipes of other + targets. + + 4. If a target has the .SEQUENTIAL attribute set then all of + its prerequisites are made sequentially relative to one + another (as if MAXPROCESS=1), but in parallel with other targets in the makefile. - Note: If you specify a parallel make then the order of - target update and the order in which the associated - recipes are invoked will not correspond to that displayed - by the -n flag. + Note: If you specify a parallel make then the order of target update + and the order in which the associated recipes are invoked will not cor- + respond to that displayed by the -n flag. CONDITIONALS - dmake supports a makefile construct called a conditional. - It allows the user to conditionally select portions of - makefile text for input processing and to discard other - portions. This becomes useful for writing makefiles that - are intended to function for more than one target host and - environment. The conditional expression is specified as + dmake supports a makefile construct called a conditional. It allows + the user to conditionally select portions of makefile text for input + processing and to discard other portions. This becomes useful for + writing makefiles that are intended to function for more than one tar- + get host and environment. The conditional expression is specified as follows: .IF expression @@ -3351,41 +2884,48 @@ CONDITIONALS ... else text ... .END - The .ELSE and .ELIF portions are optional, and the condi- - tionals may be nested (ie. the text may contain another - conditional). .IF, .ELSE, and .END may appear anywhere in - the makefile, but a single conditional expression may not - span multiple makefiles. + The .ELSE and .ELIF portions are optional, and the conditionals may be + nested (ie. the text may contain another conditional). .IF, .ELSE, + and .END may appear anywhere in the makefile, but a single conditional + expression may not span multiple makefiles. - expression can be one of the following three forms: + expression can be one of the following forms: + String evaluation + <text> | <text> == <text> | <text> != <text> + Numeric evaluation + <text> <= <text> | <text> >= <text> -Version 4.01 PL0 UW 51 + Boolean evaluation + ( <text> ) | <text> || <text> | <text> && <text> + where text is either text or a macro expression. In any case, before + the comparison is made, the expression is expanded. The text portions + are then selected and compared. In the case of the numeric comparisons + the expanded expressions are converted to an integer number. Expres- + sions can be nested with () and the use of || or &&. White space at + the start and end of the text portion is discarded before the compari- + son. This means that a macro that evaluates to nothing but white space + is considered a NULL value for the purpose of the comparison. In the + first case the expression evaluates TRUE if the text is not NULL other- + wise it evaluates FALSE. The remaining two cases both evaluate the + expression on the basis of a string comparison. If a macro expression +Version 4.10 UW 40 -DMAKE(p) Unsupported Free Software DMAKE(p) - <text> | <text> == <text> | <text> != <text> - where text is either text or a macro expression. In any - case, before the comparison is made, the expression is - expanded. The text portions are then selected and com- - pared. White space at the start and end of the text por- - tion is discarded before the comparison. This means that - a macro that evaluates to nothing but white space is con- - sidered a NULL value for the purpose of the comparison. - In the first case the expression evaluates TRUE if the - text is not NULL otherwise it evaluates FALSE. The - remaining two cases both evaluate the expression on the - basis of a string comparison. If a macro expression needs - to be equated to a NULL string then compare it to the - value of the macro $(NULL). You can use the $(shell ...) - macro to construct more complex test expressions. + +DMAKE(1) DMAKE(1) + + + needs to be equated to a NULL string then compare it to the value of + the macro $(NULL). You can use the $(shell ...) macro to construct + more complex test expressions. EXAMPLES # A simple example showing how to use make @@ -3397,25 +2937,24 @@ EXAMPLES b.o : b.c g.h cc b.c -o $@ - In the previous example prgm is remade only if a.o and/or - b.o is out of date with respect to prgm. These dependen- - cies can be stated more concisely by using the inference - rules defined in the standard startup file. The default - rule for making .o's from .c's looks something like this: + In the previous example prgm is remade only if a.o and/or b.o is out of + date with respect to prgm. These dependencies can be stated more con- + cisely by using the inference rules defined in the standard startup + file. The default rule for making .o's from .c's looks something like + this: %.o : %.c; cc -c $(CFLAGS) -o $@ $< - Since there exists a rule (defined in the startup file) - for making .o's from .c's dmake will use that rule for - manufacturing a .o from a .c and we can specify our depen- - dencies more concisely. + Since there exists a rule (defined in the startup file) for making .o's + from .c's dmake will use that rule for manufacturing a .o from a .c and + we can specify our dependencies more concisely. prgm : a.o b.o cc -o prgm $< a.o b.o : g.h - A more general way to say the above using the new macro - expansions would be: + A more general way to say the above using the new macro expansions + would be: SRC = a b OBJ = {$(SRC)}.o @@ -3425,19 +2964,8 @@ EXAMPLES $(OBJ) : g.h - - -Version 4.01 PL0 UW 52 - - - - - -DMAKE(p) Unsupported Free Software DMAKE(p) - - - If we want to keep the objects in a separate directory, - called objdir, then we would write something like this. + If we want to keep the objects in a separate directory, called objdir, + then we would write something like this. SRC = a b OBJ = {$(SRC)}.o @@ -3452,9 +2980,8 @@ DMAKE(p) Unsupported Free Software DMAKE(p) .SOURCE.o : objdir # tell dmake to look here for .o's - An example of building library members would go something - like this: (NOTE: The same rules as above will be used to - produce .o's from .c's) + An example of building library members would go something like this: + (NOTE: The same rules as above will be used to produce .o's from .c's) SRC= a b LIB= lib @@ -3463,13 +2990,25 @@ DMAKE(p) Unsupported Free Software DMAKE(p) prgm: $(LIB) cc -o $@ $(LIB) + + + +Version 4.10 UW 41 + + + + + +DMAKE(1) DMAKE(1) + + $(LIB) .LIBRARY : $(LIBm) ar rv $@ $< rm $< - Finally, suppose that each of the source files in the pre- - vious example had the `:' character in their target name. - Then we would write the above example as: + Finally, suppose that each of the source files in the previous example + had the `:' character in their target name. Then we would write the + above example as: SRC= f:a f:b LIB= lib @@ -3483,102 +3022,77 @@ DMAKE(p) Unsupported Free Software DMAKE(p) rm $< COMPATIBILITY - There are two notable differences between dmake and the - standard version of BSD UNIX 4.2/4.3 Make. - - 1. BSD UNIX 4.2/4.3 Make supports wild card file- - name expansion for prerequisite names. Thus if - a directory contains a.h, b.h and c.h, then a - line like - - - -Version 4.01 PL0 UW 53 + There are two notable differences between dmake and the standard ver- + sion of BSD UNIX 4.2/4.3 Make. + 1. BSD UNIX 4.2/4.3 Make supports wild card filename expansion + for prerequisite names. Thus if a directory contains a.h, + b.h and c.h, then a line like + target: *.h + will cause UNIX make to expand the *.h into "a.h b.h c.h". + dmake does not support this type of filename expansion. + 2. Unlike UNIX make, touching a library member causes dmake to + search the library for the member name and to update the + library time stamp. This is only implemented in the UNIX + version. MSDOS and other versions may not have librarians + that keep file time stamps, as a result dmake touches the + library file itself, and prints a warning. -DMAKE(p) Unsupported Free Software DMAKE(p) + dmake is not compatible with GNU Make. In particular it does not + understand GNU Make's macro expansions that query the file system. + dmake is fully compatible with SYSV AUGMAKE, and supports the following + AUGMAKE features: - target: *.h + 1. GNU Make style include, and if/else/endif directives are + allowed in non-group recipes. Thus, the word include appear- + ing at the start of a line that is not part of a gruop recipe + will be mapped to the ".INCLUDE" directive that damke uses. + Similarly, the words ifeq,ifneq,elif,else, and endif are + mapped to their corresponding dmake equivalents. - will cause UNIX make to expand the *.h into "a.h - b.h c.h". dmake does not support this type of - filename expansion. - - 2. Unlike UNIX make, touching a library member - causes dmake to search the library for the mem- - ber name and to update the library time stamp. - This is only implemented in the UNIX version. - MSDOS and other versions may not have librarians - that keep file time stamps, as a result dmake - touches the library file itself, and prints a - warning. - - dmake is not compatible with GNU Make. In particular it - does not understand GNU Make's macro expansions that query - the file system. - - dmake is fully compatible with SYSV AUGMAKE, and supports - the following AUGMAKE features: - - 1. GNU Make style include, and if/else/endif direc- - tives are allowed in non-group recipes. Thus, - the word include appearing at the start of a - line that is not part of a gruop recipe will be - mapped to the ".INCLUDE" directive that damke - uses. Similarly, the words - ifeq,ifneq,elif,else, and endif are mapped to - their corresponding dmake equivalents. - - 2. The macro modifier expression $(macro:str=sub) - is understood and is equivalent to the expres- - sion $(macro:s/str/sub), with the restriction - that str must match the following regular + 2. The macro modifier expression $(macro:str=sub) is understood + and is equivalent to the expression $(macro:s/str/sub), with + the restriction that str must match the following regular expression: str[ |\t][ |\t]* - (ie. str only matches at the end of a token - where str is a suffix and is terminated by a - space, a tab, or end of line) Normally sub is - expanded before the substitution is made, if you - specify -A on the command line then sub is not - expanded. + (ie. str only matches at the end of a token where str is a + suffix and is terminated by a space, a tab, or end of line) + Normally sub is expanded before the substitution is made, if + you specify -A on the command line then sub is not expanded. - 3. The macro % is defined to be $@ (ie. $% expands - to the same value as $@). + 3. The macro % is defined to be $@ (ie. $% expands to the same + value as $@). - 4. The AUGMAKE notion of libraries is handled cor- - rectly. - 5. When defining special targets for the inference - rules and the AUGMAKE special target handling is +Version 4.10 UW 42 -Version 4.01 PL0 UW 54 +DMAKE(1) DMAKE(1) -DMAKE(p) Unsupported Free Software DMAKE(p) + 4. The AUGMAKE notion of libraries is handled correctly. - enabled then the special target .X is equivalent - to the %-rule "% : %.X". + 5. When defining special targets for the inference rules and the + AUGMAKE special target handling is enabled then the special + target .X is equivalent to the %-rule "% : %.X". - 6. Directories are always made if you specify -A. - This is consistent with other UNIX versions of - Make. + 6. Directories are always made if you specify -A. This is con- + sistent with other UNIX versions of Make. - 7. Makefiles that utilize virtual targets to force - making of other targets work as expected if AUG- - MAKE special target handling is enabled. For - example: + 7. Makefiles that utilize virtual targets to force making of + other targets work as expected if AUGMAKE special target han- + dling is enabled. For example: FRC: myprog.o : myprog.c $(FRC) ; ... @@ -3587,94 +3101,119 @@ DMAKE(p) Unsupported Free Software DMAKE(p) 'dmake -A FRC=FRC' - but fails with a 'don't know how to make FRC' - error message if you do not specify AUGMAKE spe- - cial target handling via the -A flag (or by set- - ting AUGMAKE:=yes internally). + but fails with a 'don't know how to make FRC' error message + if you do not specify AUGMAKE special target handling via the + -A flag (or by setting AUGMAKE:=yes internally). - 8. The MSDOS version of dmake now supports a single - buitin runtime command noop, which returns suc- - cess if requested and does nothing. + 8. The MSDOS version of dmake now supports a single buitin run- + time command noop, which returns success if requested and + does nothing. LIMITS - In some environments the length of an argument string is - restricted. (e.g. MSDOS command line arguments cannot be - longer than 128 bytes if you are using the standard com- - mand.com command interpreter as your shell, dmake text - diversions may help in these situations.) + In some environments the length of an argument string is restricted. + (e.g. MSDOS command line arguments cannot be longer than 128 bytes if + you are using the standard command.com command interpreter as your + shell, dmake text diversions may help in these situations.) PORTABILITY - To write makefiles that can be moved from one environment - to another requires some forethought. In particular you - must define as macros all those things that may be differ- - ent in the new environment. dmake has two facilities that - help to support writing portable makefiles, recursive - macros and conditional expressions. The recursive macros, - allow one to define environment configurations that allow - different environments for similar types of operating sys- - tems. For example the same make script can be used for - SYSV and BSD but with different macro definitions. + To write makefiles that can be moved from one environment to another + requires some forethought. In particular you must define as macros all + those things that may be different in the new environment. dmake has + two facilities that help to support writing portable makefiles, recur- + sive macros and conditional expressions. The recursive macros, allow + one to define environment configurations that allow different environ- + ments for similar types of operating systems. For example the same + make script can be used for SYSV and BSD but with different macro defi- + nitions. + + To write a makefile that is portable between UNIX and MSDOS requires + both features since in almost all cases you will need to define new + recipes for making targets. The recipes will probably be quite differ- + ent since the capabilities of the tools on each machine are different. + Different macros will be needed to help handle the smaller differences + in the two environments. - To write a makefile that is portable between UNIX and - MSDOS requires both features since in almost all cases you - will need to define new recipes for making targets. The - recipes will probably be quite different since the capa- - bilities of the tools on each machine are different. Dif- - ferent macros will be needed to help handle the smaller - differences in the two environments. +FILES + Makefile, makefile, startup.mk (use dmake -V to tell you where the + startup file is) +SEE ALSO + sh(1), csh(1), touch(1), f77(1), pc(1), cc(1) + S.I. Feldman Make - A Program for Maintaining Computer Programs +AUTHOR + Dennis Vadura, dvadura@wticorp.com + Many thanks to Carl Seger for his helpful suggestions, and to Trevor + John Thompson for his many excellent ideas and informative bug reports. + Many thanks also go to those on the NET that have helped in making + dmake one of the best Make tools available. -Version 4.01 PL0 UW 55 +Version 4.10 UW 43 -DMAKE(p) Unsupported Free Software DMAKE(p) -FILES - Makefile, makefile, startup.mk (use dmake -V to tell you - where the startup file is) -SEE ALSO - sh(1), csh(1), touch(1), f77(1), pc(1), cc(1) - S.I. Feldman Make - A Program for Maintaining Computer - Programs +DMAKE(1) DMAKE(1) -AUTHOR - Dennis Vadura, dvadura@wticorp.com - Many thanks to Carl Seger for his helpful suggestions, and - to Trevor John Thompson for his many excellent ideas and - informative bug reports. Many thanks also go to those on - the NET that have helped in making dmake one of the best - Make tools available. BUGS - Some system commands return non-zero status inappropri- - ately. Use -i (`-' within the makefile) to overcome the - difficulty. - - Some systems do not have easily accessible time stamps for - library members (MSDOS, AMIGA, etc) for these dmake uses - the time stamp of the library instead and prints a warning - the first time it does so. This is almost always ok, - except when multiple makefiles update a single library - file. In these instances it is possible to miss an update - if one is not careful. + Some system commands return non-zero status inappropriately. Use -i + (`-' within the makefile) to overcome the difficulty. + + Some systems do not have easily accessible time stamps for library mem- + bers (MSDOS, AMIGA, etc) for these dmake uses the time stamp of the + library instead and prints a warning the first time it does so. This + is almost always ok, except when multiple makefiles update a single + library file. In these instances it is possible to miss an update if + one is not careful. This man page is way too long. WARNINGS - Rules supported by make(1) may not work if transitive clo- - sure is turned off (-T, .NOINFER). + Rules supported by make(1) may not work if transitive closure is turned + off (-T, .NOINFER). + + PWD from csh/ksh will cause problems if a cd operation is performed and + -e or -E option is used. + + Using internal macros such as COMMAND, may wreak havoc if you don't + understand their functionality. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - PWD from csh/ksh will cause problems if a cd operation is - performed and -e or -E option is used. - Using internal macros such as COMMAND, may wreak havoc if - you don't understand their functionality. @@ -3691,6 +3230,6 @@ WARNINGS -Version 4.01 PL0 UW 56 +Version 4.10 UW 44 |