|
|
@ -23,47 +23,73 @@ All interactions with the CMake instrumentation API must specify both an API |
|
|
|
version and a Data version. At this time, there is only one version for each of |
|
|
|
these: the `API v1`_ and `Data v1`_. |
|
|
|
|
|
|
|
When instrumentation is enabled, CMake sets the :prop_gbl:`RULE_LAUNCH_COMPILE`, |
|
|
|
:prop_gbl:`RULE_LAUNCH_LINK` and :prop_gbl:`RULE_LAUNCH_CUSTOM` global properties |
|
|
|
to use the ``ctest --instrument`` launcher. Whenever a command is executed with |
|
|
|
Data Collection |
|
|
|
--------------- |
|
|
|
|
|
|
|
Whenever a command is executed with |
|
|
|
instrumentation enabled, a `v1 Snippet File`_ is created in the project build |
|
|
|
tree. If the project has been configured with :module:`CTestUseLaunchers`, |
|
|
|
tree with data specific to that command. These files remain until after |
|
|
|
`Indexing`_ occurs. |
|
|
|
|
|
|
|
CMake sets the :prop_gbl:`RULE_LAUNCH_COMPILE`, :prop_gbl:`RULE_LAUNCH_LINK` and |
|
|
|
:prop_gbl:`RULE_LAUNCH_CUSTOM` global properties to use the |
|
|
|
``ctest --instrument`` launcher in order to capture details of each compile, link |
|
|
|
and custom command respectively. If the project has been configured with :module:`CTestUseLaunchers`, |
|
|
|
``ctest --instrument`` will also include the behavior usually performed by |
|
|
|
``ctest --launch``. |
|
|
|
|
|
|
|
Hooks are specific intervals, configured as part of the `v1 Query Files`_, |
|
|
|
during which snippet data files are coallated. Whenever a hook executes, an |
|
|
|
index file is generated containing a list of snippet files newer than the |
|
|
|
previous indexing, and a sequence of custom callbacks are executed using |
|
|
|
the index file as an argument. |
|
|
|
Indexing |
|
|
|
-------- |
|
|
|
|
|
|
|
Indexing is the process of collating generated instrumentation data. Indexing |
|
|
|
occurs at specific intervals called hooks, such as after every build. These |
|
|
|
hooks are configured as part of the `v1 Query Files`_. Whenever a hook is |
|
|
|
triggered, an index file is generated containing a list of snippet files newer |
|
|
|
than the previous indexing. |
|
|
|
|
|
|
|
Indexing and callbacks can also be performed by manually invoking |
|
|
|
Indexing and can also be performed by manually invoking |
|
|
|
``ctest --collect-instrumentation``. |
|
|
|
|
|
|
|
Callbacks |
|
|
|
--------- |
|
|
|
|
|
|
|
As part of the `v1 Query Files`_, users can provide a list of callbacks |
|
|
|
intended to handle data collected by this feature. |
|
|
|
|
|
|
|
Whenever `Indexing`_ occurs, each provided callback is executed, passing the |
|
|
|
path to the generated index file as an argument. |
|
|
|
|
|
|
|
These callbacks, defined either at the user-level or project-level should read |
|
|
|
the instrumentation data and perform any desired handling of it. The index file |
|
|
|
and its listed snippets are automatically deleted by CMake once all callbacks |
|
|
|
have completed. |
|
|
|
have completed. Note that a callback should never move or delete these data |
|
|
|
files manually as they may be needed by other callbacks. |
|
|
|
|
|
|
|
Configuring Instrumentation at the User-Level |
|
|
|
Enabling Instrumentation |
|
|
|
======================== |
|
|
|
|
|
|
|
Instrumentation can be enabled either for an individual CMake project, or |
|
|
|
for all CMake projects configured and built by a user. For both cases, |
|
|
|
see the `v1 Query Files`_ for details on configuring this feature. |
|
|
|
|
|
|
|
Enabling Instrumentation at the Project-Level |
|
|
|
--------------------------------------------- |
|
|
|
|
|
|
|
Instrumentation can be configured at the user-level by placing query files in the |
|
|
|
:envvar:`CMAKE_CONFIG_DIR` under |
|
|
|
``<config_dir>/instrumentation/<version>/query/``. This version of CMake |
|
|
|
supports only one version schema, `API v1`_. |
|
|
|
Project code can contain instrumentation queries with the |
|
|
|
:command:`cmake_instrumentation` command. |
|
|
|
|
|
|
|
Configuring Instrumentation at the Project-Level |
|
|
|
------------------------------------------------ |
|
|
|
In addition, query files can be placed manually under |
|
|
|
``<build>/.cmake/instrumentation/<version>/query/`` at the top of a build tree. |
|
|
|
This version of CMake supports only one version schema, `API v1`_. |
|
|
|
|
|
|
|
Configuring Instrumentation at the project level can be done by placing query |
|
|
|
files under ``<build>/.cmake/instrumentation/query/`` at the top of a build |
|
|
|
tree. |
|
|
|
Enabling Instrumentation at the User-Level |
|
|
|
------------------------------------------ |
|
|
|
|
|
|
|
Additionally, project code can contain instrumentation queries with the |
|
|
|
:command:`cmake_instrumentation` command. |
|
|
|
Instrumentation can be configured at the user-level by placing query files in |
|
|
|
the :envvar:`CMAKE_CONFIG_DIR` under |
|
|
|
``<config_dir>/instrumentation/<version>/query/``. |
|
|
|
|
|
|
|
.. _`cmake-instrumentation v1`: |
|
|
|
.. _`cmake-instrumentation API v1`: |
|
|
|
|
|
|
|
API v1 |
|
|
|
====== |
|
|
@ -89,7 +115,8 @@ subdirectories: |
|
|
|
|
|
|
|
``data/`` |
|
|
|
Holds instrumentation data collected on the project. CMake owns all data |
|
|
|
files, they should never be removed by other processes. |
|
|
|
files, they should never be removed by other processes. Data collected here |
|
|
|
remains until after `Indexing`_ occurs and all `Callbacks`_ are executed. |
|
|
|
|
|
|
|
.. _`cmake-instrumentation v1 Query Files`: |
|
|
|
|
|
|
@ -99,21 +126,22 @@ v1 Query Files |
|
|
|
Any file with the ``.json`` extension under the ``instrumentation/v1/query/`` |
|
|
|
directory is recognized as a query for instrumentation data. |
|
|
|
|
|
|
|
These files must contain a JSON object with the following keys which are all |
|
|
|
optional. |
|
|
|
These files must contain a JSON object with the following keys. The ``version`` |
|
|
|
key is required, but all other fields are optional. |
|
|
|
|
|
|
|
``version`` |
|
|
|
The Data version of snippet file to generate, an integer. Currently the only |
|
|
|
supported version is ``1``. |
|
|
|
|
|
|
|
``callbacks`` |
|
|
|
A list of command-line strings for callbacks to handle collected timing |
|
|
|
data. Whenever these callbacks are executed, the full path to a |
|
|
|
`v1 Index File`_ is appended to the arguments included in the string. |
|
|
|
A list of command-line strings for `Callbacks`_ to handle collected |
|
|
|
instrumentation data. Whenever these callbacks are executed, the full path to |
|
|
|
a `v1 Index File`_ is appended to the arguments included in the string. |
|
|
|
|
|
|
|
``hooks`` |
|
|
|
A list of strings specifying when instrumentation data should be collated |
|
|
|
and user callbacks should be invoked on the data. Elements in this list |
|
|
|
A list of strings specifying when `Indexing`_ should occur automatically. |
|
|
|
These are the intervals when instrumentation data should be collated and user |
|
|
|
`Callbacks`_ should be invoked to handle the data. Elements in this list |
|
|
|
should be one of the following: |
|
|
|
|
|
|
|
* ``postGenerate`` |
|
|
@ -129,20 +157,20 @@ optional. |
|
|
|
instrumentation. Elements in this list should be one of the following: |
|
|
|
|
|
|
|
``staticSystemInformation`` |
|
|
|
Enables collection of the static information about the host machine |
|
|
|
CMake is being run from. This data is collected once at each hook and |
|
|
|
included in the generated ``index-<has>.json`` file. |
|
|
|
Enables collection of the static information about the host machine CMake |
|
|
|
is being run from. This data is collected during `Indexing`_ and is |
|
|
|
included in the generated `v1 Index File`_. |
|
|
|
|
|
|
|
``dynamicSystemInformation`` |
|
|
|
Enables collection of the dynamic information about the host machine |
|
|
|
CMake is being run from. Data is collected for every snippet file |
|
|
|
generated by CMake, with data immediately before and after the command is |
|
|
|
executed. |
|
|
|
CMake is being run from. Data is collected for every `v1 Snippet File`_ |
|
|
|
generated by CMake, and includes information from immediately before and |
|
|
|
after the command is executed. |
|
|
|
|
|
|
|
The ``callbacks`` listed will be invoked during the specified hooks |
|
|
|
*at a minimum*. When there are multiple queries, the ``callbacks``, ``hooks`` |
|
|
|
and ``queries`` between them will be merged. Therefore, if any query file |
|
|
|
includes any ``hooks``, every ``callback`` across all query files will be |
|
|
|
*at a minimum*. When there are multiple query files, the ``callbacks``, |
|
|
|
``hooks`` and ``queries`` between them will be merged. Therefore, if any query |
|
|
|
file includes any ``hooks``, every ``callback`` across all query files will be |
|
|
|
executed at every ``hook`` across all query files. Additionally, if any query |
|
|
|
file includes any optional ``queries``, the optional query data will be present |
|
|
|
in all data files. |
|
|
@ -179,14 +207,16 @@ each snippet file listed in the index will contain the |
|
|
|
file and all snippet files listed by it will be deleted from the project build |
|
|
|
tree. |
|
|
|
|
|
|
|
.. _`cmake-instrumentation Data v1`: |
|
|
|
|
|
|
|
Data v1 |
|
|
|
======= |
|
|
|
|
|
|
|
Data version specifies the contents of the output files generated by the CMake |
|
|
|
instrumentation API. There are two types of data files generated. When using |
|
|
|
the `API v1`_, these files live in ``<build>/.cmake/instrumentation/v1/data/`` |
|
|
|
under the project build tree. These are the `v1 Snippet File`_ and |
|
|
|
`v1 Index File`_. |
|
|
|
instrumentation API as part of the `Data Collection`_ and `Indexing`_. There are |
|
|
|
two types of data files generated: the `v1 Snippet File`_ and `v1 Index File`_. |
|
|
|
When using the `API v1`_, these files live in |
|
|
|
``<build>/.cmake/instrumentation/v1/data/`` under the project build tree. |
|
|
|
|
|
|
|
v1 Snippet File |
|
|
|
--------------- |
|
|
@ -202,6 +232,9 @@ the command executed. Additionally, snippet files are created for the following: |
|
|
|
* Each ``ctest`` invocation |
|
|
|
* Each individual test executed by ``ctest``. |
|
|
|
|
|
|
|
These files remain in the build tree until after `Indexing`_ occurs and any |
|
|
|
user-specified `Callbacks`_ are executed. |
|
|
|
|
|
|
|
Snippet files have a filename with the syntax ``<role>-<timestamp>-<hash>.json`` |
|
|
|
and contain the following data: |
|
|
|
|
|
|
@ -251,7 +284,8 @@ and contain the following data: |
|
|
|
|
|
|
|
``outputSizes`` |
|
|
|
The size(s) in bytes of the ``outputs``, an array. For files which do not |
|
|
|
exist, the size is 0. |
|
|
|
exist, the size is 0. Included under the same conditions as the ``outputs`` |
|
|
|
field. |
|
|
|
|
|
|
|
``source`` |
|
|
|
The source file being compiled. Only included when ``role`` is ``compile``. |
|
|
@ -271,7 +305,7 @@ and contain the following data: |
|
|
|
Specifies the dynamic information collected about the host machine |
|
|
|
CMake is being run from. Data is collected for every snippet file |
|
|
|
generated by CMake, with data immediately before and after the command is |
|
|
|
executed. |
|
|
|
executed. Only included when enabled by the `v1 Query Files`_. |
|
|
|
|
|
|
|
``beforeHostMemoryUsed`` |
|
|
|
The Host Memory Used in KiB at ``timeStart``. |
|
|
@ -315,7 +349,8 @@ v1 Index File |
|
|
|
------------- |
|
|
|
|
|
|
|
Index files contain a list of `v1 Snippet File`_. It serves as an entry point |
|
|
|
for navigating the instrumentation data. |
|
|
|
for navigating the instrumentation data. They are generated whenever `Indexing`_ |
|
|
|
occurs and deleted after any user-specified `Callbacks`_ are executed. |
|
|
|
|
|
|
|
``version`` |
|
|
|
The Data version of the index file, an integer. Currently the version is |
|
|
@ -340,8 +375,7 @@ for navigating the instrumentation data. |
|
|
|
|
|
|
|
``staticSystemInformation`` |
|
|
|
Specifies the static information collected about the host machine |
|
|
|
CMake is being run from. This data is collected once at each hook and |
|
|
|
included in the generated ``index-<has>.json`` file. |
|
|
|
CMake is being run from. Only included when enabled by the `v1 Query Files`_. |
|
|
|
|
|
|
|
* ``OSName`` |
|
|
|
* ``OSPlatform`` |
|
|
|