CMake coding standards ---------------------- Use ${PROJECT_NAME} wherever possible ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use ``${PROJECT_NAME}`` instead of repeating the project name manually. find_package(... REQUIRED) ^^^^^^^^^^^^^^^^^^^^^^^^^^ 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). Keep lists *sorted* ^^^^^^^^^^^^^^^^^^^ 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 features ^^^^^^^^^^^^^^^^^ 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()