¿Cómo puedo usar un servidor de compilación con Keil uVision4 (MDK-ARM), escribir una compilación, usar un archivo MAKE?

Me gustaría ejecutar compilaciones diarias o registrar/comprometer compilaciones desencadenadas de proyectos basados ​​en Keil MDK-ARM. Hasta ahora he conseguido que las cosas funcionen con la función de archivo por lotes del IDE. Esto requiere que cree el proyecto al menos una vez con el IDE, luego registre el archivo por lotes y los archivos asociados .__iy ._iacreados por el IDE.

Además, el IDE incluye muchas cosas específicas del usuario en el archivo por lotes, como la variable PATH de Windows. Esto podría convertirse en un problema con múltiples desarrolladores, porque el archivo por lotes para la construcción podría cambiarse en cada confirmación de un desarrollador diferente.

En última instancia, uno solo necesita realizar un seguimiento de los diversos interruptores para armcc , armasm y ArmLink .

¿Hay alguna manera de usar un archivo MAKE más estándar para crear proyectos de Keil uVision? ¿Existe algún método para traducir un archivo de proyecto de uVision en un script de compilación más fácil de mantener?

Creo que es genial que estés implementando un servidor de compilación. Desafortunadamente, no tengo experiencia con el sistema de desarrollo de Keil, así que no puedo ayudarte. Me gustaría animarte a que publiques una solución si cuando la hayas resuelto.
Construyo proyectos de Keil a través de secuencias de comandos por lotes sin ninguna dependencia de PATH (aparte de las propias herramientas de Keil) o archivos __i / _ia. ¿Puedes compartir más información sobre esto?
@digikata Estoy usando la opción desde el IDE para generar un archivo por lotes. Esto se describe en la documentación de Keil. También hay un método basado en la línea de comandos que se describe aquí , pero tuve dificultades para obtener la salida de consola adecuada de ese comando. El segundo método inicia un nuevo proceso y le brinda la opción de copiar la ventana de salida en un archivo de salida; no es un buen método para un servidor de compilación.
Para referencia futura, el alcance de esta pregunta se encuentra en un área de superposición que compartimos con otros sitios de Stack Exchange. ¡Las preguntas sobre cadenas de herramientas específicas integradas como Keil son definitivamente bienvenidas aquí! También son bienvenidos en Stack Overflow , pero no dude en preguntar en cualquier lugar.
@KevinVermeer: ​​sí, estaba a punto de decir lo mismo. rmaVT, puede encontrar que navegar por las preguntas etiquetadas como "keil" en SO es tan educativo como las preguntas etiquetadas como "keil" en EE SE .

Respuestas (2)

Este es el mejor método que se me ocurrió recientemente:

En las opciones de compilación, seleccione crear archivo por lotes.

Cuando inicia una compilación desde el IDE, se crea un archivo por lotes junto con varios archivos de texto en función de las opciones establecidas en el IDE. Debe realizar un seguimiento de estos archivos generados por IDE en el control de código fuente:

  • *.murciélago
  • *.ini
  • *.__i
  • *._I a
  • *.lnp
  • *.sct

Luego, foo.bat se puede iniciar desde un script de compilación.

Si bien esto crea archivos adicionales que deben rastrearse en el control de fuente si desea compilar de manera confiable a partir del archivo por lotes generado, elimina la necesidad de confiar en el archivo del proyecto Keil (foo.uvproj) y el IDE. Me resulta más fácil comparar las diferencias y, por lo tanto, realizar un seguimiento de los cambios en los archivos de texto generados (*.__i) que contienen indicadores del compilador que en el archivo .uvproj. Además, el archivo por lotes llama a las diversas herramientas, armasm, armcc, armlink, directamente. Esto le brinda el resultado directo de cada uno de esos pasos, así como un potencial aparentemente mejor para migrar un proyecto a una cadena de herramientas diferente en el futuro, si es necesario.

Me doy cuenta de que esta respuesta se parece mucho a mi pregunta original, pero realmente no conozco una mejor manera de ejecutar una compilación con secuencias de comandos con las herramientas de Keil. Pedí ver qué podía surgir de los demás. No estoy completamente en desacuerdo con la respuesta de @digikata, pero prefiero tener las banderas del compilador y el mapa de memoria en un formato más fácil para rastrear y usar más herramientas de estilo Unix para la compilación en lugar de lanzar una compilación todo en uno. con el IDE. Creo que la compilación todo en uno del IDE funciona bien en mi estación de trabajo, pero no para el servidor de compilación.

EDITAR : El servidor de compilación se ejecuta en Windows Server 2003. Debo confesar que he cedido a usar la interfaz de línea de comandos IDE en lugar de un archivo por lotes. Esto se volvió demasiado difícil de manejar.

Una pregunta sobre este trabajo: ¿qué sistema operativo está ejecutando su servidor de compilación? ¿Linux, Windows 7, Windows Server 2003, Windows Server 2008?
¡Gracias por contestar la pregunta! Parece que la cadena de herramientas arm funciona en Windows Server 2003 y 2008 R2 según la documentación de Keil . Una pregunta de seguimiento con respecto a su edición: ¿Cómo maneja los cambios en el archivo uvproj (por ejemplo, agregar nuevos archivos al proyecto para la compilación)? ¿Tiene que cambiar manualmente las opciones de compilación en un archivo promovido al servidor de compilación?
Tienes que poner el archivo .uvproj bajo control de código fuente. Esto funciona bastante bien, aunque algunas preferencias de usuario todavía se dejan en el archivo a pesar del archivo .userxxxxx que también se genera. El servidor de compilación solo necesita abrir el mismo "proyecto" y compilarlo.

Llamo al Keil IDE a través de la línea de comandos para compilar (no un archivo por lotes generado) desde dentro de un Makefile. Por lo general, funciona mejor bloquear los archivos del proyecto a través del scm, o tomar una copia de compilación de referencia y cambiar el nombre de los proyectos relevantes al hacer esto.

El IDE está perfectamente feliz de trabajar con archivos de proyecto de solo lectura, por lo que si los bloquea, lo irritante es que necesita desbloquearlos para cambiar la configuración, guardarlos y volver a registrarlos. punto en el proyecto esto es bastante menor, incluso deseable.

Si toma una copia de referencia, la compilación tiende a romperse a medida que cambia la configuración del proyecto, especialmente cuando se agregan o eliminan archivos del proyecto de la compilación. Capturar explícitamente esos cambios no es necesariamente malo, pero es un paso adicional necesario para mantener las compilaciones.

De cualquier manera, redirigir la salida a un archivo de registro a través de la opción "-o" le permite acceder al registro de salida completo. El registro no sale una línea a la vez, pero parece que todo está allí. (De hecho, analicé el formato de error de Keil a GNU fmt para la integración con el entorno Eclipse CDT. Esto me permite saltar directamente a los errores/advertencias después de la compilación)

La compilación de la línea de comandos también genera los archivos __i, __ia, por lo que tampoco es necesario que pasen al control de versiones para el servidor de compilación.

Espero que esto ayude.