I think providing a bit more information than a simple note in the documentation is a good idea.
I don't know if you were implying this or not, but I think the 3 points you listed shouldn't be considered separately. There are really 3 scenarios to think of:
- The developer doesn't know about deprecation (yet).
- The developer knows about deprecation but simply doesn't care since they intend to not use future versions of the library in their current project.
- The developer knows about deprecation and does care about making sure their code stays future-proof in case they might consider upgrading to SFML 3 in the future.
We can differentiate between the first and latter 2 cases through a preprocessor define. By default, deprecation warnings (in all forms) will be enabled, so unless the developer is ignorant and completely oblivious to their own build/testing process, they really cannot oversee this.
Once they get the message and might be annoyed by it, they try to figure out how to get rid of all the warnings. That's where the preprocessor define comes in. Either they care about deprecation or they don't, so they can choose to define SFML_ALLOW_DEPRECATED or not. In the former case, it would lead to all deprecation warnings being disabled, in the latter case, the developer would actively try to address each warning one by one. Either way, once they are done the warnings will disappear.
I don't think we have to go ahead and remove symbols from the library based on deprecation just yet. It is deprecation after all. Linker errors would not be a problem in this case. We only start removing stuff in SFML 3, once developers have had enough warning and time to prepare. If their application fails to link then because of removed features, then it really isn't our fault, we gave them enough warnings.
How we choose to emit warnings has to be considered on a toolchain basis. Like you said, many of the possibilities aren't standardized (or widely available yet), so I think just giving our best effort for the biggest toolchains should satisfy almost all SFML users.
If we did go down the route of emitting warnings to the console during runtime as well, we should really start to consider implementing separate streams like I already mentioned in the past. Dumping everything to sf::err() just seems sloppy if you ask me. We should have in addition to sf::err() something like sf::warn(), sf::info() and sf::debug() as well, which can be disabled in release builds if so desired.