[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