For normal source code projects, when you ask Visual Studio to build the project it will only build it if it is considered out of date. (The documentation for the /build command line switch confirms this.)
However, for setup projects it seems that Visual Studio always builds them, regardless of whether or not the dependencies are up to date. This happens even for a simple scenario where the setup project contains only the primary output of another project.
Why do setup projects behave this way? Is there a way to change this behavior?
The setup project is actually a packaging utility, it will check all of the projects and build them if necessary, but it will create a new package each time that you run it. There is no way to change this behavior that I can see.
I usually set my Build – Configuration Manager to not build the Setup Projects. I then run the build on them when I am wanting to create/update a setup.