AFAICT uninstall of existing packages in Setup is done in an arbitrary (or possible alphabetical) order. Uninstall needs to be done in the reverse order of package dependancies (if that makes sense) if it is to succeed. i.e. if you build a dependancy graph/tree of all the packages, then the leaves should be uninstalled, then their parents and so on. The problem is that, for example, if the cygwin package is uninstalled, and then another package that has an uninstall script, the script can't run because the cygwin DLL has already been uninstalled.
Chris -- http://www.atomice.com