[CMake] [ANN] New PkgConfig module
Maik Beckmann
maikbeckmann at gmx.de
Tue Oct 31 07:38:42 EST 2006
> Hello,
>
> I wrote a new pkg-config module which is available at
>
> http://ensc.de/cmake/FindPkgConfig.cmake
Holy Moly... last week had to work on the same issue, why you didn't
post this before ;)
Maybe we can merge some points and discuss the interface, see the
attachment
Regards, Maik
-------------- next part --------------
FIND_PROGRAM( PKGCONFIG_EXECUTABLE
NAMES pkg-config
PATHS /usr/bin )
MARK_AS_ADVANCED(PKGCONFIG_EXECUTABLE)
MACRO(PKGCONFIG_PRIVATE_MATH_MAX max)
SET(${max} ${ARGV1})
FOREACH(item ${ARGN})
IF(item GREATER ${max})
set(${max} ${item})
ENDIF(item GREATER ${max})
ENDFOREACH(item)
ENDMACRO(PKGCONFIG_PRIVATE_MATH_MAX)
MACRO(PKGCONFIG_PRIVATE_MATH_MIN min)
SET(${min} ${ARGV1})
FOREACH(item ${ARGN})
IF(item LESS ${min})
set(${min} ${item})
ENDIF(item LESS ${min})
ENDFOREACH(item)
ENDMACRO(PKGCONFIG_PRIVATE_MATH_MIN)
MACRO(PKGCONFIG_PRIVATE_VARS_SAVE list_of_vars list_of_var_values)
FOREACH(item ${ARGN})
IF(DEFINED ${item})
LIST(APPEND ${list_of_vars} ${item})
LIST(APPEND ${list_of_var_values} ${${item}} )
ENDIF(DEFINED ${item})
ENDFOREACH(item)
ENDMACRO(PKGCONFIG_PRIVATE_VARS_SAVE)
MACRO(PKGCONFIG_PRIVATE_VARS_RESTORE list_of_vars list_of_var_values)
LIST(LENGTH ${list_of_vars} PKGCONFIG_PRIVATE_VAR_1 )
LIST(LENGTH ${list_of_var_values} PKGCONFIG_PRIVATE_VAR_2 )
IF(NOT ${PKGCONFIG_PRIVATE_VAR_1} EQUAL ${PKGCONFIG_PRIVATE_VAR_2} )
MESSAGE(FATAL_ERROS "PKGCONFIG_PRIVATE_VARS_RESTORE: lists got different length" )
ENDIF(NOT ${PKGCONFIG_PRIVATE_VAR_1} EQUAL ${PKGCONFIG_PRIVATE_VAR_2} )
MATH(EXPR PKGCONFIG_PRIVATE_VAR_1 "${PKGCONFIG_PRIVATE_VAR_1} - 1")
FOREACH(index RANGE ${PKGCONFIG_PRIVATE_VAR_1} )
LIST(GET ${list_of_vars} ${index} PKGCONFIG_PRIVATE_VAR_1 )
LIST(GET ${list_of_var_values} ${index} PKGCONFIG_PRIVATE_VAR_2 )
set(${PKGCONFIG_PRIVATE_VAR_1} ${PKGCONFIG_PRIVATE_VAR_2})
ENDFOREACH(index)
ENDMACRO(PKGCONFIG_PRIVATE_VARS_RESTORE)
MACRO(VERSION_IS_LESSER_THAN
is_lesser
version_number_1
version_number_2 )
SET(${is_lesser} 0)
SET(PKGCONFIG_PRIVATE_list_of_used_vars
version_number_1_digits
version_number_2_digits
version_number_1_digits_count
version_number_2_digits_count
to
digit_is
digit_min
digits_count_min )
PKGCONFIG_PRIVATE_VARS_SAVE(PKGCONFIG_PRIVATE_list_of_already_used_vars
PKGCONFIG_PRIVATE_list_of_values_of_already_used_vars
${PKGCONFIG_PRIVATE_list_of_used_vars})
STRING(REGEX MATCHALL "[0-9]+" version_number_1_digits ${version_number_1} )
LIST(LENGTH version_number_1_digits version_number_1_digits_count )
STRING(REGEX MATCHALL "[0-9]+" version_number_2_digits ${version_number_2} )
LIST(LENGTH version_number_1_digits version_number_2_digits_count )
PKGCONFIG_PRIVATE_MATH_MIN(digits_count_min ${version_number_1_digits_count} ${version_number_2_digits_count})
MATH(EXPR to "${digits_count_min} - 1")
FOREACH(index RANGE ${to})
LIST(GET version_number_1_digits ${index} digit_is)
LIST(GET version_number_2_digits ${index} digit_min)
IF( ${digit_is} LESS ${digit_min} )
SET(${is_lesser} 1)
ENDIF( ${digit_is} LESS ${digit_min} )
ENDFOREACH(index)
PKGCONFIG_PRIVATE_VARS_RESTORE(PKGCONFIG_PRIVATE_list_of_already_used_vars PKGCONFIG_PRIVATE_list_of_values_of_already_used_vars)
ENDMACRO(VERSION_IS_LESSER_THAN version_number_1 version_number_2)
MACRO(PKGCONFIG_EVAL_STRING Action)
FILE(WRITE PKGCONFIG_EVAL_TMP.cmake ${Action} )
include(PKGCONFIG_EVAL_TMP.cmake)
ENDMACRO(PKGCONFIG_EVAL_STRING)
MACRO(PKGCONFIG_CHECK_EXISTS OUT_bool_found OUT_pkg-exe_output_ )
EXECUTE_PROCESS( COMMAND ${PKGCONFIG_EXECUTABLE} --errors-to-stdout --print-errors --exists ${ARGN}
RESULT_VARIABLE ${OUT_bool_found}
OUTPUT_VARIABLE ${OUT_pkg-exe_output_})
IF(NOT ${${OUT_bool_found}} )
SET(${OUT_bool_found} 1)
ELSE(NOT ${${OUT_bool_found}} )
SET(${OUT_bool_found} 0)
ENDIF(NOT ${${OUT_bool_found}} )
ENDMACRO(PKGCONFIG_CHECK_EXISTS OUT_bool_found OUT_pkg-exe_output_ )
MACRO(PKGCONFIG_GET_INCLUDE_DIRECTORIES OUT_store IN_checked )
IF(NOT ${IN_checked} )
PKGCONFIG_CHECK_EXISTS(${ARGN} ${IN_checked} PKGCONFIG_PRIVATE_VARIABLE_1 )
ENDIF(NOT ${IN_checked})
IF( ${IN_checked} )
EXECUTE_PROCESS( COMMAND ${PKGCONFIG_EXECUTABLE} --cflags ${ARGN}
OUTPUT_VARIABLE PKGCONFIG_PRIVATE_VAR_1 )
STRING(REGEX MATCHALL "-I[^ ]*" ${OUT_store} "${PKGCONFIG_PRIVATE_VAR_1}")
STRING(REGEX REPLACE "-I" "" ${OUT_store} "${${OUT_store}}")
ELSE( ${IN_checked} )
MESSAGE(FATAL_ERROR "This is PKGCONFIG_GET_INCLUDE_DIRECTORIES: module(s):${ARGN}: not found. pkg-config said: ${PKGCONFIG_PRIVATE_VARIABLE_1}" )
ENDIF( ${IN_checked} )
ENDMACRO(PKGCONFIG_GET_INCLUDE_DIRECTORIES OUT_store IN_checked )
MACRO(PKGCONFIG_GET_LINK_DIRECTORIES OUT_store IN_checked )
IF(NOT ${IN_checked} )
PKGCONFIG_CHECK_EXISTS(${ARGN} ${IN_checked} PKGCONFIG_PRIVATE_VARIABLE_1 )
ENDIF(NOT ${IN_checked})
IF( ${IN_checked} )
EXECUTE_PROCESS( COMMAND ${PKGCONFIG_EXECUTABLE} --libs ${ARGN}
OUTPUT_VARIABLE PKGCONFIG_PRIVATE_VAR_1 )
STRING(REGEX MATCHALL "-L[^ ]*" ${OUT_store} "${PKGCONFIG_PRIVATE_VAR_1}" )
STRING(REGEX REPLACE "-L" "" ${OUT_store} "${${OUT_store}}" )
ELSE( ${IN_checked} )
MESSAGE(FATAL_ERROR "This is PKGCONFIG_GET_LINK_DIRECTORIES: module(s):${ARGN}: not found. Use PKGCONFIG_CHECK_EXISTS before using me" )
ENDIF( ${IN_checked} )
ENDMACRO(PKGCONFIG_GET_LINK_DIRECTORIES OUT_store IN_checked )
MACRO(PKGCONFIG_GET_LINK_LIBRARIES OUT_store IN_checked )
IF(NOT ${IN_checked} )
PKGCONFIG_CHECK_EXISTS(${ARGN} ${IN_checked} PKGCONFIG_PRIVATE_VARIABLE_1 )
ENDIF(NOT ${IN_checked})
IF( ${IN_checked} )
EXECUTE_PROCESS( COMMAND ${PKGCONFIG_EXECUTABLE} --libs ${ARGN}
OUTPUT_VARIABLE PKGCONFIG_PRIVATE_VAR_1 )
STRING(REGEX MATCHALL "-l[^ ]*" ${OUT_store} "${PKGCONFIG_PRIVATE_VAR_1}" )
STRING(REGEX REPLACE "-l" "" ${OUT_store} "${${OUT_store}} ")
ELSE( ${IN_checked} )
message(FATAL_ERROR "This is PKGCONFIG_GET_LINK_LIBRARIES: module(s):${ARGN}: not found. Use PKGCONFIG_CHECK_EXISTS before using me" )
ENDIF( ${IN_checked} )
ENDMACRO(PKGCONFIG_GET_LINK_LIBRARIES OUT_store IN_checked )
MACRO(PKGCONFIG_GET_DEFINITIONS OUT_store IN_checked )
IF(NOT ${IN_checked} )
PKGCONFIG_CHECK_EXISTS(${ARGN} ${IN_checked} PKGCONFIG_PRIVATE_VARIABLE_1 )
ENDIF(NOT ${IN_checked})
IF( ${IN_checked} )
EXECUTE_PROCESS( COMMAND ${PKGCONFIG_EXECUTABLE} --cflags ${ARGN}
OUTPUT_VARIABLE PKGCONFIG_PRIVATE_VAR_1 )
STRING(REGEX MATCHALL "-D[^ ]*" ${OUT_store} "${PKGCONFIG_PRIVATE_VAR_1}" )
ELSE( ${IN_checked} )
MESSAGE(FATAL_ERROR "This is PKGCONFIG_GET_DEFINITIONS: module(s):${ARGN}: not found. Use PKGCONFIG_CHECK_EXISTS before using me" )
ENDIF( ${IN_checked} )
ENDMACRO(PKGCONFIG_GET_DEFINITIONS OUT_store IN_checked )
# PKGCONFIG_CHECK_MODULES( IN_prefix OUT_bool_found OUT_pkg-exe_output_ IN_... module expressions ... )
# where:
# ${prefix}_INCLUDE_DIRECTORIES
# ${prefix}_LINK_DIRECTORIES
# ${prefix}_LINK_LIBRAIRES
# ${prefix}_DEFINITIONS
#
# An >>module expressions<< looks like:
# "glib-2.0 >= 2.10", where ">= 2.10" means the version of glib-2.0 has to be 2.10 or greater
#
# example:
# PKGCONFIG_CHECK_MODULES(GLIB glib_found pkg_output "glib-2.0 => 2.10")
# IF(NOT glib_found)
# message(FATAL_ERROR "${pkg_output}")
# ENDIF(NOT glib_found)
#
#
MACRO(PKGCONFIG_CHECK_MODULES IN_prefix OUT_bool_found OUT_pkg-exe_output_ )
PKGCONFIG_CHECK_EXISTS( ${OUT_bool_found} ${OUT_pkg-exe_output_} ${ARGN} )
IF(${${OUT_bool_found}} )
PKGCONFIG_GET_INCLUDE_DIRECTORIES( "${IN_prefix}_INCLUDE_DIRECTORIES" 1 ${ARGN} )
PKGCONFIG_GET_LINK_DIRECTORIES( "${IN_prefix}_LINK_DIRECTORIES" 1 ${ARGN} )
PKGCONFIG_GET_LINK_LIBRARIES( "${IN_prefix}_LINK_LIBRARIES" 1 ${ARGN} )
PKGCONFIG_GET_DEFINITIONS( "${IN_prefix}_DEFINITIONS" 1 ${ARGN} )
ENDIF(${${OUT_bool_found}} )
ENDMACRO(PKGCONFIG_CHECK_MODULES module action_if action_if_not)
MACRO(PKGCONFIG_GET_LIBDIR OUT_store IN_checked module)
IF(NOT ${IN_checked} )
PKGCONFIG_CHECK_EXISTS(${module} ${IN_checked} PKGCONFIG_PRIVATE_VARIABLE_1 )
ENDIF(NOT ${IN_checked})
IF( ${IN_checked} )
EXECUTE_PROCESS( COMMAND ${PKGCONFIG_EXECUTABLE} --variable=libdir ${module}
OUTPUT_VARIABLE ${OUT_store} )
STRING(REGEX REPLACE "\n" "" ${OUT_store} "${${OUT_store}}")
ELSE( ${IN_checked} )
MESSAGE(FATAL_ERROR "This is PKGCONFIG_GET_LINK_DIRECTORIES: module(s):${module}: not found. Use PKGCONFIG_CHECK_EXISTS before using me" )
ENDIF( ${IN_checked} )
ENDMACRO(PKGCONFIG_GET_LIBDIR OUT_store IN_checked module )
More information about the CMake
mailing list