CVS, dates, and versions

Ben Pfaff pfaffben@msu.edu
01 Aug 2001 11:21:19 -0400


Edward Glowacki <glowack2@msu.edu> writes:

> Quoted from Ben Pfaff on Wed, Aug 01, 2001 at 11:01:33AM -0400:
> > Use a makefile?  Something like this:
> > 	version: file0 file1 file2 file3
> > 		date > version
> > Then you can just do `make; cvs ci' and version will be updated
> > whenever file0 or any of its include files changes.
> 
> Yeah, I probably should move to a makefile (using a script to
> generate different forms of output right now).  Could add 
> something like:
> 
> update:
>     make version
>     cvs ci
>     make output # HTML, PS, etc.

That kind of misses the point of a makefile doesn't it?  Why not
write it as

	update: version output
		cvs ci

or if you want to enforce the ordering for some reason then

	update: version
		cvs ci
		$(MAKE) output

Dependencies are your friend.

(Note the use of $(MAKE) above; here's the relevant explanatory
page from the GNU Make manual:

----------------------------------------------------------------------
How the `MAKE' Variable Works
-----------------------------

   Recursive `make' commands should always use the variable `MAKE', not
the explicit command name `make', as shown here:

     subsystem:
             cd subdir && $(MAKE)

   The value of this variable is the file name with which `make' was
invoked.  If this file name was `/bin/make', then the command executed
is `cd subdir && /bin/make'.  If you use a special version of `make' to
run the top-level makefile, the same special version will be executed
for recursive invocations.

   As a special feature, using the variable `MAKE' in the commands of a
rule alters the effects of the `-t' (`--touch'), `-n' (`--just-print'),
or `-q' (`--question') option.  Using the `MAKE' variable has the same
effect as using a `+' character at the beginning of the command line.
*Note Instead of Executing the Commands: Instead of Execution.

   Consider the command `make -t' in the above example.  (The `-t'
option marks targets as up to date without actually running any
commands; see *Note Instead of Execution::.)  Following the usual
definition of `-t', a `make -t' command in the example would create a
file named `subsystem' and do nothing else.  What you really want it to
do is run `cd subdir && make -t'; but that would require executing the
command, and `-t' says not to execute commands.

   The special feature makes this do what you want: whenever a command
line of a rule contains the variable `MAKE', the flags `-t', `-n' and
`-q' do not apply to that line.  Command lines containing `MAKE' are
executed normally despite the presence of a flag that causes most
commands not to be run.  The usual `MAKEFLAGS' mechanism passes the
flags to the sub-`make' (*note Communicating Options to a Sub-`make':
Options/Recursion.), so your request to touch the files, or print the
commands, is propagated to the subsystem.
----------------------------------------------------------------------
)
-- 
"To the engineer, the world is a toy box full of sub-optimized and
 feature-poor toys."
--Scott Adams