One other technique I have seen in makefiles is something like:
for i in *.whatever; do
Usually this is in a top level make file though.
You don't usually need to recompile just because a file was removed (unless that file
is an object file). Deleting source files can leave dangling object files, but a make
clean (before final integration build test) usually sufficient.
Normally, a manifest doesn't include such files anyway. If you delete a source file
you CAN get complex with using ls -C1 *.o, ls -C1 *.src, strip off the suffix and match
source to objects. Any left over object files are deleted. But event that doesn't necessarily
remove the object file - it may exist in a project library. Deleting from a library is
possible, but it leaves the library file in a bit of a fragmented form, and if you are
creating shared libraries, the only way to remove it is to rebuild the shared library.
But this is usually more effort than it is worth to try and remove single intermediate
files. It's just easier (and usually faster) to just make clean, make. Besides testing
that all files required are present.
In the projects I've worked with (Kerberos, X, GCC, Perl...) there are always some
files that are not involved with creating the application. These are usually readme(s)
documentation files, todo lists, suggestions, goals, plans... Nothing to do with
the program as far as make goes, but are important with keeping track of the project