[gnu.utils.bug] make-3.56 alterations

marta@CSE.OGC.EDU (Marta Kallstrom) (11/18/89)

I have finished porting make-3.56 to the Cogent Research
XTM -- a distributed parallel system with a UNIX-like OS,
based on a Linda communication mechanism.  This is our 
first upgrade since 3.27, which we are shipping with our 
system.  Incidentally, we are very happy with your software!
	
I found two problems in 3.56, which I hope have been fixed
in later versions, but in case they haven't, I'll explain
them.  (I did not run a "diff" on our files since we differ
in more areas than those I am going to mention.)
	
1.  The archiver on the XTM is not compatible with UNIX ar,
so I defined NO_ARCHIVES.  In commands.c, set_file_variables(),
I moved the #endif of the #ifndef NO_ARCHIVES above the "else".  
Otherwise, automatic variables "at" and "percent" are not 
initialized, thus disabling all other automatic variables 
except "star".  (Actually, their value fields are full of
garbage.)

2.  I needed to reinstate return values for three functions:
execute_file_commands(), notice_finished_file(), and remake_file().
Without these return values, if job_slots > 1 (which it often is
on our parallel system), execute_file_commands() no longer
differentitates between targets whose jobs are finished and
those whose jobs are still running.  When execute_file_commands()
returns to remake_file(), the latter routine assumes that all
jobs for the target are finished and sets the file's command_state
to cs_finished, but the file's update_status may not be set, so
an error results.

The changes I made are:

commands.c:
  execute_file_commands(): return integer status
	return 0 on command_state == cs_running
	return file->update_status on command_state == cs_finished
	return 0 on *p == '\0'
	return notice_finished_file(file) on if (status) and 
		and on else if (job_slots == 1)
	return 0 at end of function

remake.c
  notice_finished_file(): return integer status
	return file->update_status at end of function
  remake_file(): return integer status
	status = execute_file_commands(file)
	if (file->command_state == cs_finished) {
	      file->update_status = status;
	      return notice_finished_file(file);
	}else return 0;
  update_file_1():  (no change in declaration)
	file->update_status = remake_file(file)


I hope you can make use of this.

Marta Kallstrom
Software Engineer
Cogent Research, Inc.
marta@cse.ogc.edu