add_custom_target needs intermediate target

This works:

add_custom_target(foo COMMAND crunsh)
add_dependencies(foo bar)
add_custom_target(top)
add_dependencies(top foo)

This does not:

add_custom_target(top COMMAND crunsh)
add_dependencies(top bar)

With the latter, command make top will immediately execute crunsh without waiting for bar to be finished.

Why?

Are there alternatives to the stammering four-line solution?

Can you please provide a full example?