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 
<mpsuz...@hiroshima-u.ac.jp<mailto:mpsuz...@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




--

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 via email to