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

Nikos Chantziaras realnc at gmail.com
Tue Mar 27 13:05:58 EDT 2018


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

   configure_file(
       ${PROJECT_SOURCE_DIR}/mylibrary.pc.in
       ${PROJECT_BINARY_DIR}/mylibrary.pc
       @ONLY
   )

Your mylibrary.pc.in file would look something like this:

   prefix="@CMAKE_INSTALL_PREFIX@"
   exec_prefix="${prefix}"
   libdir="${prefix}/@CMAKE_INSTALL_LIBDIR@"
   includedir="${prefix}/include/mylibrary"

   Name: MyLibrary
   Description: A library for xyzzying frobnixes
   URL: https://github.com/me/mylibrary
   Version: 0.0.0
   Requires: @PKGCONF_REQ_PUB@
   Requires.private: @PKGCONF_REQ_PRIV@
   Cflags: -I"${includedir}"
   Libs: -L"${libdir}" -lmylibrary
   Libs.private: -L"${libdir}" -lmylibrary @PKGCONF_LIBS_PRIV@

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


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