python: use more idiomatic cmake pkg-config linking

cmake documentation is absolutely atrocious, and I don't know why they
mention all the wrong things to use, and the cargo cult of successfully
writing a cmake build definition (copy-pasting what works from other
projects) also uses all the wrong things. But it turns out it is
possible to correctly link a PkgConfig target despite all that, at
least, *iff* you use cmake >= 3.13. I've chosen option 2, which is to
vendor in cmake >= 3.13's FindPkgConfig module in the previous commit.

Using IMPORTED_TARGET GLOBAL in a pkg-config check will result in a
proper linker target being created. For comparison, this is like using
meson's dependency() target, except meson forces you to do this by
default. The result is that the build system's internal representation
of how to link something, is used instead of manually passing build
flags defined in variables.

This is an important distinction to make, because cmake does not have a
list datatype, and instead turns lists into strings separated by ';'
which are indistinguishable from, like, strings which contain ';'
characters. When you pass the resulting list-which-isn't-really-a-list
to link an executable/library, you either need to preprocess the
variable to replace ';' with ' ' (just in case there are multiple
elements) or use cmake functions which magically know to do this
themselves -- or at least, I assume there are cmake functions that
correctly handle so-called "lists", or there would be no need for
"lists" to exist.

The IMPORTED_TARGET will define a bunch of INTERFACE_* properties which
do seem to do exactly this. The resulting build definition should
actually, correctly, link python, thereby fixing #1398 in a better way.
v2.8-utf8proc
Eli Schwartz 2019-11-10 10:24:25 -05:00 committed by Sébastien Helleu
parent 682e558f76
commit 5c8ac69f73
2 changed files with 3 additions and 10 deletions

View File

@ -31,7 +31,7 @@
include(FindPkgConfig)
if(ENABLE_PYTHON2)
pkg_check_modules(PYTHON python2)
pkg_check_modules(PYTHON python2 IMPORTED_TARGET GLOBAL)
else()
pkg_check_modules(PYTHON python3)
pkg_check_modules(PYTHON python3 IMPORTED_TARGET GLOBAL)
endif()

View File

@ -24,14 +24,7 @@ add_library(python MODULE
set_target_properties(python PROPERTIES PREFIX "")
if(PYTHON_FOUND)
# There's a weird bug on FreeBSD: the value of PYTHON_LDFLAGS is
# "-L/usr/local/lib;-lpython3.6m" instead of "-L/usr/local/lib -lpython3.6m".
# This is a temporary hack to fix the value, waiting for a clean fix.
string(REPLACE ";" " " PYTHON_LDFLAGS "${PYTHON_LDFLAGS}")
include_directories(${PYTHON_INCLUDE_DIRS})
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${PYTHON_LDFLAGS}")
target_link_libraries(python ${PYTHON_LIBRARIES} weechat_plugins_scripts coverage_config)
target_link_libraries(python PkgConfig::PYTHON weechat_plugins_scripts coverage_config)
endif()
install(TARGETS python LIBRARY DESTINATION ${WEECHAT_LIBDIR}/plugins)