In cppi (http://git.savannah.gnu.org/cgit/cppi.git), I am now using non- recursive make via subdir-objects, modeled after the way bison does it. I see that "make clean" is inefficient: one "rm -f" per .o file:
rm -fr *.o rm -f *.o rm -f lib/calloc.o rm -f lib/close-stream.o rm -f lib/closeout.o rm -f lib/error.o rm -f lib/exitfail.o rm -f lib/fpending.o rm -f lib/getopt.o rm -f lib/getopt1.o rm -f lib/localcharset.o rm -f lib/malloc.o rm -f lib/mbrtowc.o rm -f lib/mbsinit.o rm -f lib/msvc-inval.o rm -f lib/msvc-nothrow.o rm -f lib/obstack.o rm -f lib/progname.o rm -f lib/quote.o rm -f lib/quotearg.o rm -f lib/realloc.o rm -f lib/stpcpy.o rm -f lib/strerror-override.o rm -f lib/strerror.o rm -f lib/version-etc-fsf.o rm -f lib/version-etc.o rm -f lib/xalloc-die.o rm -f lib/xmalloc.o rm -f lib/xstrtol-error.o rm -f lib/xstrtol.o rm -f lib/xstrtoul.o rm -f src/cppi.o cppi has so few .o files that it's not a problem, but with hundreds (coreutils has over 600), it could be noticeable. Contrast that with its removal of *.o above and of all tests/*.log files using just one rm invocation each, I think it must simply be an oversight. Seems like it'd be worth fixing some day.