This document describes the recommended coding style for CMake files in KDE, i.e. CMakeLists.txt files and *.cmake files.
To put in in one sentence: be as careful when writing the CMake files as when you are writing C++ code.
Indent all code correctly, i.e. the body of
Use spaces for indenting, 2, 3 or 4 spaces preferably. Use the same amount of spaces for indenting as is used in the rest of the file. Do not use tabs.
Most important: use consistent upper- or lowercasing within one file !
In general, in KDE the all-lowercase style is preferred.
So, this is recommended:
This is also acceptable:
Mixed casing as shown below works too, but should not be done within KDE:
Add_Executable(hello hello.c) aDd_ExEcUtAbLe(blub blub.c)
To make the code easier to read, use empty commands for endforeach(), endif(), endfunction(), endmacro() and endwhile(). Also, use empty else() commands.
For example, do this:
if(FOOVAR) some_command(...) else() another_command(...) endif()
and not this:
if(BARVAR) some_other_command(...) endif(BARVAR)
You are free to use pkg-config in FindXXX.cmake modules, as long as the following conditions are met:
Follow the style guide from CMake when writing some FindFoo.cmake module: cmake-developer(7)
For checking the results inside the Find-module, the macro find_package_handle_standard_args() (coming with CMake) should be used, using the new extended syntax, which supports also version checking.
if(FOO_LIBRARY AND FOO_INCLUDE_DIR) set(FOO_FOUND TRUE) else() ... execute the whole find-logic endif()
should be removed, the find-logic should be executed always. These shortcuts can cause problems e.g. when the same file is used from multiple directories but e.g. with different required versions or components etc.
Also manually quieting the module should not be done:
if ( SQLITE_INCLUDE_DIR AND SQLITE_LIBRARIES ) set(Sqlite_FIND_QUIETLY TRUE) endif ( SQLITE_INCLUDE_DIR AND SQLITE_LIBRARIES )
If find_package_handle_standard_args() is used, this is completely unnecessary, since find_package_handle_standard_args() only prints something if the result has changed compared to the previous run. So if, as in this example, sqlite has already been found, find_package_handle_standard_args() will only print this information during the first CMake run, but not on successive runs.
So, do not add such code. It is unnecessary and makes the modules look more complicated than necessary.