(*abortProc) ("make: don't know how to make %s. Stop", gn->name); return(FALSE);
(*abortProc)("%s %s. Stop", msg, gn->name); return FALSE;
Job_CheckCommands (gn, abortProc)    GNode          *gn;	    	    /* The target whose commands need				     * verifying */    void    	  (*abortProc) __P((char *, ...));   			/* Function to abort with message */{    if (OP_NOP(gn->type) && Lst_IsEmpty (gn->commands) &&	(gn->type & OP_LIB) == 0) {	/*	 * No commands. Look for .DEFAULT rule from which we might infer	 * commands 	 */	if ((DEFAULT != NILGNODE) && !Lst_IsEmpty(DEFAULT->commands)) {	    char *p1;	    /*	     * Make only looks for a .DEFAULT if the node was never the	     * target of an operator, so that's what we do too. If	     * a .DEFAULT was given, we substitute its commands for gn's	     * commands and set the IMPSRC variable to be the target's name	     * The DEFAULT node acts like a transformation rule, in that	     * gn also inherits any attributes or sources attached to	     * .DEFAULT itself.	     */	    Make_HandleUse(DEFAULT, gn);	    Var_Set (IMPSRC, Var_Value (TARGET, gn, &p1), gn);	    if (p1)		free(p1);	} else if (Dir_MTime (gn) == 0) {	    /*	     * The node wasn't the target of an operator we have no .DEFAULT	     * rule to go on and the target doesn't already exist. There's	     * nothing more we can do for this branch. If the -k flag wasn't	     * given, we stop in our tracks, otherwise we just don't update	     * this node's parents so they never get examined. 	     */	    if (gn->type & OP_OPTIONAL) {		printf ("make: don't know how to make %s (ignored)\n",			gn->name);	    } else if (keepgoing) {		printf ("make: don't know how to make %s (continuing)\n",			gn->name);		return (FALSE);	    } else {		(*abortProc) ("make: don't know how to make %s. Stop",			     gn->name);		return(FALSE);	    }	}    }    return (TRUE);}