[CMake] [ANN] New PkgConfig module

Maik Beckmann maikbeckmann at gmx.de
Wed Nov 1 06:03:49 EST 2006


Hello 

I would like to discuss three points

1. naming conventions
2. what if pkg-config sends an error
3. protect already defined variables

------------------------------------

1. naming conventions:

The interface will get a prefix like
        pkg_check_modules(LIBNAME ...)

I would prefer to stick close to the command names, so

since INCLUDE_DIRECTORIES -> LIBNAME_INCLUDE_DIRECTORIES
since LINK_DIRECTORIES -> LIBNAME_LINK_DIRECTORIES
since LINK_LIBRARIES / TARGET_LINK_LIBRARIES -> LIBNAME_LINK_LIBRARIES
since ADD_DEFINITIONS -> LIBNAME_DEFINITIONS

rather than 
LIBNAME_INCLUDE_DIRS and
LIBNAME_LINK_LIBS ...

----------------------------------
2. what if the lib isn't found

This regards the pkg_check_modules interface. If the lib(s)
wasn't/weren't found or version(s) to low the developer should be able
to react.

IMHO there are two possible solution

first:
pkg_config(MYPREFIX found "lib1 >= ??? lib2 >= ??? ...")
if(NOT found)
	# FATAL_ERROR of looking for alternatives ...
endif(NOT found)

second:
pkg_config(MYPREFIX "lib1 >= ??? lib2 >= ??? ...")
if(NOT MYPREFIX_FOUND)
	# FATAL_ERROR of looking for alternatives ...
endif(NOT MYPREFIX_FOUND)

What do you're like more?

----------------------------------
3. protect already defined variables
How can we ensure that variables of the module-user won't be overwritten

Just a random example...

set(varname ...)
pkg_module_macro(...)
#...
# using varname

If inside the macro a
    SET(varname ...)
happens, the module user will be in trouble.

Is it possible to set variables being private?
If not, we can use a prefix like
    PKGCONFIG_PRIVATE_*
for all internal variables. For more complex tasks this may be a little
to verbose. So I played around doing something like this:

MACRO(...)   
 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}
)
#

... do the work ....

#
PKGCONFIG_PRIVATE_VARS_RESTORE(
PKGCONFIG_PRIVATE_list_of_already_used_vars
PKGCONFIG_PRIVATE_list_of_values_of_already_used_vars
) 
ENDMACRO(...)

where the extra macros are

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_ERROR "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)

----------------------------------
 
please spend your 2cents

Regards, Maik





More information about the CMake mailing list