> 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
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 )
_______________________________________________
CMake mailing list
[email protected]
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to