Use ${PROJECT_NAME} instead of repeating the project name manually.
Use REQUIRED on all calls to find_package if they aren’t actually optional (i.e. you’re not going to check thing_FOUND and enable/disable features).
Whenever using a list of items (i.e. in find_package(COMPONENTS ...) or files which should be build or installed) keep them alphabetically sorted. This improves readability when looking for specific items. (There are exceptions which require a specific custom order like the list of projects inside a stack).
Optional functionality that depends on user-provided values should be enabled via cache variables that are set to OFF by default, e.g.:
set(CATKIN_DOCS_DEPLOY_DESTINATION "OFF" CACHE STRING
"Deploy destination for docs, or OFF. Will be passed to rsync; may contain user@ syntax for ssh"
)
[later in CMakeLists.txt]
if(CATKIN_DOCS_DEPLOY_DESTINATION)
add_custom_target(sphinx-deploy)
endif()