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

suzuki toshiya mpsuzuki at hiroshima-u.ac.jp
Tue Mar 27 22:34:27 EDT 2018


Dear Nikos,

Thank you for concrete suggestion!

Nikos Chantziaras wrote:
> Is there a reason why you can't generate your .pc file from a .pc.in 
> file using the configure_file() function?

Yes, that's what I'm doing now :-)

https://github.com/mpsuzuki/poppler/compare/5e7aef9d...52ec0ec8#diff-af3b638bc2a3e6c650974192a53c7291

>    Requires: @PKGCONF_REQ_PUB@
>    Requires.private: @PKGCONF_REQ_PRIV@

>    Libs.private: -L"${libdir}" -lmylibrary @PKGCONF_LIBS_PRIV@

Here here. The functions I'm looking for is the helper
functions to construct @PKGCONF_REQ_PUB@, @PKGCONF_REQ_PRIV@,
and @PKGCONF_LIBS_PRIV at .

> You then set the PKGCONF_* variables in your cmake file. This is what I 
> use in a project of mine. You can use it as an example:
> 
>    https://github.com/realnc/SDL_audiolib/blob/master/CMakeLists.txt

Also thanks for concrete example. It seems that you have already
spot the appropriate pkg-config module name to be written in pc
file (so you could hardcode the name of the module). My problem
is that sometimes the appropriate pkg-config module name is unclear,
because some package finders in cmake do not invoke pkg-config
at all, or, even if pkg-config is invoked, some package finders do
not return the names of found modules.

--

Reading other (kind) suggestions to me, it seems that the majority
of cmake users think "retrieving the info from pkg-config is still
practical in some cases, but providing the info to pkg-config is not
practical anymore". that's ok, it answers my question "why I cannot
find these functions?", the answer was simple "because few people
wanted such". Sincerely I thank to everybody answered to my question.

Regards,
mpsuzuki



> On 27/03/18 19:10, suzuki toshiya wrote:
>> 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