648db22b |
1 | # Cmake contributions |
2 | |
3 | Contributions to the cmake build configurations are welcome. Please |
4 | use case sensitivity that matches modern (i.e. cmake version 2.6 and above) |
5 | conventions of using lower-case for commands, and upper-case for |
6 | variables. |
7 | |
8 | ## How to build |
9 | |
10 | As cmake doesn't support command like `cmake clean`, it's recommended to perform an "out of source build". |
11 | To do this, you can create a new directory and build in it: |
12 | ```sh |
13 | cd build/cmake |
14 | mkdir builddir |
15 | cd builddir |
16 | cmake .. |
17 | make |
18 | ``` |
19 | Then you can clean all cmake caches by simply delete the new directory: |
20 | ```sh |
21 | rm -rf build/cmake/builddir |
22 | ``` |
23 | |
24 | And of course, you can directly build in build/cmake: |
25 | ```sh |
26 | cd build/cmake |
27 | cmake |
28 | make |
29 | ``` |
30 | |
31 | To show cmake build options, you can: |
32 | ```sh |
33 | cd build/cmake/builddir |
34 | cmake -LH .. |
35 | ``` |
36 | |
37 | Bool options can be set to `ON/OFF` with `-D[option]=[ON/OFF]`. You can configure cmake options like this: |
38 | ```sh |
39 | cd build/cmake/builddir |
40 | cmake -DZSTD_BUILD_TESTS=ON -DZSTD_LEGACY_SUPPORT=OFF .. |
41 | make |
42 | ``` |
43 | |
f535537f |
44 | ### how to use it with CMake FetchContent |
45 | |
46 | For all options available, you can see it on <https://github.com/facebook/zstd/blob/dev/build/cmake/lib/CMakeLists.txt> |
47 | ```cmake |
48 | include(FetchContent) |
49 | |
50 | set(ZSTD_BUILD_STATIC ON) |
51 | set(ZSTD_BUILD_SHARED OFF) |
52 | |
53 | FetchContent_Declare( |
54 | zstd |
55 | URL "https://github.com/facebook/zstd/releases/download/v1.5.5/zstd-1.5.5.tar.gz" |
56 | DOWNLOAD_EXTRACT_TIMESTAMP TRUE |
57 | SOURCE_SUBDIR build/cmake |
58 | ) |
59 | |
60 | FetchContent_MakeAvailable(zstd) |
61 | |
62 | target_link_libraries( |
63 | ${PROJECT_NAME} |
64 | PRIVATE |
65 | libzstd_static |
66 | ) |
67 | |
68 | # On windows and macos this is needed |
69 | target_include_directories( |
70 | ${PROJECT_NAME} |
71 | PRIVATE |
72 | ${zstd_SOURCE_DIR}/lib |
73 | ) |
74 | ``` |
75 | |
648db22b |
76 | ### referring |
77 | [Looking for a 'cmake clean' command to clear up CMake output](https://stackoverflow.com/questions/9680420/looking-for-a-cmake-clean-command-to-clear-up-cmake-output) |
78 | |
79 | ## CMake Style Recommendations |
80 | |
81 | ### Indent all code correctly, i.e. the body of |
82 | |
83 | * if/else/endif |
84 | * foreach/endforeach |
85 | * while/endwhile |
86 | * macro/endmacro |
87 | * function/endfunction |
88 | |
89 | Use spaces for indenting, 2, 3 or 4 spaces preferably. Use the same amount of |
90 | spaces for indenting as is used in the rest of the file. Do not use tabs. |
91 | |
92 | ### Upper/lower casing |
93 | |
94 | Most important: use consistent upper- or lowercasing within one file ! |
95 | |
96 | In general, the all-lowercase style is preferred. |
97 | |
98 | So, this is recommended: |
99 | |
100 | ``` |
101 | add_executable(foo foo.c) |
102 | ``` |
103 | |
104 | These forms are discouraged |
105 | |
106 | ``` |
107 | ADD_EXECUTABLE(bar bar.c) |
108 | Add_Executable(hello hello.c) |
109 | aDd_ExEcUtAbLe(blub blub.c) |
110 | ``` |
111 | |
112 | ### End commands |
113 | To make the code easier to read, use empty commands for endforeach(), endif(), |
114 | endfunction(), endmacro() and endwhile(). Also, use empty else() commands. |
115 | |
116 | For example, do this: |
117 | |
118 | ``` |
119 | if(FOOVAR) |
120 | some_command(...) |
121 | else() |
122 | another_command(...) |
123 | endif() |
124 | ``` |
125 | |
126 | and not this: |
127 | |
128 | ``` |
129 | if(BARVAR) |
130 | some_other_command(...) |
131 | endif(BARVAR) |
132 | ``` |
133 | |
134 | ### Other resources for best practices |
135 | |
136 | https://cmake.org/cmake/help/latest/manual/cmake-developer.7.html#modules |