Compilando con Mono

Requerimientos

  • Mono 6.12.0 o posterior

  • MSBuild

  • NuGet

  • Solo en Linux/macOS: pkg-config

Es posible que necesites importar certificados necesarios para que NuGet realice solicitudes HTTPS.

El método recomendado es usar el paquete de certificados CA (Certificate Authorities) de curl.

Ejecuta los siguientes comandos para descargar e importar el paquete de certificados CA. En Windows, puedes ejecutarlos desde el símbolo del sistema de Mono (o desde el símbolo del sistema normal si has agregado el directorio "bin" de Mono a la variable de entorno "PATH"):

# If using PowerShell, replace `curl` with `curl.exe` below.
curl -LO https://curl.haxx.se/ca/cacert.pem
cert-sync --user cacert.pem

Alternativamente, puedes usar el siguiente comando, aunque está obsoleto y es posible que no funcione correctamente:

mozroots --import --sync

Variables de entorno

Por defecto, SCons intentará encontrar Mono en el Registro de Windows en Windows o mediante pkg-config en otras plataformas. Puedes especificar un directorio de instalación diferente pasando la opción mono_prefix en la línea de comandos a SCons; por ejemplo, scons [...] mono_prefix=%ProgramFiles%/Mono.

Este es el directorio que contiene las subcarpetas include y lib.

Habilitar el módulo Mono

Por defecto, el módulo Mono está deshabilitado durante la construcción. Para habilitarlo, agrega la opción module_mono_enabled=yes en la línea de comandos de SCons.

Generar el pegamento

Las fuentes de "glue" son las funciones envolventes que serán llamadas por los métodos administrados. Estos archivos de código fuente deben generarse antes de construir tus binarios finales. Para generarlos, primero debes compilar un binario temporal de Godot con las opciones tools=yes y mono_glue=no:

scons p=<platform> tools=yes module_mono_enabled=yes mono_glue=no

Después de que termine la compilación, debes ejecutar el ejecutable compilado con el parámetro --generate-mono-glue, seguido del directorio de salida. Este directorio debe ser modules/mono/glue en el directorio de Godot:

<godot_binary> --generate-mono-glue modules/mono/glue

Este comando indicará a Godot que genere el archivo modules/mono/glue/mono_glue.gen.cpp, la solución C# para la API de Godot en modules/mono/glue/GodotSharp/GodotSharp/Generated, y la solución C# para las herramientas del editor en modules/mono/glue/GodotSharp/GodotSharpEditor/Generated. Una vez que se generen estos archivos, puedes compilar Godot para todos los destinos deseados sin tener que repetir este proceso.

<godot_binary> se refiere al binario de herramientas que compilaste arriba con el módulo Mono habilitado. Su nombre exacto variará según tu sistema y configuración, pero debería tener la forma bin/godot.<plataforma>.tools.<bits>.mono, por ejemplo, bin/godot.x11.tools.64.mono o bin/godot.windows.tools.64.mono.exe. ¡Es especialmente importante tener en cuenta el sufijo .mono! Si has compilado previamente Godot sin soporte de Mono, es posible que tengas binarios con nombres similares, pero sin este sufijo. Estos binarios no se pueden utilizar para generar el glue de Mono.

Notas

  • No construyas tus binarios finales con mono_glue=no. Esto deshabilita el scripting de C#. Esta opción debe usarse solo para el binario temporal que generará el glue. Godot mostrará una advertencia al iniciarse si se compiló sin las fuentes de glue.

  • Las fuentes de glue deben regenerarse cada vez que cambie la API registrada en ClassDB. Es decir, por ejemplo, cuando se registra un nuevo método en la API de scripting o cuando uno de los parámetros de dicho método cambia. Godot mostrará un error al iniciarse si hay una discrepancia de API entre ClassDB y las fuentes de glue.

Reconstruyendo con Mono glue

Una vez que hayas generado el Mono glue, puedes compilar el binario final con mono_glue=yes. Este es el valor predeterminado para mono_glue, por lo que también puedes omitirlo. Para compilar un editor habilitado para Mono:

scons p=<platform> tools=yes module_mono_enabled=yes mono_glue=yes

Y plantillas de exportación con soporte para Mono:

scons p=<platform> tools=no module_mono_enabled=yes mono_glue=yes

Si todo salió bien, además de la salida normal, SCons debería haber creado los siguientes archivos en el directorio bin:

  • Si no estás enlazando el tiempo de ejecución de Mono estáticamente, el script de construcción colocará la biblioteca compartida del tiempo de ejecución de Mono ("monosgen-2.0") junto al ejecutable de Godot en el directorio de salida. Asegúrate de incluir esta biblioteca al distribuir Godot. Cuando apuntas a Android, no se requieren pasos adicionales, ya que esta biblioteca se copia automáticamente a "#platform/android/java/libs" y Gradle se encarga del resto.

  • A diferencia de las compilaciones "clásicas" de Godot, cuando se compila con el módulo Mono habilitado (y dependiendo de la plataforma de destino), se puede crear un directorio de datos tanto para el editor como para las plantillas de exportación. Este directorio es importante para el correcto funcionamiento y debe distribuirse junto con Godot. Puedes encontrar más detalles sobre este directorio en la sección Directorio de datos.

Ejemplos

Ejemplo (Windows)

# Build temporary binary
scons p=windows tools=yes module_mono_enabled=yes mono_glue=no
# Generate glue sources
bin\godot.windows.tools.64.mono --generate-mono-glue modules/mono/glue

### Build binaries normally
# Editor
scons p=windows target=release_debug tools=yes module_mono_enabled=yes
# Export templates
scons p=windows target=release_debug tools=no module_mono_enabled=yes
scons p=windows target=release tools=no module_mono_enabled=yes

Ejemplo (X11)

# Build temporary binary
scons p=x11 tools=yes module_mono_enabled=yes mono_glue=no
# Generate glue sources
bin/godot.x11.tools.64.mono --generate-mono-glue modules/mono/glue

### Build binaries normally
# Editor
scons p=x11 target=release_debug tools=yes module_mono_enabled=yes
# Export templates
scons p=x11 target=release_debug tools=no module_mono_enabled=yes
scons p=x11 target=release tools=no module_mono_enabled=yes

Directorio de Datos

El directorio de datos es una dependencia para los binarios de Godot compilados con el módulo Mono habilitado. Contiene archivos importantes para el correcto funcionamiento de Godot. Debe distribuirse junto con el ejecutable de Godot.

Nota

La información a continuación no se aplica a Android, iOS y WASM, ya que no hay un directorio de datos para estas plataformas.

Plantillas de exportación

El nombre del directorio de datos para una plantilla de exportación difiere según la configuración con la que se haya compilado. El formato es data.mono.<platform>.<bits>.<target>, por ejemplo, data.mono.x11.32.release_debug o data.mono.windows.64.release.

Este directorio debe colocarse con su nombre original junto a las plantillas de exportación de Godot. Cuando exportes un proyecto, Godot también copiará este directorio con el ejecutable del juego, pero el nombre se cambiará a data_<APPNAME>, donde <APPNAME> es el nombre de la aplicación especificado en la configuración del proyecto en application/config/name.

En el caso de macOS, donde la plantilla de exportación se comprime como un archivo ZIP, el contenido del directorio de datos se puede colocar en las siguientes ubicaciones dentro del archivo ZIP:

bin/data.mono.<platform>.<bits>.<target>/Mono/lib

/osx_template.app/Contents/Frameworks/GodotSharp/Mono/lib

bin/data.mono.<platform>.<bits>.<target>/Mono/etc

/osx_template.app/Contents/Resources/GodotSharp/Mono/etc

Editor

El nombre del directorio de datos para el editor de Godot siempre será GodotSharp. El contenido de este directorio es el siguiente:

  • Api

  • Mono (opcional)

  • Tools

El subdirectorio Api contiene las bibliotecas de la API de Godot. En macOS, si el editor de Godot se distribuye como paquete, el contenido del directorio de datos puede colocarse en las siguientes ubicaciones:

bin/data.mono.<platform>.<bits>.<target>/Api

<bundle_name>.app/Contents/Frameworks/GodotSharp/Api

bin/data.mono.<platform>.<bits>.<target>/Mono/lib

<bundle_name>.app/Contents/Frameworks/GodotSharp/Mono/lib

bin/data.mono.<platform>.<bits>.<target>/Mono/etc

<bundle_name>.app/Contents/Resources/GodotSharp/Mono/etc

bin/data.mono.<platform>.<bits>.<target>/Tools

<bundle_name>.app/Contents/Frameworks/GodotSharp/Tools

El subdirectorio Mono es opcional. Será necesario cuando distribuyas el editor, ya que pueden surgir problemas si la versión de Mono instalada por el usuario no es idéntica a la que se utilizó para compilar el editor de Godot. Para crear esta carpeta y su contenido, debes pasar el parámetro copy_mono_root=yes a SCons al compilar el editor.

El subdirectorio Tools contiene herramientas necesarias para el editor, como las bibliotecas GodotTools y sus dependencias.

Creando el runtime de Mono

Cuando compiles Godot para escritorio, es probable que utilices el tiempo de ejecución de Mono precompilado que está instalado en tu sistema. Esto probablemente no será así cuando te dirijas a otras plataformas como Android, iOS y WebAssembly. Tendrás que compilar el tiempo de ejecución de Mono tú mismo para esas plataformas.

Recomendamos utilizar estos scripts de compilación. Simplifican este proceso y también incluyen algunos parches necesarios para un funcionamiento adecuado con Godot. Consulta el archivo README en el enlace anterior para obtener instrucciones sobre cómo utilizar los scripts.

Exportación para Android

La compilación de las plantillas de exportación de Android con Mono es un poco más sencilla que para las plataformas de escritorio, ya que no se requieren pasos adicionales después de la compilación. No es necesario preocuparse por las dependencias en tiempo de ejecución, como un directorio de datos o la biblioteca compartida (cuando se vincula de forma dinámica), ya que estos se agregan automáticamente al proyecto de Gradle.

Una vez que hayas compilado Mono, puedes proceder a compilar Godot siguiendo las instrucciones descritas en esta página y en la página Compilación para Android. Asegúrate de informar a SCons sobre la ubicación del tiempo de ejecución de Mono que acabas de compilar, por ejemplo: scons [...] mono_prefix="$HOME/mono-installs/android-armeabi-v7a-release" (Esta ruta puede ser diferente en tu sistema).

Exportación para iOS

Una vez que hayas compilado Mono, puedes proceder a compilar Godot siguiendo las instrucciones descritas en esta página y en la página Compilación para iOS. Asegúrate de informar a SCons sobre la ubicación del tiempo de ejecución de Mono que acabas de compilar, por ejemplo: scons [...] mono_prefix="$HOME/mono-installs/ios-arm64-release" (Esta ruta puede ser diferente en tu sistema).

Después de compilar Godot para cada arquitectura, notarás que SCons ha copiado las bibliotecas de Mono para cada una de ellas en el directorio de salida:

#bin/libmono-native.iphone.<arch>.a
#bin/libmonosgen-2.0.iphone.<arch>.a
#bin/libmonoprofiler-log.iphone.<arch>.a

#bin/libmono-ilgen.iphone.<arch>.a
#bin/libmono-ee-interp.iphone.<arch>.a
#bin/libmono-icall-table.iphone.<arch>.a

Las últimas tres son solo para dispositivos iOS y no están disponibles para el simulador de iOS.

Estas bibliotecas deben ser colocadas en archivos "fat" universales (multi-arquitectura) para ser distribuidas con las plantillas de exportación.

El siguiente script de bash creará las bibliotecas "fat" en el directorio #bin/ios/iphone-mono-libs:

mkdir -p bin/ios
mkdir -p bin/ios/iphone-mono-libs

lipo -create bin/libmonosgen-2.0.iphone.arm64.a bin/libmonosgen-2.0.iphone.x86_64.a -output bin/ios/iphone-mono-libs/libmonosgen-2.0.iphone.fat.a
lipo -create bin/libmono-native.iphone.arm64.a bin/libmono-native.iphone.x86_64.a -output bin/ios/iphone-mono-libs/libmono-native.iphone.fat.a
lipo -create bin/libmono-profiler-log.iphone.arm64.a bin/libmono-profiler-log.iphone.x86_64.a -output bin/ios/iphone-mono-libs/libmono-profiler-log.iphone.fat.a

# The Mono libraries for the interpreter are not available for simulator builds
lipo -create bin/libmono-ee-interp.iphone.arm64.a -output bin/ios/iphone-mono-libs/libmono-ee-interp.iphone.fat.a
lipo -create bin/libmono-icall-table.iphone.arm64.a -output bin/ios/iphone-mono-libs/libmono-icall-table.iphone.fat.a
lipo -create bin/libmono-ilgen.iphone.arm64.a -output bin/ios/iphone-mono-libs/libmono-ilgen.iphone.fat.a

La carpeta iphone-mono-libs debe distribuirse junto con las plantillas de exportación. El editor de Godot buscará las bibliotecas en <templates>/iphone-mono-libs/lib<nombre>.iphone.fat.a.

Exportación para WebAssembly

La compilación para WebAssembly actualmente involucra el mismo proceso independientemente de si el módulo Mono está habilitado o no.

Una vez que hayas construido Mono, puedes proceder a construir Godot siguiendo las instrucciones descritas en esta página y en la página Compiling for the Web. Asegúrate de indicarle a SCons la ubicación del tiempo de ejecución de Mono que acabas de construir, por ejemplo: scons [...] mono_prefix="$HOME/mono-installs/wasm-runtime-release" (Esta ruta puede ser diferente en tu sistema).

Biblioteca de Clase Base

Las plantillas de exportación también deben incluir la BCL (Biblioteca de Clases Base) para cada plataforma de destino. Godot busca la carpeta de BCL en <templates>/bcl/<target_platform>, donde <target_platform> es el mismo nombre que se pasa a la opción platform de SCons, por ejemplo: <templates>/bcl/windows, <templates>/bcl/javascript.

Alternativamente, Godot buscará las bibliotecas BCL en las siguientes ubicaciones:

Android

<templates>/bcl/monodroid

iOS

<templates>/bcl/monotouch

WebAssembly

<templates>/bcl/wasm

Linux y macOS

<templates>/bcl/net_4_x

Windows

<templates>/bcl/net_4_x_win

A partir de ahora, asumimos que el mismo perfil BCL puede ser utilizado tanto para Linux como para macOS, pero esto podría cambiar en el futuro, ya que no están garantizados para ser iguales (como es el caso del BCL de Windows).

Si la plataforma de destino es la misma que la plataforma del editor de Godot, entonces el editor utilizará el BCL en el que se está ejecutando (<data_folder>/Mono/lib/mono/4.5) si no puede encontrar el BCL en las plantillas de exportación.

AOT cross-compilers

Para realizar la compilación anticipada (AOT) para otras plataformas, Godot necesita tener acceso a los compiladores cruzados de Mono para esa plataforma y arquitectura.

Godot buscará el ejecutable del compilador cruzado en la carpeta de compiladores AOT. La ubicación de esta carpeta es <data_folder>/Tools/aot-compilers/.

Para crear los compiladores entre plataformas, recomendamos usar estos build scripts.

Después de construirlos, copia el ejecutable en el directorio de compiladores AOT de Godot. El nombre del ejecutable es <triple>-mono-sgen, por ejemplo: aarch64-apple-darwin-mono-sgen.

Opciones de la línea de comandos

La siguiente es la lista de opciones de línea de comandos disponibles al compilar con el módulo Mono:

  • module_mono_enabled=yes | no

    • Compila Godot con el módulo Mono habilitado.

  • mono_glue=yes | no

    • Si incluir los archivos de código fuente de pegamento (glue) en la compilación y definir "MONO_GLUE_DISABLED" como una macro del preprocesador.

  • mono_prefix=path

    • Ruta al directorio de instalación de Mono para la plataforma y arquitectura de destino.

  • mono_static=yes | no

    • Si se debe enlazar el tiempo de ejecución de Mono de forma estática.

    • El valor predeterminado es para iOS y WASM, y no para otras plataformas.

  • copy_mono_root=yes | no

    • Si se debe copiar el conjunto de ensamblados y archivos de configuración del framework de Mono necesarios para el editor de Godot.