Open4

Cygwinでlibimobiledeviceを動かそうとしたけどダメだった

okuokuokuoku

敗因: Windows上のlibusbではコンフィギュレーションを変更できないため

これはどうしようもないね。。これは大昔のissueの一発目で指摘 https://github.com/libimobiledevice/libimobiledevice/issues/151#issuecomment-64983130 されている。

iTunes for Windowsがlibimobiledevice相当の機能を実装しているので、だいたいのツールはそちらを使用できる ...というか逆か。libimobiledeviceが、usbmux等必要なmacOS側の機能を再実装している。

最近のlibusbはusbdkドライバをサポートしているが、これもconfigの変更を現状サポートしていないようだし、仮にこれを乗り越えたとしても:

libusb: error [libusb_get_pollfds] external polling of libusb's internal descriptors is not yet supported on Windows platforms

Cygwinの poll とlibusbを繋ぐ手段が存在しない。

okuokuokuoku

getaddrinfo が謎のエラー 10093 を返却する

libimobiledevice配下のプロジェクトは、Win32なビルドでは ws2_32 をリンクしてしまうため、 configure.ac を編集して防ぐ必要がある。

diff --git a/configure.ac b/configure.ac
index cdd388b..667ec1e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -67,7 +67,7 @@ fi
 # Check for operating system
 AC_MSG_CHECKING([for platform-specific build settings])
 case ${host_os} in
-  *mingw32*|*cygwin*)
+  *mingw32*)
     AC_MSG_RESULT([${host_os}])
     win32=true
     AC_DEFINE(WINVER, 0x0501, [minimum Windows version])

エラーコード 10093 はWinsockのエラー WSANOTINITIALISED に相当する。

okuokuokuoku

MACアドレスの取得

libimobiledevice-glue のビルドは

#error get_primary_mac_address is not supported on this platform

によって失敗してしまう。

Cygwinも getifaddrs 自体は実装しているので、こんな感じで良いはず。。

diff --git a/src/socket.c b/src/socket.c
index ad6135f..339bb68 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -742,6 +742,15 @@ LIBIMOBILEDEVICE_GLUE_API int get_primary_mac_address(unsigned char mac_addr_buf
                                result = 0;
                                break;
                        }
+#elif defined (__CYGWIN__)
+                       if (ifa->ifa_data) {
+                            if(ifa->ifa_flags & IFF_LOOPBACK) {
+                                continue;
+                            }
+                               memcpy(mac_addr_buf, ((struct sockaddr*)ifa->ifa_data)->sa_data /* is ifaddrs_hwdata */, 6);
+                               result = 0;
+                               break;
+                       }
 #else
 #error get_primary_mac_address is not supported on this platform.
 #endif
okuokuokuoku

ビルドのメモ

以下の順にビルドする:

  1. https://github.com/libimobiledevice/libplist
  2. https://github.com/libimobiledevice/libimobiledevice-glue
  3. https://github.com/libimobiledevice/libusbmuxd
  4. https://github.com/libimobiledevice/libimobiledevice
  5. https://github.com/libimobiledevice/usbmuxd

ただし、普通に ./autogen.sh && make && make install する前に

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig

して pkg-config のパスを通しておく必要がある。