/ / Swift compilación cruzada a un solo binario de linux - swift, linux, macos, compilación cruzada

Swift compilación cruzada a binario de linux simple - swift, linux, macos, compilación cruzada

¿Es posible compilar un binario veloz desde una computadora con OS X para que se ejecute en un servidor que ejecute Linux como un solo binario sin bibliotecas adicionales que deban vincularse dinámicamente?

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

El valor exacto de -target Parece ser bastante esquivo.

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

Respuestas

11 para la respuesta № 1

De leer las fuentes en github

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

Esto es llamado por el primario construir script

Esto, como siempre, responde una parte de la pregunta

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

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

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 funcione, pero pruébelo y vea qué sucede.


1 para la respuesta № 2

¿Es posible compilar un binario veloz desde una computadora con OS X para que se ejecute en un servidor que ejecute Linux como un solo binario sin bibliotecas adicionales que deban vincularse dinámicamente?

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

¿Es eficiente? Inherentemente, no.

Si bien estoy seguro de que todos aquí están familiarizados con lo que hace un compilador, en aras de esta pregunta y de los usuarios más nuevos, un compilador es una aplicación que convierte la lectura humanacodifica y lo asigna 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 un mapeo binario diferente que el otro, 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 indicó anteriormente en muchas preguntas anteriores, y por ejemplo este, muchos lenguajes de programación son edificable en una variedad de máquinas, pero muy pocas de ellas son portátil a través de ellos porque cada computadora tiene un mapeo binario diferente.

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

  • Bueno, hay una serie de soluciones para solucionar esto. Lo mas obvio El método es simplemente hacer de su entorno el entorno objetivo y construye tu programa a tu gusto. Obviamente ya lo hiciste esto a través de una máquina virtual y esto típicamente lo que muchos los desarrolladores lo harán. Esta es, con mucho, la solución más fácil, pero Derrota el propósito de la pregunta donde simplemente quieres construir desde su máquina OSX.

Anteriormente dijiste que escuchaste a la gente hablar sobre compilar programas de Windows en máquinas Linux. Cygwin es una plataforma de desarrollo destinada a obtenerEl marco de Windows que normalmente no está presente en las máquinas Linux y permite construir muchos programas teniendo en cuenta el marco de Windows. Sin embargo, todo lo que hace es agregar binarios para que el compilador tenga algunos lugares apropiados para asignar cuando los comandos de Windows solo se encuentran dentro de una configuración. Todo lo que hace es introducir las configuraciones binarias necesarias para que un programa se transfiera con éxito. Esto se vincula con la segunda opción.

  • En segundo lugar viene un compilador que admite crossCompilación de plataforma. 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 ¿de confianza? Probablemente no. En todo caso, solo está agregando más trabajo a su compilador ya que no solo tiene que mapear correctamente la sintaxis de un programa de computadora para una computadora, tiene que perder tiempo enlazando a los nuevos binarios. Además, necesitaría tener el compilador recuerde estos enlaces que podrían implicar más desperdicio espacio de memoria para tener este compilador.

Incluso entonces, sistemas como estos son pocos y lejanosy si está garantizado que funcione depende de qué tan bien el mantenedor de compiladores conozca sus cosas, con qué frecuencia lo actualizan, etc., etc. mi vida sigue

  • La tercera y quizás la solución más ideal es analizar tecnologías de contenedores como estibador. Sus contenedores son esencialmente formas para tipara construir su aplicación y portarla a nuevas máquinas sin tener que cambiar o modificar nada sobre cómo construirla y compilarla. Simplemente construya uno, guárdelo en un contenedor, transfiéralo a su máquina de elección e integrelo en su proyecto actual. Ahora que lo pienso, los sistemas de contenedores como Docker se crearon para evitar lo que está experimentando actualmente, donde tiene un código fuente trabajando en su única máquina, pero en ningún otro lugar. Algo así como Docker podrá ejecutar su código en cualquier máquina sin tener que volver a compilarlo para cada nueva máquina.

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

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ía la forma más ideal de manejar su proyecto.

// EDITAR //

Editaré esto para que sea una mejor respuesta una vez que no esté cansado.