File: ManageDependency.cmake

package info (click to toggle)
cmake-fedora 2.7.2-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster
  • size: 764 kB
  • sloc: sh: 1,336; perl: 87; makefile: 12
file content (244 lines) | stat: -rw-r--r-- 9,005 bytes parent folder | download | duplicates (4)
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
# - Dependency Management Module
# This module handle dependencies by using pkg-config and/or
# search the executable.
# 
# Included Modules:
#  - ManageFile
#  - ManageString
#  - ManageVariable
#
# Variable to be read:
#  + MANAGE_DEPENDENCY_PACKAGE_EXISTS_CMD: Command and options that check
#      the existence of a package
#    Default: rpm -q
#
#  + MANAGE_DEPENDENCY_PACKAGE_INSTALL_CMD: Command and options that install
#      a package
#    Default: yum -y install
#
# Defines following functions:
#   MANAGE_DEPENDENCY(<listVar> <var> [VER <ver> [EXACT]] [REQUIRED] 
#     [PROGRAM_NAMES <name1> ...] [PROGRAM_SEARCH_PATHS <path1> ...] 
#     [PKG_CONFIG <pkgConfigName1> ...]
#     [PACKAGE_NAME <packageName> | DEVEL]
#     )
#     - Add a new dependency to a list. 
#       The dependency will also be searched.
#       If found, ${var}_FOUND is set as 1.
#       If not found:
#         + If REQUIRED is specified: a M_ERROR message will be printed. #	     + If REQUIRED is not specified: a M_OFF message will be printed.
#       See "Variables to cache" for the variable overridden and output.
#       * Parameters:
#         + listVar: List variable store a kind of dependencies.
#           Recognized lists:
#           - BUILD_REQUIRES: Dependencies in build stage
#           - REQUIRES:       Dependencies for runtime
#           - REQUIRES_PRE:   Dependencies before the package install
#           - REQUIRES_PREUN: Dependencies before the package uninstall
#           - REQUIRES_POST:  Dependencies after the package install
#           - REQUIRES_POSTUN:Dependencies after the package uninstall
#         + var: Main variable. Uppercase variable name is recommended,
#           (e.g. GETTEXT)
#         + VER ver [EXACT]: Minimum version.
#           Specify the exact version by providing "EXACT".
#         + REQUIRED: The dependency is required at cmake build time.
#         + PROGRAM_NAMES name1 ...: Executable to be found.
#             name2 and others are aliases to name1.
#             If found, ${var}_EXECUTABLE is defined as the full path 
#             to the executable; if not found; the whole dependency is
#             deemed as not found.
#         + PROGRAM_SEARCH_PATHS path1 ...: Additional program search path.
#             It will act as PATHS arguments for FIND_PROGRAM.
#         + PKG_CONFIG pkgConfigName1 ...: List of the pkg-config file
#             exclude the directory and .pc. e.g. "gtk+-2.0"
#         + PACKAGE_NAME packageName: The actual package name in repository. 
#             If not specified, use the lowercase of ${var}.
#             For example, use following to specify libchewing as dependency 
#             under the name CHEWING:
#           MANAGE_DEPENDENCY(REQUIRES CHEWING PACKAGE_NAME "libchewing")
#         + DEVEL: search lowercase of ${var}-devel.
#             A shortcut to PACKAGE_NAME ${var}-devel.
#       * Variables to cache:
#         + ${listVar}_${listVar}_${var}_PACKAGE_NAME: The actual package name in repository.
#             Override this if your system is different from Fedora.
#         + ${listVar}_${var}_PKG_CONFIG: List of pkg-config files.
#             Override this if your system is different from Fedora.
#         + ${var}_<print_variable>: The pkg-config variables.
#             For example, datadir=/usr/share/chewing will be
#           ${var}_DATADIR, whose value is "/usr/share/chewing"
#
IF(DEFINED _MANAGE_DEPENDENCY_CMAKE_)
    RETURN()
ENDIF(DEFINED _MANAGE_DEPENDENCY_CMAKE_)
SET(_MANAGE_DEPENDENCY_CMAKE_ "DEFINED")
INCLUDE(ManageFile)
INCLUDE(ManageVariable)
INCLUDE(ManageString)
SET(MANAGE_DEPENDENCY_PACKAGE_EXISTS_CMD rpm -q 
    CACHE STRING "Package exist command"
    )

SET(MANAGE_DEPENDENCY_PACKAGE_INSTALL_CMD yum -y install 
    CACHE STRING "Package exist command"
    )

## This need to be here, otherwise the variable won't be available
## the 2nd time called.
FIND_PACKAGE(PkgConfig)

## This is declared as function, because 
## macro does not play nice if listVar is required in different
## source dir.
FUNCTION(MANAGE_DEPENDENCY listVar var)
    SET(_validOptions "VER" "EXACT" "REQUIRED" 
	"PROGRAM_NAMES" "PROGRAM_SEARCH_PATHS" "PKG_CONFIG" "PACKAGE_NAME" "DEVEL")
    VARIABLE_PARSE_ARGN(_opt _validOptions ${ARGN})
    SET(_dirty 0)

    IF("${${listVar}_${var}_PACKAGE_NAME}" STREQUAL "")
	IF(_opt_PACKAGE_NAME)
	    IF(DEFINED _opt_DEVEL)
		M_MSG(${M_ERROR} "PACKAGE_NAME cannot use with DEVEL")
	    ENDIF()
	    SET(${listVar}_${var}_PACKAGE_NAME "${_opt_PACKAGE_NAME}")
	ELSE(_opt_PACKAGE_NAME)
	    STRING(TOLOWER "${var}" ${listVar}_${var}_PACKAGE_NAME)
	    IF(DEFINED _opt_DEVEL)
		STRING_APPEND(${listVar}_${var}_PACKAGE_NAME "-devel")
	    ENDIF()
	ENDIF(_opt_PACKAGE_NAME)
	SET(${listVar}_${var}_PACKAGE_NAME "${${listVar}_${var}_PACKAGE_NAME}" 
	    CACHE STRING "${listVar}_${var}_PACKAGE_NAME")
    ENDIF()
    SET(pkgName "${${listVar}_${var}_PACKAGE_NAME}")

    IF(DEFINED _opt_REQUIRED)
	SET(_verbose "${M_ERROR}")
	SET(_required "REQUIRED")
	SET(_progNotFoundMsg 
	    "Program names ${_opt_PROGRAM_NAMES} not found, install ${pkgName}")
    ELSE(DEFINED _opt_REQUIRED)
	SET(_verbose "${M_OFF}")
	SET(_required "")
	SET(_progNotFoundMsg 
	    "Program names ${_opt_PROGRAM_NAMES} not found, ${var} support disabled")
    ENDIF(DEFINED _opt_REQUIRED)

    IF(_opt_VER)
	IF(DEFINED _opt_EXACT)
	    SET(_rel "=")
	    SET(_exact "EXACT")
	ELSE(DEFINED _opt_EXACT)
	    SET(_rel ">=")
	    SET(_exact "")
	ENDIF(DEFINED _opt_EXACT)
    ENDIF(_opt_VER)

    IF(_opt_PROGRAM_NAMES)
	M_MSG(${M_INFO2} "ManageDependency: Finding program names ${_opt_PROGRAM_NAMES}")
	SET(_findArgs FIND_ARGS NAMES "${_opt_PROGRAM_NAMES}")
	IF(_opt_PROGRAM_SEARCH_PATHS)
	    LIST(APPEND _findArgs PATHS ${_opt_PROGRAM_SEARCH_PATHS})
	ENDIF()
	FIND_PROGRAM_ERROR_HANDLING(${var}_EXECUTABLE
	    ERROR_VAR _dirty
	    ERROR_MSG "${_progNotFoundMsg}"
	    VERBOSE_LEVEL "${_verbose}"
	    ${_findArgs}
	    )
	MARK_AS_ADVANCED(${var}_EXECUTABLE)
    ENDIF(_opt_PROGRAM_NAMES)

    IF("${_opt_VER}" STREQUAL "")
	SET(_newDep  "${pkgName}")
    ELSE("${_opt_VER}" STREQUAL "")
	SET(_newDep  "${pkgName} ${_rel} ${_opt_VER}")
    ENDIF("${_opt_VER}" STREQUAL "")

    ## Check package exist
    SET(pkgExistsCmdMissing 0)
    LIST(GET MANAGE_DEPENDENCY_PACKAGE_EXISTS_CMD 0 pkgExistsCmd)
    FIND_PROGRAM_ERROR_HANDLING(PKG_EXISTS_CMD
	ERROR_VAR pkgExistsCmdMissing
	ERROR_MSG "ManageDependency: Program ${pkgExistsCmd} not found, dependency check disabled."
	VERBOSE_LEVEL ${M_OFF}
	FIND_ARGS ${pkgExistsCmd}
	)

    IF(NOT pkgExistsCmdMissing)
	EXECUTE_PROCESS(COMMAND ${MANAGE_DEPENDENCY_PACKAGE_EXISTS_CMD} ${pkgName}
	    RESULT_VARIABLE pkgMissing
	    OUTPUT_QUIET
	    ERROR_QUIET
	    )
	IF(pkgMissing)
	    ## Dependency not found
	    M_MSG(${_verbose} "Package ${pkgName} is not installed")
	    SET(_dirty 1)
	ENDIF(pkgMissing)
    ENDIF()

    ## PKG_CONFIG
    IF("${${listVar}_${var}_PKG_CONFIG}" STREQUAL "")
	IF(_opt_PKG_CONFIG)
	    SET(${listVar}_${var}_PKG_CONFIG "${_opt_PKG_CONFIG}" 
		CACHE STRING "${listVar}_${var}_PKG_CONFIG")
	ENDIF(_opt_PKG_CONFIG)
    ENDIF()
    SET(pkgConf "${${listVar}_${var}_PKG_CONFIG}")

    IF(pkgConf)
	IF(PKG_CONFIG_EXECUTABLE)
	    ## Add pkgconfig itself as dependency
	    SET(PKG_CONFIG_PACKAGE_NAME "pkgconfig" 
		CACHE STRING "PKG_CONFIG_PACKAGE_NAME")
	    LIST(FIND ${listVar} "${PKG_CONFIG_PACKAGE_NAME}" _index)
	    IF(_index EQUAL -1)
		LIST(APPEND ${listVar} "${PKG_CONFIG_PACKAGE_NAME}")
	    ENDIF(_index EQUAL -1)
	ELSE(PKG_CONFIG_EXECUTABLE)
	    M_MSG(${M_ERROR} "pkgconfig is required with ${var}")
	ENDIF(PKG_CONFIG_EXECUTABLE)
	SET(pCList "")
	FOREACH(pC ${pkgConf})
	    LIST(APPEND pCList "${pC}${_rel}${_opt_VER}")
	    ## Get all variables
	    EXECUTE_PROCESS(COMMAND ${PKG_CONFIG_EXECUTABLE}
		--print-variables "${pC}"
		OUTPUT_VARIABLE _variables
		OUTPUT_STRIP_TRAILING_WHITESPACE
		RESULT_VARIABLE pkgconfigFailed
		)
	    IF(NOT pkgconfigFailed)
		STRING_SPLIT(${var}_VARIABLES "\n" "${_variables}")
		FOREACH(_v ${${var}_VARIABLES})
		    STRING(TOUPPER "${_v}" _u)
		    EXECUTE_PROCESS(COMMAND ${PKG_CONFIG_EXECUTABLE}
			--variable "${_v}" "${pC}"
			OUTPUT_VARIABLE ${var}_${pC}_${_u}
			OUTPUT_STRIP_TRAILING_WHITESPACE
			)
		    SET(${var}_${pC}_${_u} "${${var}_${pC}_${_u}}" 
			CACHE INTERNAL "pkgconfig ${${var}_${pC}_${_u}}")

		    MARK_AS_ADVANCED(${${var}_${pC}_${_u}})
		    M_MSG(${M_INFO1} "${var}_${pC}_${_u}=${${var}_${pC}_${_u}}")
		ENDFOREACH(_v)

	    ENDIF(NOT pkgconfigFailed)
	ENDFOREACH(pC)
	PKG_CHECK_MODULES(${var} ${_required}
	    ${pCList})
    ENDIF(pkgConf)

    ## Insert when it's not duplicated
    IF(NOT _dirty)
	SET(${var}_FOUND "1" CACHE INTERNAL "Found ${var}")
    ENDIF(NOT _dirty)
    LIST(FIND ${listVar} "${_newDep}" _index)
    IF(_index EQUAL -1)
	LIST(APPEND ${listVar} "${_newDep}")
	SET(${listVar} "${${listVar}}" CACHE INTERNAL "${listVar} package list")
    ENDIF(_index EQUAL -1)
ENDFUNCTION(MANAGE_DEPENDENCY)