2 votos

Crear GDAL 3.x para iOS

He estado construyendo GDAL 2.x para iOS durante años, pero voy a tener una necesidad imperiosa de actualizar a 3.6 cuando se libere (espero que a finales de este año). Por lo tanto ahora necesito ser capaz de construir GDAL 3.x para iOS.

Para GDAL 2.x, he estado utilizando el método de compilación documentado en Creación de GDAL para iOS . Ese método no funcionará con la versión 3.6 cuando se publique, porque la 3.6 requerirá el método de compilación 'cmake' y ya no soportará autoconf.

No estoy nada familiarizado con 'cmake', así que voy aprendiendo sobre la marcha, pero aún no he conseguido llegar muy lejos.

Persistiré y publicaré aquí mi método si finalmente consigo que funcione.

Mientras tanto, ¿alguien más ha conseguido compilar GDAL 3.x para iOS utilizando cmake?

2voto

Son of a Beach Puntos 184

Tras dos semanas de investigación, pruebas y varias rondas de correspondencia con los desarrolladores de GDAL, por fin he conseguido que GDAL 3.5 se compile para iOS utilizando 'cmake'. El procedimiento completo se documenta a continuación, incluyendo la construcción para el simulador de iPhone (x86_64), así como el dispositivo iPhone (arm64), además de la construcción de una biblioteca FAT para ambas plataformas.

Es posible que con el tiempo perfeccione aún más el procedimiento aquí documentado.

Es posible que esta construcción no se adapte a todas las personas ni a todos los propósitos. No incluye todas las dependencias posibles y, por tanto, algunas funciones opcionales de GDAL no estarán disponibles. Pero incluye todo lo que necesito, y probablemente todo lo que sería necesario para muchos otros usos de iOS.

Todavía no he incorporado esto a mi propia aplicación para iOS y, por lo tanto, aún no lo he probado. Simplemente he completado la compilación sin errores.

PROCEDIMIENTO:

Dependiendo de la plataforma (por ejemplo, dispositivo arm64 o simulador x86_64), seleccione sólo UNA del conjunto de variables de entorno dependientes de la plataforma para cada ejecución del procedimiento. Si lo desea, ejecute todo el procedimiento de nuevo para la otra plataforma.

Opcionalmente, combine la salida de ambos en una biblioteca FAT utilizando el paso del final.

También podrían construirse otras plataformas (por ejemplo, macOS arm64, simulador arm64, etc). Sin embargo, no creo que puedan combinarse en una biblioteca FAT si tienen el mismo tipo de arquitectura (CPU).

Instala el gestor de paquetes Homebrew:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Instala cmake usando Homebrew:

brew install cmakecmake --build . --target install

Instala ios.toolchain.cmake:

Descargar de: https://github.com/leetal/ios-cmake

Instalar en: $HOME/Documents/Development/3rdParty/ios-cmake-master/ios.toolchain.cmake

Variables de entorno:

Notas:

  • Seleccione una de las siguientes opciones de plataforma para cada compilación (o personalícela para otras plataformas según sea necesario)
  • El uso del elemento "iphoneos" o "iphonesimulator" en la ruta prefijada permite incluir fácilmente la ruta en la configuración de XCode "Library Search Paths" mediante la variable de entorno de XCode "$(PLATFORM_NAME)

    export CMTOOLCHAIN=$HOME/Documents/Development/3rdParty/ios-cmake-master/ios.toolchain.cmake

    for iPhone arm64 device

    export PREFIX=$HOME/build/iphoneos export SDKPATH=$(xcrun --sdk iphoneos --show-sdk-path) export OS=OS64

    for iPhone x86_64 simulator

    export PREFIX=$HOME/build/iphonesimulator export SDKPATH=$(xcrun --sdk iphonesimulator --show-sdk-path) export OS=SIMULATOR64

Construye SQLite:

A SQLite de Apple le falta la extensión RTREE, necesaria para construir GDAL.

Descargue la amalgama SQLite compatible con CMAKE desde: https://github.com/azadkuh/sqlite-amalgamation

cd sqlite-amalgamation-master
rm -r build; mkdir build; cd build
cmake -DCMAKE_TOOLCHAIN_FILE=$CMTOOLCHAIN \
    -DPLATFORM=$OS \
    -DENABLE_BITCODE=OFF \
    -DCMAKE_INSTALL_PREFIX=$PREFIX \
    -DSQLITE_ENABLE_RTREE=ON \
    -DSQLITE_ENABLE_COLUMN_METADATA=ON \
    -DSQLITE_OMIT_DECLTYPE=OFF \
    ..
cmake --build .
cmake --build . --target install

Construir Proj:

cd proj-{VERSION}
rm -r build; mkdir build; cd build
cmake -DCMAKE_TOOLCHAIN_FILE=$CMTOOLCHAIN \
    -DPLATFORM=$OS \
    -DENABLE_BITCODE=OFF \
    -DCMAKE_INSTALL_PREFIX=$PREFIX \
    -DENABLE_TIFF=OFF \
    -DENABLE_CURL=OFF \
    -DBUILD_PROJSYNC=OFF \
    -DSQLITE3_INCLUDE_DIR=$PREFIX/include \
    -DSQLITE3_LIBRARY=$PREFIX/lib/libsqlite3.a \
    ..
cmake --build .
cmake --build . --target install

Parche GDAL 3.5:

Véase el contenido del archivo del parche, más abajo. El parche fue sugerido por el desarrollador de GDAL y creo que será incorporado en futuras distribuciones de GDAL (aunque la 3.5.1 acaba de salir hoy, así que demasiado tarde para esa).

patch gdal-{VERSION}/cmake/helpers/configure.cmake PATCH_configure.cmake

Construye GDAL:

Notas:

  • Especificar la ruta a PROJ no debería ser necesario(?) porque cmake añade automáticamente CMAKE_INSTALL_PREFIX a CMAKE_SYSTEM_PREFIX_PATH sin embargo, en la práctica falla al 98% sin -DPROJ_ROOT=$PREFIX porque intenta usar /Library/proj.framework
  • cmake encuentra y utiliza iconv de libc al que le faltan algunos símbolos requeridos por GDAL (causa errores al compilar gdal_fuzzer), por lo que es necesario forzarlo explícitamente a utilizar libiconv en su lugar (del SDK de iOS)

    cd gdal-{VERSION} rm -r build; mkdir build; cd build cmake -DCMAKE_TOOLCHAIN_FILE=$CMTOOLCHAIN \ -DPLATFORM=$OS \ -DENABLE_BITCODE=OFF \ -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DBUILD_APPS=OFF \ -DBUILD_SHARED_LIBS=OFF \ -DBUILD_PYTHON_BINDINGS=OFF \ -DPROJ_ROOT=$PREFIX \ -DSQLITE3_INCLUDE_DIR=$PREFIX/include \ -DSQLITE3_LIBRARY=$PREFIX/lib/libsqlite3.a \ -DIconv_INCLUDE_DIR=$SDKPATH/usr \ -DIconv_LIBRARY=$SDKPATH/usr/lib/libiconv.tbd \ -DCMAKE_BUILD_TYPE=Release \ .. cmake --build . cmake --build . --target install

ARCHIVO DE PARCHEO

Para que el procedimiento anterior funcione con GDAL 3.5 es necesario el siguiente archivo de parche.

PATCH_configure.cmake:

--- orig/configure.cmake    2022-05-11 00:03:37.000000000 +1000
+++ patched/configure.cmake 2022-07-06 18:54:48.000000000 +1000
@@ -41,6 +41,7 @@
 check_type_size("int" SIZEOF_INT)
 check_type_size("unsigned long" SIZEOF_UNSIGNED_LONG)
 check_type_size("void*" SIZEOF_VOIDP)
+check_type_size("size_t" SIZEOF_SIZE_T)

 if (MSVC)
   set(HAVE_VSNPRINTF 1)
@@ -116,6 +117,13 @@
         "
     HAVE_5ARGS_MREMAP)

+  check_c_source_compiles(
+    "
+        #include <pthread.h>
+        int main() { pthread_atfork(0,0,0); 0; }
+        "
+    HAVE_PTHREAD_ATFORK)
+
   check_include_file("sys/stat.h" HAVE_SYS_STAT_H)
   if (${CMAKE_SYSTEM} MATCHES "Linux")
       check_include_file("linux/fs.h" HAVE_LINUX_FS_H)
@@ -233,6 +241,27 @@
     set(VSI_FTRUNCATE64 "ftruncate")
   endif ()

+  # For some reason, above tests detect xxxx64 symbols for iOS, which are not
+  # available at build time.
+  if (${CMAKE_SYSTEM_NAME} MATCHES "iOS")
+    set(VSI_FOPEN64 "fopen")
+    set(VSI_FTRUNCATE64 "ftruncate")
+    set(VSI_FTELL64 "ftell")
+    set(VSI_FSEEK64 "fseek")
+    set(VSI_STAT64 "stat")
+    set(VSI_STAT64_T "stat")
+    unset(HAVE_FOPEN64)
+    unset(HAVE_FOPEN64 CACHE)
+    unset(HAVE_FTRUNCATE64)
+    unset(HAVE_FTRUNCATE64 CACHE)
+    unset(HAVE_FTELL64)
+    unset(HAVE_FTELL64 CACHE)
+    unset(HAVE_FSEEK64)
+    unset(HAVE_FSEEK64 CACHE)
+    unset(HAVE_STATVFS64)
+    unset(HAVE_STATVFS64 CACHE)
+  endif()
+
   set(UNIX_STDIO_64 TRUE)

   set(INCLUDE_XLOCALE_H)
@@ -313,4 +342,4 @@
   set(MACOSX_FRAMEWORK OFF)
 endif ()

-# vim: ts=4 sw=4 sts=4 et
+# vim: ts=4 sw=4 sts=4 et
\ No newline at end of file

Generar biblioteca FAT GDAL (por ejemplo, para dispositivo ARM y simulador x86_64):

Las rutas exactas de las bibliotecas aquí dependerán de lo que se configuró en las variables de entorno específicas de la plataforma, más arriba.

lipo -create -output $HOME/build/lib/libgdal.a $HOME/build/iphoneos/lib/libgdal.a $HOME/build/iphonesimulator/lib/libgdal.a```

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X