the started programming para language descargar swift linux macos cross-compiling

swift - started - xcode linux



Swift compilación cruzada a un binario de linux único (2)

¿Es posible compilar un binario Swift desde una computadora OS X para que se ejecute en un servidor que ejecute Linux como un binario único sin bibliotecas adicionales que necesiten estar vinculadas dinámicamente?

La respuesta corta? ¡Por supuesto que es! ¡Cualquier cosa es posible cuando pones tu corazón en ello!

¿Es eficiente? Inherentemente, no.

Aunque estoy seguro de que todos aquí están familiarizados con lo que hace un compilador, por el bien de esta pregunta y sus usuarios más nuevos, un compilador es una aplicación que convierte el código legible y lo mapea a un formato binario que una computadora puede entender. Sin embargo, vale la pena mencionar que no todas las computadoras son iguales. Cada sistema operativo de computadora tiene una asignación binaria diferente a la otra, por lo que una operación simple como copiar valores podría expresarse como 1010 en una máquina y 0101 en otra. Como se mencionó anteriormente en muchas preguntas anteriores, y por ejemplo en esta , muchos lenguajes de programación se pueden construir en una variedad de máquinas, pero muy pocos de ellos son portátiles porque cada computadora tiene un mapeo binario diferente.

~~~~~~~ Entonces, ¿cómo arreglamos esto? ~~~~~~~

  • Bueno, hay una serie de soluciones para solucionar este problema. El método más obvio es simplemente hacer de su entorno el entorno objetivo y construir su programa a su gusto. Obviamente, ya lo hizo a través de una máquina virtual y esto es lo que muchos desarrolladores harán. Esta es, con mucho, la solución más sencilla, pero anula el propósito de la pregunta en la que simplemente desea construir desde su máquina OSX.

Anteriormente, usted dijo que escuchó a la gente hablar sobre compilar programas de Windows en máquinas Linux. Cygwin es una plataforma de desarrollo destinada a obtener el marco de Windows que normalmente no está presente en las máquinas Linux y permite que muchos programas se creen con el marco de Windows en mente. Sin embargo, todo lo que hace es agregar binarios para que el compilador tenga algunos lugares adecuados a los que asignarse cuando solo se encuentran los comandos de Windows dentro de una configuración. Todo lo que hace es introducir las configuraciones binarias necesarias para que un programa se pueda portar con éxito. Esto se enlaza con la segunda opción.

  • En segundo lugar viene un compilador que soporta compilación multiplataforma. Si bien actualmente no estoy informado y / o no estoy familiarizado con tales compiladores, esta es técnicamente una solución válida, pero ¿lo llamaría confiable? Probablemente no. Si está agregando más trabajo a su compilador, ya que no solo tiene que asignar correctamente la sintaxis de un programa de computadora para una computadora, también debe perder tiempo para vincularlo a los nuevos binarios. Además, necesitaría que el compilador recuerde estos enlaces, lo que podría implicar más espacio de memoria desperdiciado para tener este compilador.

Incluso en ese caso, los sistemas como estos son muy escasos y el hecho de que garantice su funcionamiento dependerá de qué tan bien los mantenedores de los compiladores conocen sus cosas, con qué frecuencia lo actualizan, etc. El primer lugar no es algo en lo que me esté metiendo la vida.

  • La tercera solución, y quizás la más ideal, es buscar tecnologías de contenedores, como la docker . Sus contenedores son esencialmente formas para que usted construya su aplicación y la transfiera a nuevas máquinas sin tener que cambiar o modificar nada sobre cómo compilarla y compilarla. Simplemente cree uno, guárdelo en un contenedor, llévelo a la máquina de su elección e intégrelo en su proyecto actual. Ahora que lo pienso, los sistemas de contenedores como la ventana acoplable se construyeron para evitar lo mismo que está experimentando actualmente, donde tiene un código fuente que funciona en su única máquina pero no en ningún otro lugar. Algo así como la ventana acoplable podrá ejecutar su código en cualquier máquina sin tener que recompilarlo para cada nueva máquina.

Docker proporciona un marco interesante para la comunicación de contenedor a contenedor, ejemplos de aplicaciones y tiene una documentación bastante sencilla que valdría la pena ver para ver si su proyecto podría tener algunas de sus partes portadas a la ventana acoplable.

Dicho esto, hay varias formas de solucionar el problema que enfrenta actualmente, por lo que, como ingeniero de software, depende de usted cuál será la forma más idónea de manejar su proyecto.

// EDIT //

Editaré esto para ser una mejor respuesta una vez que no esté muerto de cansancio.

¿Es posible compilar un binario Swift desde una computadora OS X para que se ejecute en un servidor que ejecute Linux como un binario único sin bibliotecas adicionales que necesiten estar vinculadas dinámicamente?

Estoy pensando en algo como pasar un -target al comando swift y pasar otro parámetro para permitir que vincule estáticamente todas las dependencias, pero no estoy seguro de cuáles son los comandos exactos.

El valor exacto para -target parece ser bastante difícil de alcanzar.

¿Necesito saber la distribución de destino exacta para poder pasar la cadena correcta al parámetro -target ?


De leer las fuentes en github

  • el objetivo sería Linux
  • la máquina sería x86_64

Esto es llamado por el script de construcción primaria

Este siempre responde una parte de la pregunta.

El valor exacto para -getar parece ser bastante difícil de alcanzar.

Instale una cadena de herramientas GCC para Mac OSX que pueda reorientar Linux, por ejemplo, un repositorio que puedo ver es OSXCross .

Proporcione los valores a las variables de entorno a GCC antes de ejecutar el script, que hace referencia a esa cadena de herramientas.

Desafortunadamente, eso no garantiza que funcionará, pero inténtelo y vea qué sucede.