I believe that binary names produced by cargo are not stable and subject to change. If you execute cargo build --message-format=json you will get JSON messages on the stdout describing what was build where.
However, if you run with cargo build --verbose, it does output a hash appended to the target, like -C extra-filename=-a7b7cff85ac8d04b but not in the JSON format.
And I think this is almost definitely a bug because for non-workspace projects the output library is copied to target/release/ with a clear name like libsafe_app.so.
Can anyone confirm this before I file an issue to rust-lang/cargo?
I think it's better to open an issue and ask @alexcrichton
But it does seem that workspaces should influence target directory: all crates in the workspace share the same target directory, and different packages in the workspace can have artifacts with the same name, so putting everything directly in target/release does not seem possible.