# CMake Commands

## CMake Commands

Starting from v3.0, CMake commands are all in lower case SET() --> set()

#### Common

* `message([<mode>] "message to display" ...)`
* `set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])`
* `unset(<variable> [CACHE | PARENT_SCOPE])`
* `option(<option_variable> "help string describing option" [initial value])`
* `export(EXPORT <export-name> [NAMESPACE <namespace>] [FILE <filename>])`
* `install(TARGETS targets... [EXPORT <export-name>] [...])`
* `file(WRITE filename "message to write"... )` also READ/APPEND/...
* `list(APPEND <list> [<element> ...])` also LENGTH/FIND/INSERT/REMOVE/SORT...
* `string(REGEX REPLACE <regular_expression> <replace_expression> <output variable>` `<input> [<input>...])`also FIND/COMPARE/LENGTH/TOLOWER...

```bash
message("words to user")
message(STATUS ${PROJECT_SOURCE_DIR})  # may be ignored by catkin build
# mode: (none), STATUS, WARNING, AUTHOR_WARNING, SEND_ERROR, FATAL_ERROR, DEPRECATION

set(CMAKE_BUILD_TYPE Release)  # Debug RelWithDebInfo MinSizeRel
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

unset(ENV{LD_LIBRARY_PATH}) # <variable> can be an environment variable

option(BUILD_DOC "Build documentation" ON) 
# can be overwritten by "cmake -DBUILD_DOC=OFF .."

export(TARGETS ${TEASERPP_EXPORTED_TARGETS} FILE teaserpp-exports.cmake)

install(FILES cmake/teaserppConfig.cmake
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/teaserpp)

file(STRINGS myfile.txt myfile)
# stores a list in the variable “myfile” 
# in which each item is a line from the input file.

list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
```

#### Flow Control

* `if()`, `elseif()`, `else()`, `endif()`
* `while()`, `endwhile()`
* `foreach()`, `endforeach()`
* `macro()`, `endmacro()`
* `function()`, `endfunction()`
* `break()`, `return()`
* `enable_language(<lang> [OPTIONAL] )`
* `enable_testing()`

#### Build Target

* `find_file (<VAR> name1 [path1 path2 ...])`
* `find_library (<VAR> name1 [path1 path2 ...])`
* `find_package(<package> [version] [EXACT] [QUIET] [MODULE] [REQUIRED] [[COMPONENTS]` `[components...]] [OPTIONAL_COMPONENTS components...] [NO_POLICY_SCOPE])`
* `find_path (<VAR> name1 [path1 path2 ...])`
* `find_program (<VAR> name1 [path1 path2 ...])`
* `add_compile_options(<option> ...)`
* `add_definitions(-DFOO -DBAR ...)`: Adds -D define flags to the compilation of source files.
* `add_dependencies(<target> [<target-dependency>]...)`
* `add_executable(<name> source1 [source2 ...])`
* `add_library(<name> [STATIC | SHARED | MODULE] source1 [source2 ...])`
* `add_subdirectory()`
* `add_test()`
* `include_directories()` for all build targets
* `target_include_directories()` for a specific build target
* `target_link_libraries()` link to a specific target
  * Header-only libraries (e.g., Eigen3) are not needed to be linked here.
  * `target_link_directories()` is not encouraged to use

#### Build Dependencies

* `configure_file(<input> <output> [...])` Copy a file to another location and modify its contents.
* `execute_process(COMMAND <cmd1> [args1...]] [WORKING_DIRECTORY <directory>] [...])`&#x20;
* `include(<file|module>[...])` Load and run CMake code from a file or module.

```bash
cmake_minimum_required(VERSION 3.10)

project(tinyply-download NONE)

include(ExternalProject)
ExternalProject_Add(pmc
        GIT_REPOSITORY    https://github.com/jingnanshi/tinyply.git
        GIT_TAG           0b9fff8e8bd4d37256554fe40cf76b2f3134377b
        SOURCE_DIR        "${CMAKE_CURRENT_BINARY_DIR}/tinyply-src"
        BINARY_DIR        "${CMAKE_CURRENT_BINARY_DIR}/tinyply-build"
        CONFIGURE_COMMAND ""
        BUILD_COMMAND     ""
        INSTALL_COMMAND   ""
        TEST_COMMAND      ""
        )
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.hanzheteng.com/development/cmake/cmake-commands.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
