MSBuild will always build a project. However it may not build all of the targets inside of the project. This will depend on whether or not the outputs produced by the targets are up to date with respect to the inputs.
When MSBuild builds a project it will compare the inputs of the targets with the outputs of the targets based on the timestamp of these inputs and outputs. If the inputs are newer then the outputs then the target will build.
This partial building of a project is called incremental build. Here is a link to the msdn site which explains how incremental build works:
Note that GenerateResource works a little differently -- the task itself does the timestamp comparision.
To see why MSBuild chose to build or not, build with diagnostic verbosity (/v:diag) and look at the log