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