xref: /aosp_15_r20/external/zstd/build/cmake/README.md (revision 01826a4963a0d8a59bc3812d29bdf0fb76416722)
1*01826a49SYabin Cui# Cmake contributions
2*01826a49SYabin Cui
3*01826a49SYabin CuiContributions to the cmake build configurations are welcome. Please
4*01826a49SYabin Cuiuse case sensitivity that matches modern (i.e. cmake version 2.6 and above)
5*01826a49SYabin Cuiconventions of using lower-case for commands, and upper-case for
6*01826a49SYabin Cuivariables.
7*01826a49SYabin Cui
8*01826a49SYabin Cui## How to build
9*01826a49SYabin Cui
10*01826a49SYabin CuiAs cmake doesn't support command like `cmake clean`, it's recommended to perform an "out of source build".
11*01826a49SYabin CuiTo do this, you can create a new directory and build in it:
12*01826a49SYabin Cui```sh
13*01826a49SYabin Cuicd build/cmake
14*01826a49SYabin Cuimkdir builddir
15*01826a49SYabin Cuicd builddir
16*01826a49SYabin Cuicmake ..
17*01826a49SYabin Cuimake
18*01826a49SYabin Cui```
19*01826a49SYabin CuiThen you can clean all cmake caches by simply delete the new directory:
20*01826a49SYabin Cui```sh
21*01826a49SYabin Cuirm -rf build/cmake/builddir
22*01826a49SYabin Cui```
23*01826a49SYabin Cui
24*01826a49SYabin CuiAnd of course, you can directly build in build/cmake:
25*01826a49SYabin Cui```sh
26*01826a49SYabin Cuicd build/cmake
27*01826a49SYabin Cuicmake
28*01826a49SYabin Cuimake
29*01826a49SYabin Cui```
30*01826a49SYabin Cui
31*01826a49SYabin CuiTo show cmake build options, you can:
32*01826a49SYabin Cui```sh
33*01826a49SYabin Cuicd build/cmake/builddir
34*01826a49SYabin Cuicmake -LH ..
35*01826a49SYabin Cui```
36*01826a49SYabin Cui
37*01826a49SYabin CuiBool options can be set to `ON/OFF` with `-D[option]=[ON/OFF]`. You can configure cmake options like this:
38*01826a49SYabin Cui```sh
39*01826a49SYabin Cuicd build/cmake/builddir
40*01826a49SYabin Cuicmake -DZSTD_BUILD_TESTS=ON -DZSTD_LEGACY_SUPPORT=OFF ..
41*01826a49SYabin Cuimake
42*01826a49SYabin Cui```
43*01826a49SYabin Cui
44*01826a49SYabin Cui### how to use it with CMake FetchContent
45*01826a49SYabin Cui
46*01826a49SYabin CuiFor all options available, you can see it on <https://github.com/facebook/zstd/blob/dev/build/cmake/lib/CMakeLists.txt>
47*01826a49SYabin Cui```cmake
48*01826a49SYabin Cuiinclude(FetchContent)
49*01826a49SYabin Cui
50*01826a49SYabin Cuiset(ZSTD_BUILD_STATIC ON)
51*01826a49SYabin Cuiset(ZSTD_BUILD_SHARED OFF)
52*01826a49SYabin Cui
53*01826a49SYabin CuiFetchContent_Declare(
54*01826a49SYabin Cui    zstd
55*01826a49SYabin Cui    URL "https://github.com/facebook/zstd/releases/download/v1.5.5/zstd-1.5.5.tar.gz"
56*01826a49SYabin Cui    DOWNLOAD_EXTRACT_TIMESTAMP TRUE
57*01826a49SYabin Cui    SOURCE_SUBDIR build/cmake
58*01826a49SYabin Cui)
59*01826a49SYabin Cui
60*01826a49SYabin CuiFetchContent_MakeAvailable(zstd)
61*01826a49SYabin Cui
62*01826a49SYabin Cuitarget_link_libraries(
63*01826a49SYabin Cui    ${PROJECT_NAME}
64*01826a49SYabin Cui    PRIVATE
65*01826a49SYabin Cui    libzstd_static
66*01826a49SYabin Cui)
67*01826a49SYabin Cui
68*01826a49SYabin Cui# On windows and macos this is needed
69*01826a49SYabin Cuitarget_include_directories(
70*01826a49SYabin Cui    ${PROJECT_NAME}
71*01826a49SYabin Cui    PRIVATE
72*01826a49SYabin Cui    ${zstd_SOURCE_DIR}/lib
73*01826a49SYabin Cui)
74*01826a49SYabin Cui```
75*01826a49SYabin Cui
76*01826a49SYabin Cui### referring
77*01826a49SYabin Cui[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*01826a49SYabin Cui
79*01826a49SYabin Cui## CMake Style Recommendations
80*01826a49SYabin Cui
81*01826a49SYabin Cui### Indent all code correctly, i.e. the body of
82*01826a49SYabin Cui
83*01826a49SYabin Cui * if/else/endif
84*01826a49SYabin Cui * foreach/endforeach
85*01826a49SYabin Cui * while/endwhile
86*01826a49SYabin Cui * macro/endmacro
87*01826a49SYabin Cui * function/endfunction
88*01826a49SYabin Cui
89*01826a49SYabin CuiUse spaces for indenting, 2, 3 or 4 spaces preferably. Use the same amount of
90*01826a49SYabin Cuispaces for indenting as is used in the rest of the file. Do not use tabs.
91*01826a49SYabin Cui
92*01826a49SYabin Cui### Upper/lower casing
93*01826a49SYabin Cui
94*01826a49SYabin CuiMost important: use consistent upper- or lowercasing within one file !
95*01826a49SYabin Cui
96*01826a49SYabin CuiIn general, the all-lowercase style is preferred.
97*01826a49SYabin Cui
98*01826a49SYabin CuiSo, this is recommended:
99*01826a49SYabin Cui
100*01826a49SYabin Cui```
101*01826a49SYabin Cuiadd_executable(foo foo.c)
102*01826a49SYabin Cui```
103*01826a49SYabin Cui
104*01826a49SYabin CuiThese forms are discouraged
105*01826a49SYabin Cui
106*01826a49SYabin Cui```
107*01826a49SYabin CuiADD_EXECUTABLE(bar bar.c)
108*01826a49SYabin CuiAdd_Executable(hello hello.c)
109*01826a49SYabin CuiaDd_ExEcUtAbLe(blub blub.c)
110*01826a49SYabin Cui```
111*01826a49SYabin Cui
112*01826a49SYabin Cui### End commands
113*01826a49SYabin CuiTo make the code easier to read, use empty commands for endforeach(), endif(),
114*01826a49SYabin Cuiendfunction(), endmacro() and endwhile(). Also, use empty else() commands.
115*01826a49SYabin Cui
116*01826a49SYabin CuiFor example, do this:
117*01826a49SYabin Cui
118*01826a49SYabin Cui```
119*01826a49SYabin Cuiif(FOOVAR)
120*01826a49SYabin Cui   some_command(...)
121*01826a49SYabin Cuielse()
122*01826a49SYabin Cui   another_command(...)
123*01826a49SYabin Cuiendif()
124*01826a49SYabin Cui```
125*01826a49SYabin Cui
126*01826a49SYabin Cuiand not this:
127*01826a49SYabin Cui
128*01826a49SYabin Cui```
129*01826a49SYabin Cuiif(BARVAR)
130*01826a49SYabin Cui   some_other_command(...)
131*01826a49SYabin Cuiendif(BARVAR)
132*01826a49SYabin Cui```
133*01826a49SYabin Cui
134*01826a49SYabin Cui### Other resources for best practices
135*01826a49SYabin Cui
136*01826a49SYabin Cuihttps://cmake.org/cmake/help/latest/manual/cmake-developer.7.html#modules
137