Hi all,
Here is the updated patch to write extra dependencies
to pkg-config files if archive library is built.
https://github.com/mpsuzuki/poppler/compare/5e7aef...cmake-for-static
I attached a patch without .travis.yml.
In comparison with my last patch, my function definitions
are separated to cmake/modules/FindPkgCfgFromLdflags.cmake
(about 70 lines), but still 100 lines are added to
CMakeLists.txt. If it's still too large for poppler
maintainers, I would separate more.
=======================================================
my classifications are following.
building for win32
------------------
do nothing, same with before patch.
building shared library with newer pkg-config >= 0.18
------------------------------------------------------
extra dependencies for archive library are written to
Requires.private and Libs.private, but we cannot check
whether it is working, because we don't build archive
library in this config.
building shared library with older pkg-config < 0.18
-----------------------------------------------------
do nothing, same with before patch, because
older pkg-config does not support xxx.private variables.
building archive library
-------------------------
extra dependency for archive libraries are written to
Requires and Libs, xxx.private variables are not used.
=======================================================
on ubuntu and macos, linking of external program finishes
successfully.
https://travis-ci.org/mpsuzuki/poppler/builds/358343594
I want to test for Win32 (to add a condition, the
environment by free software is expected), so please
let me know the standard environment to confirm if
I break nothing.
Regards,
mpsuzuki
diff --git a/CMakeLists.txt b/CMakeLists.txt
index efa6c3f..9b36190 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -419,6 +419,7 @@ if(ENABLE_SPLASH)
splash/SplashXPathScanner.cc
)
endif()
+
if(FONTCONFIG_FOUND)
set(poppler_LIBS ${poppler_LIBS} ${FONTCONFIG_LIBRARIES})
endif()
@@ -676,12 +677,106 @@ if(PKG_CONFIG_EXECUTABLE)
exec_program(${PKG_CONFIG_EXECUTABLE} ARGS --version RETURN_VALUE _return_VALUE OUTPUT_VARIABLE _output_VAR)
macro_ensure_version("0.18" "${_output_VAR}" PKG_CONFIG_VERSION_0_18)
endif()
-if(PKG_CONFIG_VERSION_0_18)
- set(PC_REQUIRES "")
- set(PC_REQUIRES_PRIVATE "Requires.private: poppler = ${POPPLER_VERSION}")
-else()
- set(PC_REQUIRES "poppler = ${POPPLER_VERSION}")
- set(PC_REQUIRES_PRIVATE "")
+
+# if archive library of poppler is being built, it cannot hold
+# the dependency. collect dependencies managed by pkg-config,
+# write to Requires. other dependencies (e.g. no appropriate
+# pkg-config module is found), write to Libs.
+
+include(FindPkgCfgFromLdflags)
+set(cmake_pc_requires "")
+set(cmake_pc_libs "")
+
+# dependencies we can assume pkg-config always
+if (FONTCONFIG_FOUND)
+ set(cmake_pc_requires "${cmake_pc_requires} fontconfig")
+endif()
+if (CURL_FOUND)
+ set(cmake_pc_requires "${cmake_pc_requires} libcurl")
+endif()
+if (NSS3_FOUND)
+ set(cmake_pc_requires "${cmake_pc_requires} nss")
+endif()
+if (LIBOPENJPEG2_FOUND)
+ set(cmake_pc_requires "${cmake_pc_requires} libopenjp2")
+endif()
+
+# dependencies we cannot assume pkg-config always
+if (ICONV_FOUND)
+ APPEND_PKG_REQUIRES_OR_LIBS("Iconv;iconv"
+ "${ICONV_LIBRARIES}"
+ cmake_pc_cpp_requires cmake_pc_cpp_libs)
+endif()
+if (LCMS2_FOUND)
+ APPEND_PKG_REQUIRES_OR_LIBS("lcms2"
+ "${LCMS2_LIBRARIES}"
+ cmake_pc_requires cmake_pc_libs)
+endif()
+if (ZLIB_FOUND)
+ APPEND_PKG_REQUIRES_OR_LIBS("zlib"
+ "${ZLIB_LIBRARIES}"
+ cmake_pc_requires cmake_pc_libs)
+endif()
+if (JPEG_FOUND)
+ APPEND_PKG_REQUIRES_OR_LIBS("libjpeg;libjpeg8-turbo;libjpeg8;libjpeg9;libjpeg62"
+ "${JPEG_LIBRARY}"
+ cmake_pc_requires cmake_pc_libs)
+endif()
+if (TIFF_FOUND)
+ APPEND_PKG_REQUIRES_OR_LIBS("libtiff;libtiff-4"
+ "${TIFF_LIBRARY}"
+ cmake_pc_requires cmake_pc_libs)
+endif()
+if (PNG_FOUND)
+ APPEND_PKG_REQUIRES_OR_LIBS("libpng;libpng16;libpng12"
+ "${PNG_LIBRARY}"
+ cmake_pc_requires cmake_pc_libs)
+endif()
+if (CMAKE_USE_PTHREADS_INIT)
+ string(FIND "libpthread${CMAKE_SHARED_LIBRARY_SUFFIX}" "${poppler_LIBS}" _pos)
+ if (_pos LESS 0)
+ string(FIND "libpthread${CMAKE_STATIC_LIBRARY_SUFFIX}" "${poppler_LIBS}" _pos)
+ endif()
+
+ if (_pos LESS 0)
+ set(cmake_pc_libs "${cmake_pc_libs} -pthread")
+ else()
+ set(cmake_pc_libs "${cmake_pc_libs} -lpthread")
+ endif()
+endif()
+
+string(REPLACE " -lc " "" cmake_pc_libs " ${cmake_pc_libs} ")
+string(REPLACE " -lc " "" cmake_pc_cpp_libs " ${cmake_pc_cpp_libs} ")
+string(STRIP "${cmake_pc_libs}" cmake_pc_libs)
+string(STRIP "${cmake_pc_cpp_libs}" cmake_pc_cpp_libs)
+
+#
+# to guarantee "pkg-config --libs poppler" always valid,
+# we use Requires + Libs instead of Requires.private,
+# if archive library is being built.
+#
+if(WIN32)
+
+elseif(BUILD_SHARED_LIBS AND PKG_CONFIG_VERSION_0_18)
+ #
+ # too old pkg-config-0.18 cannot hold private values
+ #
+ set(POPPLER_REQUIRES_PRIVATE "Requires.private: ${cmake_pc_requires}")
+ set(POPPLER_LIBS_PRIVATE "Libs.private: ${cmake_pc_libs}")
+ set(POPPLER_CPP_REQUIRES_PRIVATE "Requires.private: poppler = ${POPPLER_VERSION} ${cmake_pc_cpp_requires}")
+ set(POPPLER_CPP_LIBS_PRIVATE "Libs.private: poppler = ${cmake_pc_cpp_libs}")
+ set(POPPLER_GLIB_REQUIRES_PRIVATE "Requires.private: poppler = ${POPPLER_VERSION}")
+ set(POPPLER_QT5_REQUIRES_PRIVATE "Requires.private: poppler = ${POPPLER_VERSION}")
+
+elseif(NOT(BUILD_SHARED_LIBS))
+ set(POPPLER_REQUIRES "Requires: ${cmake_pc_requires}")
+ set(POPPLER_LIBS_EXTRA "${cmake_pc_libs}")
+
+ set(POPPLER_CPP_REQUIRES_EXTRA "poppler = ${POPPLER_VERSION} ${cmake_pc_cpp_requires}")
+ set(POPPLER_CPP_LIBS_EXTRA "${cmake_pc_cpp_libs}")
+ set(POPPLER_GLIB_REQUIRES_EXTRA "poppler = ${POPPLER_VERSION}")
+ set(POPPLER_QT5_REQUIRES_EXTRA "poppler = ${POPPLER_VERSION}")
+
endif()
poppler_create_install_pkgconfig(poppler.pc ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
diff --git a/cmake/modules/FindPkgCfgFromLdflags.cmake b/cmake/modules/FindPkgCfgFromLdflags.cmake
new file mode 100644
index 0000000..0564ff5
--- /dev/null
+++ b/cmake/modules/FindPkgCfgFromLdflags.cmake
@@ -0,0 +1,68 @@
+# ---------------------------------------------------------------
+# generate conventional LIBS flags from pathname of the libraries
+#
+function (MAKE_LDFLAGS_AND_LIBS_FROM_LIBRARY_PATHNAME pathname libname libdir)
+ string(REGEX REPLACE "/[^/]+$" "/" _libdir "${pathname}")
+
+ string(REGEX REPLACE "^.*/lib" "" _libname "${pathname}")
+ if (${libname} MATCHES ".*\\${CMAKE_STATIC_LIBRARY_SUFFIX}$")
+ string(REGEX REPLACE "\\${CMAKE_STATIC_LIBRARY_SUFFIX}$" "" _libname "${_libname}")
+ else()
+ string(REGEX REPLACE "\\${CMAKE_SHARED_LIBRARY_SUFFIX}$" "" _libname "${_libname}")
+ endif()
+
+ string(REGEX REPLACE "\/+$" "" _libdir "${_libdir}")
+
+ set("${libname}" "${_libname}" PARENT_SCOPE)
+ set("${libdir}" "${_libdir}" PARENT_SCOPE)
+endfunction()
+
+# ---------------------------------------------------------------
+# if package is maganed by pkg-config, append it list_requires.
+# if not, append LDFLAGS + LIBS to list_libs.
+#
+function (APPEND_PKG_REQUIRES_OR_LIBS pkgnames library list_requires list_libs)
+ # message("")
+ # message("check pkg-config + flags for ${library}")
+ MAKE_LDFLAGS_AND_LIBS_FROM_LIBRARY_PATHNAME("${library}" pkg_libname pkg_libdir)
+
+ foreach(a_pkg IN LISTS pkgnames)
+ execute_process(COMMAND "${PKG_CONFIG_EXECUTABLE}" ${a_pkg} --exists
+ RESULT_VARIABLE _result_VARIABLE
+ OUTPUT_VARIABLE _pkgconfigDevNull )
+ # message("check pkg-config --exists ${a_pkg}: ${_result_VARIABLE}")
+ if (_result_VARIABLE STREQUAL "0")
+ execute_process(COMMAND "${PKG_CONFIG_EXECUTABLE}" ${a_pkg} --variable=libdir
+ RESULT_VARIABLE _result_VARIABLE
+ OUTPUT_VARIABLE _output_VARIABLE
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ # message("check pkg-config --variable=libdir ${a_pkg}: ${_output_VARIABLE}")
+ # message("${_output_VARIABLE} == ${pkg_libdir}")
+ if ("${_output_VARIABLE}" STREQUAL "${pkg_libdir}")
+ execute_process(COMMAND "${PKG_CONFIG_EXECUTABLE}" ${a_pkg} --libs
+ RESULT_VARIABLE _result_VARIABLE
+ OUTPUT_VARIABLE _output_VARIABLE
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ # message("check pkg-config --libs ${a_pkg}: ${_output_VARIABLE}")
+ string(REGEX REPLACE "\/+$" "" _output_VARIABLE "${_output_VARIABLE}")
+ string(FIND " ${_output_VARIABLE} " " -l${pkg_libname} " _pos)
+ if (_pos GREATER -1)
+ set(${list_requires} "${${list_requires}} ${a_pkg}" PARENT_SCOPE)
+ return()
+ endif()
+ else()
+ # message("*** different directories")
+ endif()
+ endif()
+ endforeach(a_pkg)
+
+ string(STRIP "${pkg_libname}" pkg_libname)
+ string(STRIP "${pkg_libdir}" pkg_libdir)
+ if ("${pkg_libname}" STREQUAL "")
+ set(${list_libs} "${${list_libs}}" PARENT_SCOPE)
+ elseif ("${pkg_libdir}" STREQUAL "")
+ set(${list_libs} "${${list_libs}} -l${pkg_libname}" PARENT_SCOPE)
+ else()
+ set(${list_libs} "${${list_libs}} -L${pkg_libdir} -l${pkg_libname}" PARENT_SCOPE)
+ endif()
+endfunction()
diff --git a/poppler-cpp.pc.cmake b/poppler-cpp.pc.cmake
index 3eb68b3..e91ffd8 100644
--- a/poppler-cpp.pc.cmake
+++ b/poppler-cpp.pc.cmake
@@ -5,8 +5,9 @@ includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
Name: poppler-cpp
Description: cpp backend for Poppler PDF rendering library
Version: @POPPLER_VERSION@
-Requires: @PC_REQUIRES@
-@PC_REQUIRES_PRIVATE@
+Requires: @POPPLER_CPP_REQUIRES_EXTRA@
+@POPPLER_CPP_REQUIRES_PRIVATE@
-Libs: -L${libdir} -lpoppler-cpp
Cflags: -I${includedir}/poppler/cpp
+Libs: -L${libdir} -lpoppler-cpp @POPPLER_CPP_LIBS_EXTRA@
+@POPPLER_CPP_LIBS_PRIVATE@
diff --git a/poppler-glib.pc.cmake b/poppler-glib.pc.cmake
index ac24819..e3040fc 100644
--- a/poppler-glib.pc.cmake
+++ b/poppler-glib.pc.cmake
@@ -5,8 +5,9 @@ includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
Name: poppler-glib
Description: GLib wrapper for poppler
Version: @POPPLER_VERSION@
-Requires: glib-2.0 >= @GLIB_REQUIRED@ gobject-2.0 >= @GLIB_REQUIRED@ cairo >= @CAIRO_VERSION@
-@PC_REQUIRES_PRIVATE@
+Requires: glib-2.0 >= @GLIB_REQUIRED@ gobject-2.0 >= @GLIB_REQUIRED@ cairo >= @CAIRO_VERSION@ @POPPLER_GLIB_REQUIRES_EXTRA@
+@POPPLER_GLIB_REQUIRES_PRIVATE@
-Libs: -L${libdir} -lpoppler-glib
Cflags: -I${includedir}/poppler/glib
+Libs: -L${libdir} -lpoppler-glib @POPPLER_GLIB_LIBS_EXTRA@
+@POPPLER_GLIB_LIBS_PRIVATE@
diff --git a/poppler-qt5.pc.cmake b/poppler-qt5.pc.cmake
index 9463689..1ac5809 100644
--- a/poppler-qt5.pc.cmake
+++ b/poppler-qt5.pc.cmake
@@ -5,8 +5,9 @@ includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
Name: poppler-qt5
Description: Qt5 bindings for poppler
Version: @POPPLER_VERSION@
-Requires: @PC_REQUIRES@
-@PC_REQUIRES_PRIVATE@
+Requires: @POPPLER_QT5_REQUIRES_EXTRA@
+@POPPLER_QT5_REQUIRES_PRIVATE@
-Libs: -L${libdir} -lpoppler-qt5
Cflags: -I${includedir}/poppler/qt5
+Libs: -L${libdir} -lpoppler-qt5 @POPPLER_QT5_LIBS_EXTRA@
+@POPPLER_QT5_LIBS_PRIVATE@
diff --git a/poppler.pc.cmake b/poppler.pc.cmake
index 00b7348..ab3aeee 100644
--- a/poppler.pc.cmake
+++ b/poppler.pc.cmake
@@ -5,6 +5,9 @@ includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
Name: poppler
Description: PDF rendering library
Version: @POPPLER_VERSION@
+@POPPLER_REQUIRES@
+@POPPLER_REQUIRES_PRIVATE@
-Libs: -L${libdir} -lpoppler
Cflags: -I${includedir}/poppler
+Libs: -L${libdir} -lpoppler @POPPLER_LIBS_EXTRA@
+@POPPLER_LIBS_PRIVATE@
_______________________________________________
poppler mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/poppler