[CMake] looking for 2 features to help pkg-config pc files

suzuki toshiya mpsuzuki at hiroshima-u.ac.jp
Tue Mar 27 08:19:56 EDT 2018


Hi all,

I'm looking for 2 features to generate pkg-config pc files.
I already wrote something, but some experts advised that there
would be many people trying to do such, and there might be existing
solution. If such functions are already included in cmake's
official modules, please let me know. Of course, combination
of existing functions would be OK.

function 1)
-----------

...is trying to find an available pkg-config module name from a
list of several candidates. the typical usecase would be a
search of libjpeg by pkg-config (libjpeg? libjpeg8? libjpeg8-turbo?
libjpeg9? libjpeg62? ...). getting a name of module is important
to write "Require" variable of pc file.

there is already pkg_search_module() searching an available module
from a list, but it does not return the name of found module.
thus it cannot help to write "Require" variable.

what I wrote is something like this.

#
# PKG_SEARCH_AVAILABLE_MODULE([var-name-of-found-module] [modules])
#
# there is pkg_search_module(), but it does not clarify
# which module was found.
#
# this function does not set xxx_CFLAGS xxx_LIBS etc.
#
# use like:
# PKG_SEARCH_AVAILABLE_MODULE(PC_LIBJPEG
"libjpeg;libjpeg8-turbo;libjpeg8;libjpeg9;libjpeg62")
#
function(PKG_SEARCH_AVAILABLE_MODULE _found_pkg pkg_list)
  set(_PKG_FOUND FALSE)
  foreach(_pkg IN LISTS pkg_list)
    pkg_check_modules(_PKG "${_pkg}")
    if (_PKG_FOUND)
      set("${_found_pkg}_FOUND" TRUE PARENT_SCOPE)
      set("${_found_pkg}_MODULE_NAME" "${_pkg}" PARENT_SCOPE)
      return()
    endif()
  endforeach(_pkg)
endfunction(PKG_SEARCH_AVAILABLE_MODULE)

function 2)
-----------
...makes something like LDFLAGS + LIBS from the pathnames of libraries.
some library finders of cmake do not return "-L/xxx -lyyy" values
but returns "/xxx/libyyy.so". pkg-config has some difficulties
to hold such raw pathnames of the libraries (e.g. pkg-config
use "Libs" variable for both of static and shared linking,
thus having "libxxx.a" or "libxxx.so" explicitly is not good),
so, the translation from "/xxx/libyyy.so" to "-L/xxx -lyyy".

what I wrote is something like this:

#
# MAKE_LDFLAGS_FROM_LIBPATH([var-ldflags+libs] [libpath])
#
function(MAKE_LDFLAGS_FROM_LIBPATHS _ldflags _libpaths)
  foreach(_libpath IN LISTS _libpaths)
    string(REGEX REPLACE "/[^/]*$" "" _libdir "${_libpath}")

    string(REGEX REPLACE "^.*/" "" _lib "${_libpath}")
    string(REGEX REPLACE
"(\\${CMAKE_STATIC_LIBRARY_SUFFIX}|\\${CMAKE_SHARED_LIBRARY_SUFFIX})$" "" _lib
"${_lib}")
    string(REGEX REPLACE "^lib" "" _lib "${_lib}")

    set(__ldflags "${__ldflags} ${CMAKE_LIBRARY_PATH_FLAG}${_libdir}
${CMAKE_LINK_LIBRARY_FLAG}${_lib}")
  endforeach(_libpath)
  set("${_ldflags}" "${__ldflags}" PARENT_SCOPE)
endfunction(MAKE_LDFLAGS_FROM_LIBPATH)

Regards,
mpsuzuki



More information about the CMake mailing list