Read Me(Cook) Read Me(Cook) NAME cook - a file construction tool DESCRIPTION The cook program is a tool for constructing files, and maintaining referential integrity between files. It is given a set of files to create, and recipes of how to create and maintain them. In any non-trivial program there will be prerequisites to performing the actions necessary to creating any file, such as include files. The cook program provides a mechanism to define these. When a program is being developed or maintained, the programmer will typically change one file of several which comprise the program. The cook program examines the last- modified times of the files to see when the prerequisites of a file have changed, implying that the file needs to be recreated as it is logically out of date. The cook program also provides a facility for implicit recipes, allowing users to specify how to form a file with a given suffix from a file with a different suffix. For example, to create filename.o from filename.c * Cook is a replacement for * There is a make2cook the traditional make(1) utility included in the tool. distribution to help * Cook is more powerful convert makefiles into than the traditional make cookbooks. tool. * Cook has true variables, * Cook has a simple but not simple macros. powerful string-based * Cook has user defined description language with functions. many built-in functions. This allows sophisticated filename specification and manipulation without loss of readability or performance. * Cook can build in * Cook is able to build parallel. your project with multiple * Cook can distribute parallel threads, with builds across your LAN. support for rules which must be single threaded. It is possible to distribute parallel builds over your LAN, allowing you to turn your network into a virtual parallel build engine. Reference Manual Cook 1 Read Me(Cook) Read Me(Cook) * Cook is able to use * Cook can be configured fingerprints to supplement with an explicit list of file modification times. primary source files. This This allows build allow the dependency graph optimization without to be constructed faster by contorted rules. not going down dead ends, * In addition to walking and also allows better the dependency graph, Cook error messages when the can turn the input rules graph can't be constructed. into a shell script, or a This requires an accurate web page. source file manifest. * Cook runs on almost any * Cook has special cascade flavor of UNIX. The source dependencies, allowing distribution is self powerful include dependency configuring using a GNU specification, amongst Autoconf generated other things. configure script. If you are putting together a source-code distribution and planning to write a makefile, consider writing a cookbook instead. Although Cook takes a day or two to learn, it is much more powerful and a bit more intuitave than the traditional make(1) tool. And Cook doesn't interpret tab differently to 8 space characters! ARCHIVE SITE The latest version of cook is available on the Web from: URL: http://www.canb.auug.org.au/~millerp/cook/ File: cook-2.16.README # the README from the tar file File: cook-2.16.lsm # LSM format description File: cook-2.16.spec # RedHat package specification File: cook-2.16.rm.ps.gz # PostScript of the Reference Manual File: cook-2.16.ug.ps.gz # PostScript of the User Guide File: cook-2.16.tar.gz # the complete source This Web page also contains a few other pieces of software written by me. Please have a look if you are interested. Cook is also carried by sunsite.unc.edu in its Linux archives. You will be able to find Cook on any of its mirrors. URL: ftp://sunsite.unc.edu/pub/Linux/devel/make/ File: cook-2.16.README # the README from the tar file File: cook-2.16.lsm # LSM format description File: cook-2.16.spec # RedHat package specification File: cook-2.16.rm.ps.gz # PostScript of the Reference Manual File: cook-2.16.ug.ps.gz # PostScript of the User Guide File: cook-2.16.tar.gz # the complete source This site is extensively mirrored around the world, so look for a copy near you (you will get much better response). Reference Manual Cook 2 Read Me(Cook) Read Me(Cook) MAILING LIST A mailing list has been created so that users of cook may exchange ideas about how to use the cook program. Discussion may include, but is not limited to: bugs, enhancements, and applications. The list is not moderated. The address of the mailing list is cook-users@canb.auug.org.au Please DO NOT send subscribe requests to this address. To subscribe to this mailing list, send an email message to majordomo@canb.auug.org.au with a message body containing the single line subscribe cook-users If you have an email address which is not readily derived from your mail headers (majordomo is only a Perl program, after all) you will need to use a message of the form: subscribe cook-users address where address is the email address to which you want messages sent. The software which handles this mailing list CANNOT send you a copy of the cook program. BUILDING COOK Full instructions for building the cook program may be found in the BUILDING file included in this distribution. COPYRIGHT cook version 2.16 Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 Peter Miller; All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. It should be in the LICENSE file included with this distribution. Reference Manual Cook 3 Read Me(Cook) Read Me(Cook) AUTHOR Peter Miller E-Mail: millerp@canb.auug.org.au /\/\* WWW: http://www.canb.auug.org.au/~millerp/ Reference Manual Cook 4 Read Me(Cook) Read Me(Cook) NEW IN THIS RELEASE A number of features have been added to cook with this release. The following list is only a summary; for excruciating detail, and also acknowlegements of those who generously sent me feedback, please see the etc/CHANGES.* files included in this distribution. Version 2.16 * The stringset function now accepts a `+' operator. While union is implicit, the apparrently redundant `+' operator is useful for cancelling the other operators. * The ``reason and fingerprint bug'' has been fixed. This caused a mysterious error message to appear sometimes when using the -reson option incombination with fingerprints. * The % and %n patterns are now allowed to match the empty string, provided they aren't the first thing in the pattern (otherwise undesirable absolute path problems can occur). * The c_incl(1) command now accepts `-' as a file name on the command line, meaning standard input. * Some improvements have been made to the Cygwin support, extending the ``.exe'' automatic executable suffix coverage to a couple more places. * A bug in the ``c'' cookbook has been fixed, which was getting .h dependency files wrong. Version 2.15 * The C_incl(1) problem with absolute paths has been fixed. * A bug has been fixed which caused problems on Solaris and SGI, where Cook would report a No child processes error. Version 2.12 Reference Manual Cook 5 Read Me(Cook) Read Me(Cook) * The c_incl program now has a -quote-filenames option, which means that you can have filenames with spaces and special characters in them. * A bug in the c_incl program's path flattening has been fixed. * A small Y2K bug has been fixed in the date parsing used by the cooktime(1) command. * A bug which caused the -parallel option to lose track of processes when you used [execute] in a recipe body has been fixed. * The restrictions on the placement of the placement of %0 in a pattern have been dropped; too many people didn't like it. This does not break any cookbooks. * Cook now copes with the absence of the HOME environment variable. This was a problem for CGI scripts. Version 2.11 * Numerous portability problems have been fixed in the configure and build. * A bug has been fixed which prevented Cook from working correctly when run by some versions of cron(8) and at(1). * There is a new cook_bom --ignore option, allowing you to nominate file patterns that you don't want in the file lists. * There is a new [__FUNCTION__] variable, which contains the name of the executing function, which suppliments the existing [__FILE__] and [__LINE__] variables. * Functions now have local variables, just put the word local on the left-hand-side of the first assignment. Local variables are reentrant and thread-safe. Version 2.10 Reference Manual Cook 6 Read Me(Cook) Read Me(Cook) * The [print] and [write] functions now work more sensably with the -SCript option. * The fingerprint code has been improved. It now does considerably fewer redundant fingeprint calculations, resulting is some very welcome speed improvements. * The behaviour of the remote shell invocation to cope with rshd at the remote end failing to spawn a shell, and it copes with the default shell at the remote end not being the Bourne shell. * The -PARallel behaviour has been improved, so that it now looks for child process who have finished more than it looks for recipes to run. This doesn't change the semantics any, but it matches user expectations far better (and results in shorter-lived zombie processes). * The set meter recipe flag works once more. (It stopped working when the parallel modifications were made, and mysteriously forgotten until now.) * There are some changes made to the fingerprinting code to detect when files under ClearCase move backwards in time (because the underlying file version is ``uncovered'') meaning that the derived (object) files need to be rebuilt. * There is a new [mtime-seconds] function, similar to the [mtime] function, except that it returns seconds since the epoch, rather than a human readable date. More useful to handing to [expr]. * A bug has been fixed on SGI IRIX which failed to cope with not being able to create directories because they already exist. * Ingredient recipes (ones with no body) may now have a double colon rather than a single colon, even when there is more than on target specified. Some users may find this a more natural syntax for ingredients recipes. * The [expr] function now reports an error when given a number too big to represent, rather than quietly returning wrong answers. The range of representable values depends on your system. * Cook now works with GNU Regex correctly on Windows-NT. Version 2.9 Reference Manual Cook 7 Read Me(Cook) Read Me(Cook) * There is a new ``for each'' style looping construct. See the User Guide for more information. * It is now possible to use regular expression patterns, instead of Cook's native patterns. You can set this for a whole cookbook or individual recipes. The default is to use Cook's native patterns. See the File Name Patterns chapter of the User Guide for more information. * A bug which caused host-binding and single-thread to core dump has been fixed. * All text file input now copes with CRLF sequences, so mixing NT and Unix builds on the one file server no longer creates problems. * Fingerprints are now cached per-directory, rather than one huge file for an entire directory tree. This is more useful in recursive build and [search_list] situations. * The [cando], [cook] and [uptodate] functions now return lists of successful files, rather than a simple true/false result. * The [in] and [matches] functions now return the list index (1 based) of the matching word. See the User Guide for more information. * There is a new cook -web option, to print a HTML web page on the standard output, representing the dependency graph. This is useful in documenting the build process, or debugging cookbooks. * There is a new cook --fingerprint-update option which scans the directory tree below the current directory and updates the file fingerprints. This helps when you use another tool (such as RCS or ClearCase) which alters the file but preserves the file's modification time. * There is a new [write] function for writing text files. This is useful for coping with Windows-NT's absurdly short command lines. Version 2.8 Reference Manual Cook 8 Read Me(Cook) Read Me(Cook) * The remote host-binding code has been improved to cope with staggeringly long commands (which tended to make rsh(1) barf), and also wierd and wonderfull $SHELL settings. * The #include directive now accepts more than one file, to be more symmetric with the #include-cooked directive. * A bug has been fixed where cooktime gave an incorrect error message if setting the file's utimes failed. * The configure script has been improved for use on non- UNIX systems. * There is a new builtin [cook] function, a natural companion for the [cando] and [uptodate] functions. See the Cook User Guide for more information. Version 2.7 * There is a new cook_bom(1) command (Bill Of Materials). This may be used to efficiently scan a directory tree for files, so that ingredients lists may be produced automatically. See cook_bom(1) for more information. * There is a new assign-append statement, so you can now use += to append to the value of a variable. See the User Guide for more information. * There is a new gate-first recipe flag, which causes the recipe gate to be evaluated before the ingredients are derived, rather than after. * The c_incl(1) command has a new --interior-files option, so you can tell it about include files that don't exist yet. This is helpful when they are generated, i.e. they are interior files of the dependency graph, hence the option name. * There is a new [interior-files] function, which returns the files interior to the dependency graph (constructed by a recipe), and a complementatry [leaf-files] function, which returns the leaf files of the dependency graph (not constructed by any recipe). * There is a new ``no-include-cooked-warning'' flag, if you want to suppress the warnings about derived file dependencies in include-cooked files. * There is a new relative_dirname built-in function, similar to the existing dirname function, but it returns ``.'' for files with no directory part, rather than the absolute path of the current directory. Reference Manual Cook 9 Read Me(Cook) Read Me(Cook) Version 2.6 * Cook has been ported to Windows-NT using CygWin32. See the BUILDING file for details. * There are two new functions (dos-path and un-dos-path) for use when invoking non-CygWin32 WindowsNT programs. See the Cook User Guide for more information. * Fingerprints now work meaningfully with directories. * A bug has been fixed in the pattern matching code. It would sometimes cause core dumps. * A bug involving fingerprints in combination with the search_list has been fixed. Cook would occasionally conclude that a shallow target was up-to-date when a shallow ingredient was edited to be the same as a deeper ingredient. * A bug has been fixed in cooktime. It would use an inappropriate timezone offset on some systems. Release 2.5 * A problem which caused some tests to fail on Solaris' tmpfs now has a work-around. * The ``setenv'' statement has finally been documented. It's been in the code tfor years, but I could never figure out why folks weren't using it! * A number of build problems on various systems have been fixed. Release 2.4 * There is a new form of dependencies. Known as cascaded dependencies, they allow the user to associate additional dependencies with an ingredient. For example, a C source file can be associated with cascaded include dependencies. This means that all files which depend on the C source file, also depend on the included files. The Cook Reference Manual has been updated to include this new functionality. * There is a new section of the Cook Reference Manual giving suggestions and a template for building large projects. * There is a new [expr] function, to calculate simple arithmetic expressions. See the User Guide for more information. * There is a new c_incl -no-recursion option, to prevent scanning nested includes. This is of most use when combined with the new cascade dependencies. Reference Manual Cook 10 Read Me(Cook) Read Me(Cook) * There is a new [exists-symlink] function, which may be used to test for the existence of symlinks. The [exists] function follows symbolic links, and is not useful when manipulating the links themselves. Release 2.3 * There are 6 new special variables: graph_leaf_file, graph_leaf_pattern, graph_interior_file, graph_interior_pattern, graph_exterior_file and graph_exterior_pattern. These variables may be used to define the leaves of the derivation graph (the accept forms), and non-leave of the graph (the reject forms). This can make the graph derivation faster, and greatly improves some error messages. This functionality is of most use when you have an exact source file manifest, e.g. from a software configuration management system. See the User Guide for more information. * The %0 pattern element has been extended to permit the matching of absolute paths. Release 2.2.2 * There is a new statement type, allowing functions to be invoked as subroutines in any place where a command may be invoked. See the User Guide for more information. * A number of problems with installing Cook have been fixed. This includes changing -mgm to -mm for the documnetation formatting, and missing include dependencies and missing rules for installing the man pages. * There is a new ``print'' builtin function. When combined with the new function call statement, this provides a way of printing information without invoking ``echo''. See the User Guide for more information. * Cook now defaults the language to ``en'' internally if neoither the LANG nor LANGUAGE environment variable was set. This gives better error messages. Release 2.2.1 * A bug was fixed where a recipe would fail to trigger if some, but not all, of its targets were not present, but the existing targets were up-to-date. This bug was introduced in the inference engine re-write. Release 2.2 Reference Manual Cook 11 Read Me(Cook) Read Me(Cook) * The c_incl utility has had two new languages added. It now understands M4, and also has an ``optimistic'' language which can scan many assemblers and even some high-level languages. See c_incl(1) for more information. * The c_incl utility also has a new --no-absolute-path option, to supress scanning and reporting of such files. See c_incl(1) for more information. * There is a new warning added for dependencies on derived ingredients when this information resides solely in derived cookbooks included using the #include-cooked facility. This assists in detecting problems which may preclude a successful ``clean'' build. * This release adds a number of cookbook functions to the distrubuted cookbooks. These may be used by adding a #include "functions" line to your cookbook. See the Cook User Guide for more information. * This release fixes a bug where the graph walking phase ignored interrupts until something went wrong. * This release fixes a bug where make2cook did not correctly translate ``%'' into sematicly equivalent Cook constructs. Release 2.1 * It is possible to specify that a command is to be executed on a specific machine or machines. This can be useful for restrictively licensed third party software tools. * The parallel functionality has been extended to implement a virtual parallel machine on a LAN. * Fingerprinting has been enhanced to be more informative, and to adjust file modification times so that subsequest fingerprint-less runs will not find too much to do. * The #line directive is now available, for better diagnostics of generated cookbooks. The __FILE__ and __LINE__ variable are also available. * There is now a thread-id variable, to obtain a thread- unique value for use in generating temporary file names or variable names, etc, which are unique to a thread. * Added the wordlist function and the command-line-goals variable for compatibility with GNU Make. Updated make2cook to understand them. Reference Manual Cook 12 Read Me(Cook) Read Me(Cook) Release 2.0.1 * An install problem in the generated Makefile, to do with the the manuals, has been fixed. Release 2.0 Development of this release was generously supported by Endocardial Solutions, Inc. * Parallel execution is now supported. If you have a multi-processor machine, you can specify the number of parallel processing threads with the -PARallel command line option, or via the [parallel_jobs] variable. By using the [os node] function, the [parallel_jobs] variable can be set appropriately for the host machine automatically by the cookbook. There is a new single- thread keyword to support single threading recipes which cannot be paralleized. * The dependency graph is now constructed differently. This gives exactly the same results, but the order of evaluation of recipes is a little more random. This different graph construction is able to give better error messages, better -Reason information, and allows the introduction of parallel recipe evaluation if you have a multi-processor computer. * Recipes which use c_incl(1) to calculate their dependencies in the ingredients section will need a small modification - they will need to use the --Absent-Program- Ignore option. See the User Guide for more information. * You can now print pair-wise file dependencies by using the -PAirs option. * You can now print a shell script which approximates the actions cook would take when building the targets by using the -SCript option. * There is a new ``shallow'' recipe flag, allowing you to specify that the targets of a recipe are required to be in the top-level directory, not further down the search_list path. * You may now define user-written functions in the cookbook to supplement the built-in functions. Your functions will be called in the same manner as built-in functions. There are new function and return keywords to support definition of functions. * The progress indicators produced by the -STar option now have more detail: + means that the cook book is being read, * means that the graph is being constructed, and # means that the graph is being walked. Reference Manual Cook 13 Read Me(Cook) Read Me(Cook) Release 1.11 * Fixed a bug in the pattern matching which caused %0 (when not at the start of the pattern) to fail to match the empty string. * The install locations have been changed slightly to conform better to the GNU filesystem standards, and to take advantage of the additional install location options of the configure scripts generated by GNU Autoconf. Release 1.10 * Error messages have been internationalized. It is now possible to get error messages in your native language, if it is supported. * The cook command now accepts a -no-include-cooked option, to disable any cooking of the #include-cooked files. * The cook -TRace option has been renamed -Reason. This is thought to more accurately reflect what it does. * The cook -Reason output has been changed to cite cookbook file names and line numbers, in order to be more useful. In addition, more reason messages carry location information. Release 1.9 * There are new ``f77'' and ``g77'' cookbooks, to allow Fortran sources, in addition to C sources. * There is a new [options] function, which expands to the current settings of the command line options. This is useful for recursive cook directory structures. See the Reference Manual for more information. * There is a new ``recursive'' cookbook, to assist in constructing recursive cook structures. * The find_libs program now understands about shared libraries. * A bug which made the builtin [glob] function far to generous has been corrected. * A bug which caused some expression evaluation errors to be ignored has been corrected. * The ``set update'' flag has been re-named the ``set time-adjust'' flag, to more closely describe what it does. The old name will continue to work indefinitely. * There is a new ``set time-adjust-back'' flag, which sets recipe target times to be exactly one (1) second younger Reference Manual Cook 14 Read Me(Cook) Read Me(Cook) than the youngest ingredient. This is usually an adjustment into the recent past. Release 1.8 * The fingerprint code has been improved to work better with the search_list functionality. * The diagnostics have been improved when cook ``don't know how''. A list of attempted ingredients is included in the error message. * There is a new mkdir recipe flag. This creates recipe target directories before the recipe body is run. See the Reference Manual for more information. * There is a new unlink recipe flag. This unlinks recipe targets before the recipe body is run. See the Reference Manual for more information. * There is a new recurse recipe flag. This overrides the infinite loop recipe heuristic, allowing recipes to recuse upon themselves if one of their ingredients matches one of their targets. See the Reference Manual for more information. Release 1.7 * The AIX code to handle archive files has been fixed. * The fingerprint code now works on 64-bit systems. Release 1.6 * Fixed a bug in the leading-dot removal code, and added an option to make it user-settable. Fixed a bug in the search_path depth code. Release 1.5 * The c_incl program now correctly prints the names of absent include files, causing them to be cooked correctly in a greater number of cases. * Recipes with no ingredients are now only applied if the target is absent. To still use the previous behaviour, use the "set force" clause on the recipe. * It is now possible to supplement the last-modified time with a fingerprint, so cook does even fewer unnecesary recompilations than before. Put the statement set fingerprint; somewhere near the top of your Howto.cook file for this to be the default for your project. * There is a new form of include directive: #include-cooked filename... When files are included in this way, cook will check to Reference Manual Cook 15 Read Me(Cook) Read Me(Cook) make sure they are up-to-date. If not, they will be cooked, and then cook will start again and re-read the cookbook. This is most often used for maintaining include-dependency files. * Cook now configured using a program called configure, distributed with the package. The configure program is generated by GNU Autoconf. See the BUILDING file for more details. * The semantics of search_list have been improved. It is now guaranteed that when ingredients change they result in targets earlier in the search_list being updated. * There is now a make2cook translator, to translate Makefile files into Howto.cook files. Most of the GNU Make extensions are understood. There is no exact semantic mapping between make and cook, so manual editing is sometimes required. See make2cook(1) for more information. * Cook now understands archive member references, in the same format as used by make, et al. Archive member references benefit from stat caching and fingerprinting, just as normal files do. Release 1.4 * The cook program is now known to work on more systems. Most changes were aimed at improving portability, or avoiding problems specific to some systems. * The GNU long option name convention is now understood. Option names for cook were always long, so this mostly consists of ignoring the extra leading '-'. The "--foo=bar" convention is also understood for options with arguments. * Tests which fail now tell you what it was they were testing for. This will give the user some idea of what is happening. Reference Manual Cook 16