summaryrefslogtreecommitdiffstats
path: root/Modules/FindLTTngUST.cmake
blob: 6d024bc0c50f011c49864e428a04f98027b2eff7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.

#[=======================================================================[.rst:
FindLTTngUST
------------

.. versionadded:: 3.6

Finds the `LTTng <https://lttng.org/>`_ (Linux Trace Toolkit: next generation)
user space tracing library (LTTng-UST):

.. code-block:: cmake

  find_package(LTTngUST [<version>] [...])

Imported Targets
^^^^^^^^^^^^^^^^

This module provides the following :ref:`Imported Targets`:

``LTTng::UST``
  Target providing the LTTng-UST library usage requirements.  This target is
  available only when LTTng-UST is found.

Result Variables
^^^^^^^^^^^^^^^^

This module defines the following variables:

``LTTngUST_FOUND``
  Boolean indicating whether the (requested version of) LTTng-UST library
  was found.

``LTTngUST_VERSION``
  .. versionadded:: 4.2

  The LTTng-UST version.

``LTTNGUST_HAS_TRACEF``
  ``TRUE`` if the ``tracef()`` API is available in the system's LTTng-UST.

``LTTNGUST_HAS_TRACELOG``
  ``TRUE`` if the ``tracelog()`` API is available in the system's LTTng-UST.

Cache Variables
^^^^^^^^^^^^^^^

The following cache variables may also be set:

``LTTNGUST_INCLUDE_DIRS``
  The LTTng-UST include directories.
``LTTNGUST_LIBRARIES``
  The libraries needed to use LTTng-UST.

Deprecated Variables
^^^^^^^^^^^^^^^^^^^^

The following variables are provided for backward compatibility:

``LTTNGUST_FOUND``
  .. deprecated:: 4.2
    Use ``LTTngUST_FOUND``, which has the same value.

  Boolean indicating whether the (requested version of) LTTng-UST library
  was found.

``LTTNGUST_VERSION_STRING``
  .. deprecated:: 4.2
    Superseded by the ``LTTngUST_VERSION``.

  The LTTng-UST version.

Examples
^^^^^^^^

Finding the LTTng-UST library and linking it to a project target:

.. code-block:: cmake

  find_package(LTTugNST)
  target_link_libraries(project_target PRIVATE LTTng::UST)
#]=======================================================================]

cmake_policy(PUSH)
cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>

find_path(LTTNGUST_INCLUDE_DIRS NAMES lttng/tracepoint.h)
find_library(LTTNGUST_LIBRARIES NAMES lttng-ust)

if(LTTNGUST_INCLUDE_DIRS AND LTTNGUST_LIBRARIES)
  # find tracef() and tracelog() support
  set(LTTNGUST_HAS_TRACEF 0)
  set(LTTNGUST_HAS_TRACELOG 0)

  if(EXISTS "${LTTNGUST_INCLUDE_DIRS}/lttng/tracef.h")
    set(LTTNGUST_HAS_TRACEF TRUE)
  endif()

  if(EXISTS "${LTTNGUST_INCLUDE_DIRS}/lttng/tracelog.h")
    set(LTTNGUST_HAS_TRACELOG TRUE)
  endif()

  # get version
  set(lttngust_version_file "${LTTNGUST_INCLUDE_DIRS}/lttng/ust-version.h")

  if(EXISTS "${lttngust_version_file}")
    file(STRINGS "${lttngust_version_file}" lttngust_version_major_string
         REGEX "^[\t ]*#define[\t ]+LTTNG_UST_MAJOR_VERSION[\t ]+[0-9]+[\t ]*$")
    file(STRINGS "${lttngust_version_file}" lttngust_version_minor_string
         REGEX "^[\t ]*#define[\t ]+LTTNG_UST_MINOR_VERSION[\t ]+[0-9]+[\t ]*$")
    file(STRINGS "${lttngust_version_file}" lttngust_version_patch_string
         REGEX "^[\t ]*#define[\t ]+LTTNG_UST_PATCHLEVEL_VERSION[\t ]+[0-9]+[\t ]*$")
    string(REGEX REPLACE ".*[\t ]+([0-9]+).*" "\\1"
           lttngust_v_major "${lttngust_version_major_string}")
    string(REGEX REPLACE ".*[\t ]+([0-9]+).*" "\\1"
           lttngust_v_minor "${lttngust_version_minor_string}")
    string(REGEX REPLACE ".*[\t ]+([0-9]+).*" "\\1"
           lttngust_v_patch "${lttngust_version_patch_string}")
    set(LTTngUST_VERSION
        "${lttngust_v_major}.${lttngust_v_minor}.${lttngust_v_patch}")
    set(LTTNGUST_VERSION_STRING "${LTTngUST_VERSION}")
    unset(lttngust_version_major_string)
    unset(lttngust_version_minor_string)
    unset(lttngust_version_patch_string)
    unset(lttngust_v_major)
    unset(lttngust_v_minor)
    unset(lttngust_v_patch)
  endif()

  unset(lttngust_version_file)

  if(NOT TARGET LTTng::UST)
    add_library(LTTng::UST UNKNOWN IMPORTED)
    set_target_properties(LTTng::UST PROPERTIES
      INTERFACE_INCLUDE_DIRECTORIES "${LTTNGUST_INCLUDE_DIRS}"
      INTERFACE_LINK_LIBRARIES ${CMAKE_DL_LIBS}
      IMPORTED_LINK_INTERFACE_LANGUAGES "C"
      IMPORTED_LOCATION "${LTTNGUST_LIBRARIES}")
  endif()

  # add libdl to required libraries
  set(LTTNGUST_LIBRARIES ${LTTNGUST_LIBRARIES} ${CMAKE_DL_LIBS})
endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LTTngUST
                                  REQUIRED_VARS LTTNGUST_LIBRARIES
                                                LTTNGUST_INCLUDE_DIRS
                                  VERSION_VAR LTTngUST_VERSION)
mark_as_advanced(LTTNGUST_LIBRARIES LTTNGUST_INCLUDE_DIRS)

cmake_policy(POP)