File: UsePkgConfig.cmake

package info (click to toggle)
cmake 4.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 147,284 kB
  • sloc: ansic: 403,915; cpp: 290,772; sh: 4,102; python: 3,357; yacc: 3,106; lex: 1,189; f90: 532; asm: 471; lisp: 375; cs: 270; java: 266; fortran: 230; perl: 217; objc: 215; xml: 198; makefile: 97; javascript: 83; pascal: 63; tcl: 55; php: 25; ruby: 22
file content (136 lines) | stat: -rw-r--r-- 4,476 bytes parent folder | download
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
# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.

#[=======================================================================[.rst:
UsePkgConfig
------------

.. deprecated:: 3.0

  This module should no longer be used.  Instead, use the
  :module:`FindPkgConfig` module or the :command:`cmake_pkg_config` command.

  This module provided a macro for finding external packages using
  ``pkg-config`` command-line utility.  It has been replaced by the more
  convenient ``FindPkgConfig`` module, which is commonly used in
  :ref:`Find Modules`.

  As of CMake 3.31, the built-in :command:`cmake_pkg_config` command provides
  even more features to extract package information.

Macros
^^^^^^

This module defines the following macro:

.. command:: pkgconfig

  Finds external package using ``pkg-config`` and sets result variables:

  .. code-block:: cmake

    pkgconfig(<package> <includedir> <libdir> <linkflags> <cflags>)

  This macro invokes ``pkg-config`` command-line utility to retrieve the package
  information into specified variables.  If ``pkg-config`` or the specified
  package ``<package>`` is NOT found, the result variables remain empty.

  The arguments are:

  ``<package>``
    Name of the package as defined in its PC metadata file (``<package>.pc``).

  ``<includedir>``
    Variable name to store the package's include directory.

  ``<libdir>``
    Variable name to store the directory containing the package library.

  ``<linkflags>``
    Variable name to store the linker flags for the package.

  ``<cflags>``
    Variable name to store the compiler flags for the package.

Examples
^^^^^^^^

Using this module fills the desired information into the four given variables:

.. code-block:: cmake

  include(UsePkgConfig)
  pkgconfig(
    libart-2.0
    LIBART_INCLUDEDIR
    LIBART_LIBDIR
    LIBART_LDFLAGS
    LIBART_CFLAGS
  )

Migrating to the :module:`FindPkgConfig`  would look something like this:

.. code-block:: cmake

  find_package(PkgConfig QUIET)
  if(PKG_CONFIG_FOUND)
    pkg_check_modules(LIBART QUIET libart-2.0)
  endif()

  message(STATUS "LIBART_INCLUDEDIR=${LIBART_INCLUDEDIR}")
  message(STATUS "LIBART_LIBDIR=${LIBART_LIBDIR}")
  message(STATUS "LIBART_LDFLAGS=${LIBART_LDFLAGS}")
  message(STATUS "LIBART_CFLAGS=${LIBART_CFLAGS}")
#]=======================================================================]

find_program(PKGCONFIG_EXECUTABLE NAMES pkg-config )

macro(PKGCONFIG _package _include_DIR _link_DIR _link_FLAGS _cflags)
  message(STATUS
    "WARNING: you are using the obsolete 'PKGCONFIG' macro, use FindPkgConfig")
# reset the variables at the beginning
  set(${_include_DIR})
  set(${_link_DIR})
  set(${_link_FLAGS})
  set(${_cflags})

  # if pkg-config has been found
  if(PKGCONFIG_EXECUTABLE)

    execute_process(COMMAND ${PKGCONFIG_EXECUTABLE} ${_package} --exists RESULT_VARIABLE _return_VALUE OUTPUT_VARIABLE _pkgconfigDevNull )

    # and if the package of interest also exists for pkg-config, then get the information
    if(NOT _return_VALUE)

      execute_process(COMMAND ${PKGCONFIG_EXECUTABLE} ${_package} --variable=includedir
        OUTPUT_VARIABLE ${_include_DIR} OUTPUT_STRIP_TRAILING_WHITESPACE )
      string(REGEX REPLACE "[\r\n]" " " ${_include_DIR} "${${_include_DIR}}")

      execute_process(COMMAND ${PKGCONFIG_EXECUTABLE} ${_package} --variable=libdir
        OUTPUT_VARIABLE ${_link_DIR} OUTPUT_STRIP_TRAILING_WHITESPACE )
      string(REGEX REPLACE "[\r\n]" " " ${_link_DIR} "${${_link_DIR}}")

      execute_process(COMMAND ${PKGCONFIG_EXECUTABLE} ${_package} --libs
        OUTPUT_VARIABLE ${_link_FLAGS} OUTPUT_STRIP_TRAILING_WHITESPACE )
      string(REGEX REPLACE "[\r\n]" " " ${_link_FLAGS} "${${_link_FLAGS}}")

      execute_process(COMMAND ${PKGCONFIG_EXECUTABLE} ${_package} --cflags
        OUTPUT_VARIABLE ${_cflags} OUTPUT_STRIP_TRAILING_WHITESPACE )
      string(REGEX REPLACE "[\r\n]" " " ${_cflags} "${${_cflags}}")

    else()

      message(STATUS "PKGCONFIG() indicates that ${_package} is not installed (install the package which contains ${_package}.pc if you want to support this feature)")

    endif()

  # if pkg-config has NOT been found, INFORM the user
  else()

    message(STATUS "WARNING: PKGCONFIG() indicates that the tool pkg-config has not been found on your system. You should install it.")

  endif()

endmacro()

mark_as_advanced(PKGCONFIG_EXECUTABLE)