'make uninstall' might work if the software is sane and well-written, and if the operator is careful.
But how do you handle upgrades? 'make uninstall' the old version, then 'make install' the new stuff? What if it's some critical piece, like base utils or the shell, and something goes wrong in between? What if you skip 'make uninstall' during upgrades, will the version n+1 know to delete files removed in versions n, n-1, n-k? Package managers, or self-contained apps, they solve all of these problems once and for everyone. 'make whatever' has to solve each corner case again and again. Or in other words, executable code makes for a very poor metadata format. <3,K.