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

suzuki toshiya mpsuzuki at hiroshima-u.ac.jp
Tue Mar 27 12:10:32 EDT 2018


Dear Craig,

Thank you for prompt reply. But all 3 functions; pkg_get_variable(),
pkg_check_modules(), pkg_search_module() are different from my purpose.

in my impression, these functions are designed to retrieve the infos
from/via pkg-config, not to generate the infos to be written in pkg-
config's pc files.

for the function 1 (lookup an available module from a list),
pkg_check_modules() and pkg_search_module() are candidate, but
they are not the straight solutions.

taking a case that trying to find available module from libjpeg,
libjpeg8, libjpeg8-turbo, libjpeg9, libjpeg62, how pkg_check_modules()
or pkg_search_module() could be used? it would be something like...

pkg_check_modules(_pc libjpeg libjpeg8 libjpeg8-turbo libjpeg9 libjpeg62)
foreach(mod IN LISTS "libjpeg;libjpeg8;libjpeg8-turbo;libjpeg9;libjpeg62")
  if (NOT ("${_pc_${mod}_VERSION}" STREQUAL ""))
    set(FOUND_MOD "${mod}")
  endif()
endforeach(mod)
message("${FOUND_MOD} is first available module")

I think it's slightly troublesome, because I have to write single
list at 2 places, in different syntax.

--

Also, yet I'm not sure how IMPORTED_TARGET could be used to make
"-L/xxx -lyyy" from "/xxx/libyyy.so". According to
https://cmake.org/cmake/help/latest/command/target_link_libraries.html
, the contents of the imported target are the full pathnames of
the libraries, or, the plain library name ("bar" of "libbar.so"),
or other linker flag. The function I'm looking for is a conversion
*from* the full pathname *to* linker flag + plain library name.
I cannot find if imported target has a conversion feature from one
to another - am I overlooking something important?

Regards,
mpsuzuki

Craig Scott wrote:
> You most likely want to use the FindPkgConfig<https://cmake.org/cmake/help/latest/module/FindPkgConfig.html> module and also use the IMPORTED_TARGET option with the commands provided therein.
> 
> On Tue, Mar 27, 2018 at 11:19 PM, suzuki toshiya <mpsuzuki at hiroshima-u.ac.jp<mailto:mpsuzuki at hiroshima-u.ac.jp>> wrote:
> 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
> 
> --
> 
> Powered by www.kitware.com<http://www.kitware.com>
> 
> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
> 
> Kitware offers various services to support the CMake community. For more information on each offering, please visit:
> 
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
> 
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
> 
> Follow this link to subscribe/unsubscribe:
> https://cmake.org/mailman/listinfo/cmake
> 
> 
> 
> --
> Craig Scott
> Melbourne, Australia
> https://crascit.com
> 



More information about the CMake mailing list