summaryrefslogtreecommitdiff
path: root/share/cmake-3.22/Help/variable/CMAKE_CURRENT_FUNCTION_LIST_DIR.rst
diff options
context:
space:
mode:
Diffstat (limited to 'share/cmake-3.22/Help/variable/CMAKE_CURRENT_FUNCTION_LIST_DIR.rst')
-rw-r--r--share/cmake-3.22/Help/variable/CMAKE_CURRENT_FUNCTION_LIST_DIR.rst43
1 files changed, 43 insertions, 0 deletions
diff --git a/share/cmake-3.22/Help/variable/CMAKE_CURRENT_FUNCTION_LIST_DIR.rst b/share/cmake-3.22/Help/variable/CMAKE_CURRENT_FUNCTION_LIST_DIR.rst
new file mode 100644
index 0000000..f8f553d
--- /dev/null
+++ b/share/cmake-3.22/Help/variable/CMAKE_CURRENT_FUNCTION_LIST_DIR.rst
@@ -0,0 +1,43 @@
+CMAKE_CURRENT_FUNCTION_LIST_DIR
+-------------------------------
+
+.. versionadded:: 3.17
+
+When executing code inside a :command:`function`, this variable
+contains the full directory of the listfile that defined the current function.
+
+It is quite common practice in CMake for modules to use some additional files,
+such as templates to be copied in after substituting CMake variables.
+In such cases, a function needs to know where to locate those files in a way
+that doesn't depend on where the function is called. Without
+``CMAKE_CURRENT_FUNCTION_LIST_DIR``, the code to do that would typically use
+the following pattern:
+
+.. code-block:: cmake
+
+ set(_THIS_MODULE_BASE_DIR "${CMAKE_CURRENT_LIST_DIR}")
+
+ function(foo)
+ configure_file(
+ "${_THIS_MODULE_BASE_DIR}/some.template.in"
+ some.output
+ )
+ endfunction()
+
+Using ``CMAKE_CURRENT_FUNCTION_LIST_DIR`` inside the function instead
+eliminates the need for the extra variable which would otherwise be visible
+outside the function's scope.
+The above example can be written in the more concise and more robust form:
+
+.. code-block:: cmake
+
+ function(foo)
+ configure_file(
+ "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/some.template.in"
+ some.output
+ )
+ endfunction()
+
+See also :variable:`CMAKE_CURRENT_FUNCTION`,
+:variable:`CMAKE_CURRENT_FUNCTION_LIST_FILE` and
+:variable:`CMAKE_CURRENT_FUNCTION_LIST_LINE`.