forked from gentoo/gentoo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
app-pda/libimobiledevice: fix Python bindings
Also add python3_11 to PYTHON_TARGETS. Signed-off-by: Matthew Smith <[email protected]>
- Loading branch information
1 parent
6409a79
commit 73d11cc
Showing
2 changed files
with
337 additions
and
0 deletions.
There are no files selected for viewing
223 changes: 223 additions & 0 deletions
223
app-pda/libimobiledevice/files/libimobiledevice-1.3.0-python.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,223 @@ | ||
https://github.com/libimobiledevice/libimobiledevice/pull/685 | ||
|
||
From fb337f26c8e58ed0ce0750f7899ccbd5da203dee Mon Sep 17 00:00:00 2001 | ||
From: wendyisgr33n <[email protected]> | ||
Date: Mon, 30 Jul 2018 10:43:57 -0700 | ||
Subject: [PATCH 1/5] Fixed AFC afc.pxi definitions for Python2/3 | ||
compatibility. Added missing public method 'remove_path_and_contents' | ||
|
||
--- a/cython/afc.pxi | ||
+++ b/cython/afc.pxi | ||
@@ -52,6 +52,7 @@ cdef extern from "libimobiledevice/afc.h": | ||
afc_error_t afc_read_directory(afc_client_t client, char *dir, char ***list) | ||
afc_error_t afc_get_file_info(afc_client_t client, char *filename, char ***infolist) | ||
afc_error_t afc_remove_path(afc_client_t client, char *path) | ||
+ afc_error_t afc_remove_path_and_contents(afc_client_t client, char *path) | ||
afc_error_t afc_rename_path(afc_client_t client, char *f, char *to) | ||
afc_error_t afc_make_directory(afc_client_t client, char *dir) | ||
afc_error_t afc_truncate(afc_client_t client, char *path, uint64_t newsize) | ||
@@ -235,17 +236,17 @@ cdef class AfcClient(BaseService): | ||
afc_file_mode_t c_mode | ||
uint64_t handle | ||
AfcFile f | ||
- if mode == <bytes>'r': | ||
+ if mode == b'r': | ||
c_mode = AFC_FOPEN_RDONLY | ||
- elif mode == <bytes>'r+': | ||
+ elif mode == b'r+': | ||
c_mode = AFC_FOPEN_RW | ||
- elif mode == <bytes>'w': | ||
+ elif mode == b'w': | ||
c_mode = AFC_FOPEN_WRONLY | ||
- elif mode == <bytes>'w+': | ||
+ elif mode == b'w+': | ||
c_mode = AFC_FOPEN_WR | ||
- elif mode == <bytes>'a': | ||
+ elif mode == b'a': | ||
c_mode = AFC_FOPEN_APPEND | ||
- elif mode == <bytes>'a+': | ||
+ elif mode == b'a+': | ||
c_mode = AFC_FOPEN_RDAPPEND | ||
else: | ||
raise ValueError("mode string must be 'r', 'r+', 'w', 'w+', 'a', or 'a+'") | ||
@@ -282,6 +283,9 @@ cdef class AfcClient(BaseService): | ||
cpdef remove_path(self, bytes path): | ||
self.handle_error(afc_remove_path(self._c_client, path)) | ||
|
||
+ cpdef remove_path_and_contents(self, bytes path): | ||
+ self.handle_error(afc_remove_path_and_contents(self._c_client, path)) | ||
+ | ||
cpdef rename_path(self, bytes f, bytes t): | ||
self.handle_error(afc_rename_path(self._c_client, f, t)) | ||
|
||
@@ -308,17 +312,17 @@ cdef class Afc2Client(AfcClient): | ||
afc_file_mode_t c_mode | ||
uint64_t handle | ||
AfcFile f | ||
- if mode == <bytes>'r': | ||
+ if mode == b'r': | ||
c_mode = AFC_FOPEN_RDONLY | ||
- elif mode == <bytes>'r+': | ||
+ elif mode == b'r+': | ||
c_mode = AFC_FOPEN_RW | ||
- elif mode == <bytes>'w': | ||
+ elif mode == b'w': | ||
c_mode = AFC_FOPEN_WRONLY | ||
- elif mode == <bytes>'w+': | ||
+ elif mode == b'w+': | ||
c_mode = AFC_FOPEN_WR | ||
- elif mode == <bytes>'a': | ||
+ elif mode == b'a': | ||
c_mode = AFC_FOPEN_APPEND | ||
- elif mode == <bytes>'a+': | ||
+ elif mode == b'a+': | ||
c_mode = AFC_FOPEN_RDAPPEND | ||
else: | ||
raise ValueError("mode string must be 'r', 'r+', 'w', 'w+', 'a', or 'a+'") | ||
|
||
From b71e8935949a1d6f419a3f783d804809fb4c309b Mon Sep 17 00:00:00 2001 | ||
From: wendyisgr33n <[email protected]> | ||
Date: Mon, 30 Jul 2018 10:44:40 -0700 | ||
Subject: [PATCH 2/5] Fixed debugserver.pxi PyString_AsString compatibility | ||
with Python3 | ||
|
||
--- a/cython/debugserver.pxi | ||
+++ b/cython/debugserver.pxi | ||
@@ -44,7 +44,12 @@ cdef class DebugServerError(BaseError): | ||
|
||
|
||
# from http://stackoverflow.com/a/17511714 | ||
-from cpython.string cimport PyString_AsString | ||
+# https://github.com/libimobiledevice/libimobiledevice/pull/198 | ||
+from cpython cimport PY_MAJOR_VERSION | ||
+if PY_MAJOR_VERSION <= 2: | ||
+ from cpython.string cimport PyString_AsString | ||
+else: | ||
+ from cpython.bytes cimport PyBytes_AsString as PyString_AsString | ||
cdef char ** to_cstring_array(list_str): | ||
if not list_str: | ||
return NULL | ||
|
||
From 44f54cdc0ebb052e4a642023bbf96504e6139ec9 Mon Sep 17 00:00:00 2001 | ||
From: wendyisgr33n <[email protected]> | ||
Date: Mon, 30 Jul 2018 10:45:22 -0700 | ||
Subject: [PATCH 3/5] Fixed bytes/strings check in imobiledevice.pyx for | ||
compatibility with Python2/3 | ||
|
||
--- a/cython/imobiledevice.pyx | ||
+++ b/cython/imobiledevice.pyx | ||
@@ -171,7 +171,7 @@ from libc.stdlib cimport * | ||
cdef class iDevice(Base): | ||
def __cinit__(self, object udid=None, *args, **kwargs): | ||
cdef char* c_udid = NULL | ||
- if isinstance(udid, basestring): | ||
+ if isinstance(udid, (str, bytes)): | ||
c_udid = <bytes>udid | ||
elif udid is not None: | ||
raise TypeError("iDevice's constructor takes a string or None as the udid argument") | ||
|
||
From 8908619973e751b778d3fb73dc309cd5cb7f4122 Mon Sep 17 00:00:00 2001 | ||
From: wendyisgr33n <[email protected]> | ||
Date: Mon, 30 Jul 2018 10:45:55 -0700 | ||
Subject: [PATCH 4/5] Fixed bytes/strings checks in lockdown.pxi for | ||
compatibility with Python2/3 | ||
|
||
--- a/cython/lockdown.pxi | ||
+++ b/cython/lockdown.pxi | ||
@@ -230,9 +230,9 @@ cdef class LockdownClient(PropertyListService): | ||
|
||
if issubclass(service, BaseService) and \ | ||
service.__service_name__ is not None \ | ||
- and isinstance(service.__service_name__, basestring): | ||
+ and isinstance(service.__service_name__, (str, bytes)): | ||
c_service_name = <bytes>service.__service_name__ | ||
- elif isinstance(service, basestring): | ||
+ elif isinstance(service, (str, bytes)): | ||
c_service_name = <bytes>service | ||
else: | ||
raise TypeError("LockdownClient.start_service() takes a BaseService or string as its first argument") | ||
@@ -253,7 +253,7 @@ cdef class LockdownClient(PropertyListService): | ||
|
||
if not hasattr(service_class, '__service_name__') and \ | ||
not service_class.__service_name__ is not None \ | ||
- and not isinstance(service_class.__service_name__, basestring): | ||
+ and not isinstance(service_class.__service_name__, (str, bytes)): | ||
raise TypeError("LockdownClient.get_service_client() takes a BaseService as its first argument") | ||
|
||
descriptor = self.start_service(service_class) | ||
|
||
From e59cbdbf4e7dba98ef57a54e314a89edfea0a3dc Mon Sep 17 00:00:00 2001 | ||
From: wendyisgr33n <[email protected]> | ||
Date: Mon, 30 Jul 2018 10:47:48 -0700 | ||
Subject: [PATCH 5/5] Fixed method visibility in mobilebackup2.pxi API | ||
|
||
--- a/cython/mobilebackup2.pxi | ||
+++ b/cython/mobilebackup2.pxi | ||
@@ -54,10 +54,10 @@ cdef class MobileBackup2Client(PropertyListService): | ||
cdef inline BaseError _error(self, int16_t ret): | ||
return MobileBackup2Error(ret) | ||
|
||
- cdef send_message(self, bytes message, plist.Node options): | ||
+ cpdef send_message(self, bytes message, plist.Node options): | ||
self.handle_error(mobilebackup2_send_message(self._c_client, message, options._c_node)) | ||
|
||
- cdef tuple receive_message(self): | ||
+ cpdef tuple receive_message(self): | ||
cdef: | ||
char* dlmessage = NULL | ||
plist.plist_t c_node = NULL | ||
@@ -73,29 +73,34 @@ cdef class MobileBackup2Client(PropertyListService): | ||
free(dlmessage) | ||
raise | ||
|
||
- cdef int send_raw(self, bytes data, int length): | ||
+ cpdef int send_raw(self, bytes data, int length): | ||
cdef: | ||
- uint32_t bytes = 0 | ||
+ uint32_t bytes_recvd = 0 | ||
mobilebackup2_error_t err | ||
- err = mobilebackup2_send_raw(self._c_client, data, length, &bytes) | ||
+ err = mobilebackup2_send_raw(self._c_client, data, length, &bytes_recvd) | ||
try: | ||
self.handle_error(err) | ||
- return <bint>bytes | ||
+ return <bint>bytes_recvd | ||
except BaseError, e: | ||
raise | ||
|
||
- cdef int receive_raw(self, bytes data, int length): | ||
+ cpdef int receive_raw(self, bytearray data, int length): | ||
cdef: | ||
- uint32_t bytes = 0 | ||
+ uint32_t bytes_recvd = 0 | ||
mobilebackup2_error_t err | ||
- err = mobilebackup2_receive_raw(self._c_client, data, length, &bytes) | ||
+ err = mobilebackup2_receive_raw(self._c_client, data, length, &bytes_recvd) | ||
+ | ||
+ # Throwing an exception when we test if theres more data to read is excessive | ||
+ if err == -1 and bytes_recvd == 0: | ||
+ return 0 | ||
+ | ||
try: | ||
self.handle_error(err) | ||
- return <bint>bytes | ||
+ return <bint>bytes_recvd | ||
except BaseError, e: | ||
raise | ||
|
||
- cdef float version_exchange(self, double[::1] local_versions): | ||
+ cpdef float version_exchange(self, double[::1] local_versions): | ||
cdef: | ||
double[::1] temp = None | ||
double remote_version = 0.0 | ||
@@ -107,8 +112,8 @@ cdef class MobileBackup2Client(PropertyListService): | ||
except BaseError, e: | ||
raise | ||
|
||
- cdef send_request(self, bytes request, bytes target_identifier, bytes source_identifier, plist.Node options): | ||
+ cpdef send_request(self, bytes request, bytes target_identifier, bytes source_identifier, plist.Node options): | ||
self.handle_error(mobilebackup2_send_request(self._c_client, request, target_identifier, source_identifier, options._c_node)) | ||
|
||
- cdef send_status_response(self, int status_code, bytes status1, plist.Node status2): | ||
+ cpdef send_status_response(self, int status_code, bytes status1, plist.Node status2): | ||
self.handle_error(mobilebackup2_send_status_response(self._c_client, status_code, status1, status2._c_node)) |
114 changes: 114 additions & 0 deletions
114
app-pda/libimobiledevice/libimobiledevice-1.3.0-r2.ebuild
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
# Copyright 1999-2023 Gentoo Authors | ||
# Distributed under the terms of the GNU General Public License v2 | ||
|
||
EAPI=7 | ||
|
||
PYTHON_COMPAT=( python3_{9..11} ) | ||
|
||
inherit autotools python-r1 | ||
|
||
DESCRIPTION="Support library to communicate with Apple iPhone/iPod Touch devices" | ||
HOMEPAGE="https://www.libimobiledevice.org/" | ||
SRC_URI="https://github.com/libimobiledevice/libimobiledevice/releases/download/${PV}/${P}.tar.bz2" | ||
|
||
# While COPYING* doesn't mention 'or any later version', all the headers do, hence use + | ||
LICENSE="GPL-2+ LGPL-2.1+" | ||
SLOT="0/1.0-6" # based on SONAME of libimobiledevice-1.0.so | ||
KEYWORDS="~amd64 ~arm ~arm64 ~loong ~ppc ~ppc64 ~riscv ~x86" | ||
IUSE="doc gnutls python static-libs" | ||
REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )" | ||
|
||
RDEPEND=" | ||
>=app-pda/libplist-2.2.0:= | ||
>=app-pda/libusbmuxd-2.0.2:= | ||
gnutls? ( | ||
dev-libs/libgcrypt:0 | ||
>=dev-libs/libtasn1-1.1 | ||
>=net-libs/gnutls-2.2.0 | ||
) | ||
!gnutls? ( | ||
dev-libs/openssl:0= | ||
) | ||
python? ( | ||
${PYTHON_DEPS} | ||
app-pda/libplist[python(-),${PYTHON_USEDEP}] | ||
) | ||
" | ||
DEPEND=" | ||
${RDEPEND} | ||
" | ||
BDEPEND=" | ||
virtual/pkgconfig | ||
doc? ( app-doc/doxygen ) | ||
python? ( >=dev-python/cython-0.17[${PYTHON_USEDEP}] ) | ||
" | ||
|
||
BUILD_DIR="${S}_build" | ||
|
||
PATCHES=( | ||
"${FILESDIR}/${P}-slibtool.patch" | ||
"${FILESDIR}/${P}-missing_libflags.patch" #787962 | ||
"${FILESDIR}/${P}-python.patch" | ||
) | ||
|
||
src_prepare() { | ||
default | ||
eautoreconf | ||
} | ||
|
||
src_configure() { | ||
local ECONF_SOURCE=${S} | ||
|
||
local myeconfargs=( $(use_enable static-libs static) ) | ||
use gnutls && myeconfargs+=( --disable-openssl ) | ||
|
||
do_configure() { | ||
mkdir -p "${BUILD_DIR}" || die | ||
pushd "${BUILD_DIR}" >/dev/null || die | ||
econf "${myeconfargs[@]}" "${@}" | ||
popd >/dev/null || die | ||
} | ||
|
||
do_configure_python() { | ||
# Bug 567916 | ||
local -x PYTHON_LDFLAGS="$(python_get_LIBS)" | ||
do_configure "$@" | ||
} | ||
|
||
do_configure --without-cython | ||
use python && python_foreach_impl do_configure_python | ||
} | ||
|
||
src_compile() { | ||
python_compile() { | ||
emake -C "${BUILD_DIR}"/cython \ | ||
VPATH="${S}/cython:$1/cython" \ | ||
imobiledevice_la_LIBADD="$1/src/libimobiledevice-1.0.la" | ||
} | ||
|
||
emake -C "${BUILD_DIR}" | ||
use python && python_foreach_impl python_compile "${BUILD_DIR}" | ||
|
||
if use doc; then | ||
doxygen "${BUILD_DIR}"/doxygen.cfg || die | ||
fi | ||
} | ||
|
||
src_install() { | ||
python_install() { | ||
emake -C "${BUILD_DIR}/cython" install \ | ||
DESTDIR="${D}" \ | ||
VPATH="${S}/cython:$1/cython" | ||
} | ||
|
||
emake -C "${BUILD_DIR}" install DESTDIR="${D}" | ||
use python && python_foreach_impl python_install "${BUILD_DIR}" | ||
use doc && dodoc docs/html/* | ||
|
||
if use python; then | ||
insinto /usr/include/${PN}/cython | ||
doins cython/imobiledevice.pxd | ||
fi | ||
|
||
find "${D}" -name '*.la' -delete || die | ||
} |