looking for 2 features to help pkg-config pc files

classic Classic list List threaded Threaded
12 messages Options
Reply | Threaded
Open this post in threaded view
|

looking for 2 features to help pkg-config pc files

suzuki toshiya
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

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
Reply | Threaded
Open this post in threaded view
|

Re: looking for 2 features to help pkg-config pc files

Craig Scott-3
You most likely want to use the FindPkgConfig module and also use the IMPORTED_TARGET option with the commands provided therein.

On Tue, Mar 27, 2018 at 11:19 PM, suzuki toshiya <[hidden email]> 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

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

--

Powered by 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
Reply | Threaded
Open this post in threaded view
|

Re: looking for 2 features to help pkg-config pc files

suzuki toshiya
In reply to this post by suzuki toshiya
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 <[hidden email]<mailto:[hidden email]>> 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
>

--

Powered by 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
Reply | Threaded
Open this post in threaded view
|

Re: looking for 2 features to help pkg-config pc files

Nikos Chantziaras
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 <[hidden email]<mailto:[hidden email]>> 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
>>
>


--

Powered by 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
Reply | Threaded
Open this post in threaded view
|

Re: looking for 2 features to help pkg-config pc files

Alan W. Irwin
In reply to this post by suzuki toshiya
On 2018-03-27 21:19+0900 suzuki toshiya wrote:

> Hi all,
>
> I'm looking for 2 features to generate pkg-config pc files.

Hi Suzuki:

CMake has its own native way of generating package information
describing software (see,
<https://cmake.org/cmake/help/git-stage/manual/cmake-packages.7.html>).
So it would be worthwhile in its own right for you to generate a
native CMake package for your software to benefit those of your users
who want to use find_package in Config mode to obtain all the
information they need about your software.  In fact, it has been
argued (see
<https://cmake.org/cmake/help/git-stage/manual/cmake-packages.7.html>)
that native CMake packages are so useful that it is worthwhile
generating those for external projects that don't produce them for
themselves.

Now moving to your question, once a native CMake package describing
software has been implemented, then it should be possible, in
principle, to translate the information in that native package into
pkg-config form (for the benefit of those who prefer pkg-config to
find_package in Config mode to obtain information about a software
package).  So this is an indirect way of fulfilling your need to
generate information about your software in pkg-config form, but the
very large side benefit is you also provide that information in native
CMake package form.

Alan
__________________________
Alan W. Irwin

Astronomical research affiliation with Department of Physics and Astronomy,
University of Victoria (astrowww.phys.uvic.ca).

Programming affiliations with the FreeEOS equation-of-state
implementation for stellar interiors (freeeos.sf.net); the Time
Ephemerides project (timeephem.sf.net); PLplot scientific plotting
software package (plplot.sf.net); the libLASi project
(unifont.org/lasi); the Loads of Linux Links project (loll.sf.net);
and the Linux Brochure Project (lbproject.sf.net).
__________________________

Linux-powered Science
__________________________
--

Powered by 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
Reply | Threaded
Open this post in threaded view
|

Re: looking for 2 features to help pkg-config pc files

Nikos Chantziaras
Note that one downside to that is that people not using CMake cannot
make use of that. They still need a pkgconfig file. So in a sense,
pkgconfig is the common denominator everybody can use, regardless of
build system.


On 27/03/18 20:36, Alan W. Irwin wrote:

> On 2018-03-27 21:19+0900 suzuki toshiya wrote:
>
>> Hi all,
>>
>> I'm looking for 2 features to generate pkg-config pc files.
>
> Hi Suzuki:
>
> CMake has its own native way of generating package information
> describing software (see,
> <https://cmake.org/cmake/help/git-stage/manual/cmake-packages.7.html>).
> So it would be worthwhile in its own right for you to generate a
> native CMake package for your software to benefit those of your users
> who want to use find_package in Config mode to obtain all the
> information they need about your software.  In fact, it has been
> argued (see
> <https://cmake.org/cmake/help/git-stage/manual/cmake-packages.7.html>)
> that native CMake packages are so useful that it is worthwhile
> generating those for external projects that don't produce them for
> themselves.
>
> Now moving to your question, once a native CMake package describing
> software has been implemented, then it should be possible, in
> principle, to translate the information in that native package into
> pkg-config form (for the benefit of those who prefer pkg-config to
> find_package in Config mode to obtain information about a software
> package).  So this is an indirect way of fulfilling your need to
> generate information about your software in pkg-config form, but the
> very large side benefit is you also provide that information in native
> CMake package form.
>
> Alan
> __________________________
> Alan W. Irwin
>
> Astronomical research affiliation with Department of Physics and Astronomy,
> University of Victoria (astrowww.phys.uvic.ca).
>
> Programming affiliations with the FreeEOS equation-of-state
> implementation for stellar interiors (freeeos.sf.net); the Time
> Ephemerides project (timeephem.sf.net); PLplot scientific plotting
> software package (plplot.sf.net); the libLASi project
> (unifont.org/lasi); the Loads of Linux Links project (loll.sf.net);
> and the Linux Brochure Project (lbproject.sf.net).
> __________________________
>
> Linux-powered Science
> __________________________


--

Powered by 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
Reply | Threaded
Open this post in threaded view
|

Re: looking for 2 features to help pkg-config pc files

Rolf Eike Beer
Am Dienstag, 27. März 2018, 21:25:51 schrieb Nikos Chantziaras:
> Note that one downside to that is that people not using CMake cannot
> make use of that. They still need a pkgconfig file. So in a sense,
> pkgconfig is the common denominator everybody can use, regardless of
> build system.

What happened with that autoconf macro that was able to read in .cmake files?

Eike
--

Powered by 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

signature.asc (188 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: looking for 2 features to help pkg-config pc files

Nikos Chantziaras
On 27/03/18 21:35, Rolf Eike Beer wrote:
> Am Dienstag, 27. März 2018, 21:25:51 schrieb Nikos Chantziaras:
>> Note that one downside to that is that people not using CMake cannot
>> make use of that. They still need a pkgconfig file. So in a sense,
>> pkgconfig is the common denominator everybody can use, regardless of
>> build system.
>
> What happened with that autoconf macro that was able to read in .cmake files?

I don't know. But there's other build systems out there too. Like Meson,
qmake, qbs... pkgconfig does seem like the sane thing to offer.

Basically, whenever I see a build system trying to invent its own
package configuration system, xkcb 927 pops into my mind :-P

--

Powered by 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
Reply | Threaded
Open this post in threaded view
|

Re: looking for 2 features to help pkg-config pc files

Alan W. Irwin
In reply to this post by Nikos Chantziaras
On 2018-03-27 21:25+0300 Nikos Chantziaras wrote:

> Note that one downside to that is that people not using CMake cannot make use
> of that.  They still need a pkgconfig file. So in a sense, pkgconfig is the
> common denominator everybody can use, regardless of build system.

It is not an either-or proposition.  Both kinds of packages are
useful. The pkg-config package is useful for the (lowest)
common-denominator reason you state, but for those already using
CMake, a native CMake package is considerably more powerful (e.g., the
ability to use generator expressions based on packages imported from a
native CMake package).

For these reasons in the PLplot case I generate both pkg-config and
native packages.  The current implementation uses independent logic
for each kind of package, but to absolutely guarantee consistent
information for the two kinds of packages, it would be desireable to
move to an implementation that uses generator expressions to extract
the required compiler and linker data from a generated native package
and configure the pkg-config result directly from those data. So if
somebody here has already tried that approach or the alternative
approach of converting pkg-config packages to native packages, I would
like to hear about it.

Alan
__________________________
Alan W. Irwin

Astronomical research affiliation with Department of Physics and Astronomy,
University of Victoria (astrowww.phys.uvic.ca).

Programming affiliations with the FreeEOS equation-of-state
implementation for stellar interiors (freeeos.sf.net); the Time
Ephemerides project (timeephem.sf.net); PLplot scientific plotting
software package (plplot.sf.net); the libLASi project
(unifont.org/lasi); the Loads of Linux Links project (loll.sf.net);
and the Linux Brochure Project (lbproject.sf.net).
__________________________

Linux-powered Science
__________________________
--

Powered by 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
Reply | Threaded
Open this post in threaded view
|

Re: looking for 2 features to help pkg-config pc files

suzuki toshiya
In reply to this post by suzuki toshiya
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@.

> 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 <[hidden email]<mailto:[hidden email]>> 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
>>>
>
>

--

Powered by 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
Reply | Threaded
Open this post in threaded view
|

Re: looking for 2 features to help pkg-config pc files

CMake mailing list
In reply to this post by suzuki toshiya
The BCM(boost cmake modules) has `bcm_auto_pkgconfig` which will generate the pkgconfig file from a target, including the “Require” variable:


It utilizes the `INTERFACE_PKG_CONFIG_NAME` property to generate the pkgconfig names for the dependent targets:


Currently, it doesn't coordinate with FindPkgConfig’s imported targets yet, so you will need to manually inject the name. However, when using `bcm_auto_export` it will export the property, so that when users finds the dependency with `find_package`, it knows the corresponding pkgconfig module.

On Mar 27, 2018, at 7:19 AM, suzuki toshiya <[hidden email]> 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

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


--

Powered by 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
Reply | Threaded
Open this post in threaded view
|

Re: looking for 2 features to help pkg-config pc files

suzuki toshiya
In reply to this post by suzuki toshiya
Dear Paul Fultz,

Great, I will take a look.
I'm glad to hear that you're also working on this issue!

Regards,
mpsuzuki

On 3/30/2018 9:08 AM, P F wrote:

> The BCM(boost cmake modules) has `bcm_auto_pkgconfig` which will generate the pkgconfig file from a target, including the “Require” variable:
>
> http://bcm.readthedocs.io/en/latest/src/BCMPkgConfig.html#bcm-auto-pkgconfig
>
> It utilizes the `INTERFACE_PKG_CONFIG_NAME` property to generate the pkgconfig names for the dependent targets:
>
> http://bcm.readthedocs.io/en/latest/src/BCMProperties.html#interface-pkg-config-name
>
> Currently, it doesn't coordinate with FindPkgConfig’s imported targets yet, so you will need to manually inject the name. However, when using `bcm_auto_export` it will export the property, so that when users finds the dependency with `find_package`, it knows the corresponding pkgconfig module.
>
> On Mar 27, 2018, at 7:19 AM, suzuki toshiya <[hidden email]<mailto:[hidden email]>> 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
>
>

--

Powered by 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