From 5676159aa52a734a34bf231b400ae13860e1012d Mon Sep 17 00:00:00 2001 From: "j.r" Date: Fri, 18 Feb 2022 18:50:02 +0100 Subject: [PATCH] Fix python executed during configure Previously it relied on AX_PYTHON_DEVEL, which in turn executes python-config to get the build flags. However this does not work while cross compiling because we can't execute the python-config build for the target platform. To circumvent this problem the python build flags are now queried via pkgconfig, which has the drawback of not having some extra build flags, but they do not seem to be needed. I tested this patch with the termux build system and it build without their existing hack of injecting python after the configure step. I also tested non cross compile build on Arch Linux and it also still works. Fixes #851 --- configure.ac | 9 ++++----- src/plugins/python_api.c | 8 ++++---- src/plugins/python_plugins.c | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/configure.ac b/configure.ac index d260ce50..d75ba114 100644 --- a/configure.ac +++ b/configure.ac @@ -98,10 +98,9 @@ elif test "x$enable_python_plugins" != xno; then AC_MSG_NOTICE([Symlinking Python.framework to $PYTHON_FRAMEWORK]) rm -f Python.framework ln -s $PYTHON_FRAMEWORK Python.framework ]) - AC_CHECK_PROG(PYTHON_CONFIG_EXISTS, python-config, yes, no) - AC_CHECK_PROG(PYTHON3_CONFIG_EXISTS, python3-config, yes, no) + PKG_CHECK_MODULES([python], [python-embed], [PYTHON_CONFIG_EXISTS=yes], [PYTHON_CONFIG_EXISTS=no]) + PKG_CHECK_MODULES([python], [python3-embed], [PYTHON3_CONFIG_EXISTS=yes; AC_DEFINE(PY_IS_PYTHON3, [1], [Is Python version 3])], [PYTHON3_CONFIG_EXISTS=no]) if test "$PYTHON_CONFIG_EXISTS" = "yes" || test "$PYTHON3_CONFIG_EXISTS" = "yes"; then - AX_PYTHON_DEVEL AM_CONDITIONAL([BUILD_PYTHON_API], [true]) AC_DEFINE([HAVE_PYTHON], [1], [Python support]) else @@ -357,9 +356,9 @@ AS_IF([test "x$PLATFORM" = xosx], [AM_CFLAGS="$AM_CFLAGS -Qunused-arguments"]) AM_CFLAGS="$AM_CFLAGS $PTHREAD_CFLAGS $glib_CFLAGS $gio_CFLAGS $curl_CFLAGS ${SQLITE_CFLAGS}" -AM_CFLAGS="$AM_CFLAGS $libnotify_CFLAGS ${GTK_CFLAGS} $PYTHON_CPPFLAGS" dnl https://bugs.python.org/issue15018 +AM_CFLAGS="$AM_CFLAGS $libnotify_CFLAGS ${GTK_CFLAGS} $python_CFLAGS" dnl https://bugs.python.org/issue15018 AM_CFLAGS="$AM_CFLAGS -DTHEMES_PATH=\"\\\"$THEMES_PATH\\\"\" -DICONS_PATH=\"\\\"$ICONS_PATH\\\"\" -DGLOBAL_PYTHON_PLUGINS_PATH=\"\\\"$GLOBAL_PYTHON_PLUGINS_PATH\\\"\" -DGLOBAL_C_PLUGINS_PATH=\"\\\"$GLOBAL_C_PLUGINS_PATH\\\"\"" -LIBS="$glib_LIBS $gio_LIBS $PTHREAD_LIBS $curl_LIBS $libnotify_LIBS $PYTHON_LIBS $PYTHON_EXTRA_LIBS $PYTHON_LDFLAGS ${GTK_LIBS} ${SQLITE_LIBS} $LIBS" +LIBS="$glib_LIBS $gio_LIBS $PTHREAD_LIBS $curl_LIBS $libnotify_LIBS $python_LIBS ${GTK_LIBS} ${SQLITE_LIBS} $LIBS" AC_SUBST(AM_LDFLAGS) AC_SUBST(AM_CFLAGS) diff --git a/src/plugins/python_api.c b/src/plugins/python_api.c index 90e33579..0b91cf70 100644 --- a/src/plugins/python_api.c +++ b/src/plugins/python_api.c @@ -1575,7 +1575,7 @@ static PyMethodDef apiMethods[] = { { NULL, NULL, 0, NULL } }; -#if PY_MAJOR_VERSION >= 3 +#ifdef PY_IS_PYTHON3 static struct PyModuleDef profModule = { PyModuleDef_HEAD_INIT, "prof", @@ -1588,7 +1588,7 @@ static struct PyModuleDef profModule = { PyMODINIT_FUNC python_api_init(void) { -#if PY_MAJOR_VERSION >= 3 +#ifdef PY_IS_PYTHON3 PyObject* result = PyModule_Create(&profModule); if (!result) { log_debug("Failed to initialise prof module"); @@ -1604,7 +1604,7 @@ python_api_init(void) void python_init_prof(void) { -#if PY_MAJOR_VERSION >= 3 +#ifdef PY_IS_PYTHON3 PyImport_AppendInittab("prof", python_api_init); Py_Initialize(); PyEval_InitThreads(); @@ -1640,7 +1640,7 @@ python_str_or_unicode_to_string(void* obj) return NULL; } -#if PY_MAJOR_VERSION >= 3 +#ifdef PY_IS_PYTHON3 if (PyUnicode_Check(pyobj)) { PyObject* utf8_str = PyUnicode_AsUTF8String(pyobj); char* result = strdup(PyBytes_AS_STRING(utf8_str)); diff --git a/src/plugins/python_plugins.c b/src/plugins/python_plugins.c index 94c77e99..c32d177c 100644 --- a/src/plugins/python_plugins.c +++ b/src/plugins/python_plugins.c @@ -908,7 +908,7 @@ _handle_string_or_none_result(ProfPlugin* plugin, PyObject* result, char* hook) _python_undefined_error(plugin, hook, "string, unicode or None"); return NULL; } -#if PY_MAJOR_VERSION >= 3 +#ifdef PY_IS_PYTHON3 if (result != Py_None && !PyUnicode_Check(result) && !PyBytes_Check(result)) { allow_python_threads(); _python_type_error(plugin, hook, "string, unicode or None");