2009-12-01 13 views
6

Estoy en el medio de configurar un entorno de compilación para un proyecto de juego en C++. Nuestro principal requisito es la capacidad de construir no solo nuestro código de juego, sino también sus dependencias (Ogre3D, Cegui, boost, etc.). Además, nos gustaría poder construir tanto en Linux como en Windows, ya que nuestro equipo de desarrollo consiste en miembros que utilizan diferentes sistemas operativos.C++ Buildsystem con capacidad para compilar dependencias de antemano

Ogre3D usa CMake como herramienta de compilación. Es por eso que también hemos basado nuestro proyecto en CMake hasta ahora. Podemos compilar perfectamente bien una vez que todas las dependencias se configuran manualmente en cada sistema de miembros del equipo, ya que CMake puede encontrar las bibliotecas.

La pregunta es si existe una forma factible de configurar las dependencias de forma automática. Como desarrollador de Java, sé de Maven, pero ¿qué herramientas existen en el mundo de C++?


Actualización: Gracias por las respuestas agradables y enlaces. En los próximos días probaré algunas de las herramientas para ver qué cumple con nuestros requisitos, comenzando con CMake. De hecho, he tenido mi participación con autotools hasta el momento y por mucho que me gusta la documentación (el autobook es una lectura muy buena), me temo que las autotools no están destinadas a ser utilizadas en Windows de forma nativa.

Algunos de ustedes sugirieron que algunos IDE manejen la administración de dependencias. Consistimos en personas que utilizan todas las tecnologías posibles para codificar desde Vim puro hasta Eclipse CDT o Visual Studio completamente grabado. Aquí es donde CMake permite usar cierta flexibilidad con su capacidad para generar archivos de proyectos nativos.

Respuesta

7

En la última versión de CMake 2.8 existe el nuevo módulo ExternalProject. Esto permite descargar/verificar código, configurarlo y compilarlo como parte de su árbol de compilación principal. También debería permitir establecer dependencias.

En mi trabajo (grupo de procesamiento de imágenes médicas) usamos CMake para construir todas nuestras propias bibliotecas y aplicaciones. Tenemos una herramienta interna para rastrear todas las dependencias entre proyectos (definidas en una base de datos XML). La mayoría de las bibliotecas de terceros (como Boost, Qt, VTK, ITK, etc.) se crean una vez para cada sistema que admitimos (MSWin32, MSWin64, Linux32, etc.) y se envían como archivos zip en el sistema de control de versiones. CMake luego extraerá y configurará el archivo zip correcto según el sistema en el que esté trabajando el desarrollador.

+0

@pkit: esta es realmente una gran noticia. Me esforcé por construir mi propio sistema de compilación usando CMakeLists.txt recursivo con algunos scripts de Python agregados aquí y allá. Parece que ExternalProject_add() proporciona la funcionalidad suficiente fuera de la caja. Definitivamente voy a probarlo! – aeisele

1

En muchos sistemas * nix, se usa algún tipo de gestor de paquetes o sistema de compilación para esto. El más común para las fuentes es GNU Autotools, que según he oído es una fuente de aflicción extrema. Sin embargo, con algunas secuencias de comandos y un depósito en línea para sus deps puede configurar algo similar, así:

  • En su proyecto Makefile, crear un destino (opcionalmente con objetivos secundarios) que cubre sus dependencias.
  • Dentro del objetivo de cada dependencia, primera comprobación para ver si la fuente de dep está en el proyecto (en * nix puede utilizar touch para esto, pero podría ser más profundo)
  • Si el DEP no está allí, puede usar curl, etc. para descargar el dep
  • En todos los casos, haga que los destinos de Dep hagan una llamada recursiva (etc) al Makefile (u otro script de configuración/archivo de compilación) de la dependencia. Si el dep ya está construido e instalado, make devolverá con bastante prontitud.

No va a haber un montón de casos de esquina que hará que este se rompa sin embargo, dependiendo de los instaladores para cada dep (tal vez el instalador es interactivo?), Pero este enfoque debería cubrir la idea general.

2

Existen varias sustituciones de marcas interesantes que rastrean automáticamente dependencias implícitas (de archivos de encabezado), son multiplataforma y pueden manejar archivos generados (por ejemplo, definiciones de sombreado). Dos ejemplos con los que solía trabajar son SCons y Jam/BJam.

No conozco una forma multiplataforma de * hacer para rastrear automáticamente las dependencias. Lo mejor que puedes hacer es usar algún script que escanee los archivos fuente (o el compilador C++ lo haga) y encuentre #includes (la compilación condicional lo haga tramposo) y genere parte de makefile. Pero necesitarías llamar a este script cada vez que algo haya cambiado.

5

He estado usando GNU Autotools (Autoconf, Automake, Libtool) durante los últimos meses en varios proyectos en los que he participado y creo que funciona muy bien. A decir verdad, lleva un poco acostumbrarse a la sintaxis, pero la he utilizado con éxito en un proyecto que requiere la distribución de scripts de Python, bibliotecas C y una aplicación C++. Te daré algunos enlaces que me ayudaron cuando hice una pregunta similar aquí por primera vez.

Algunos enlaces más:

  1. http://www.lrde.epita.fr/~adl/autotools.html
  2. http://www.developingprogrammers.com/index.php/2006/01/05/autotools-tutorial/
  3. http://sources.redhat.com/autobook/

una cosa que no estoy seguro es de cualquier tipo de envoltorio de Windows para Autotools GNU. Sé que puede usarlo dentro de Cygwin, pero en cuanto a la distribución real de archivos y dependencias en plataformas Windows, probablemente sea mejor utilizar un instalador MSI de Windows (o algo que pueda empaquetar su proyecto dentro de Visual Studio).

Si desea distribuir dependencias, puede configurarlas en un subdirectorio diferente, por ejemplo, libzip, con una entrada específica Makefile.am que construirá esa biblioteca. Cuando realice un make install la biblioteca se instalará en la carpeta lib que el script de configuración determinó que debería usar.

¡Buena suerte!

+0

Me pregunto si el Eclipse CDT (u otro IDE) maneja el aspecto multiplataforma. –

+0

Creo que su mejor opción para la implementación de Windows es usar las herramientas nativas de Visual Studio, crear una solución de proyecto, crear un paquete de instalación de MSI y colocar estos archivos dentro de un directorio de proyecto separado dentro de la carpeta. –

+2

Realmente siento que todos ustedes están perdiendo la pregunta (o lo estoy haciendo). El título pregunta sobre la configuración de dependencias para la construcción. No se trata de implementar binarios, usar autotools para compilar ni nada de eso. Específicamente dice "Podemos compilar perfectamente bien una vez que todas las dependencias se configuren manualmente en cada sistema de miembros del equipo, ya que CMake puede encontrar las bibliotecas". –

2

La pregunta es si existe una forma factible de configurar las dependencias de forma automática.

¿Qué significa set up?

Como dijiste, CMake compilará todo una vez que las dependencias estén en las máquinas. ¿Estás buscando una forma de empaquetar la fuente de dependencia? Una vez que toda la fuente está allí, CMake y una herramienta de compilación (gcc, nmake, MSVS, etc.) es todo lo que necesita.

Editar: Nota al margen, CMake tiene el comando de archivo que puede ser utilizado para descargar archivos si son necesarios: file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log])

Edición 2: CPack es otra herramienta por los chicos CRealice que pueden ser utilizados para empaquetar los archivos y tal para la distribución en varias plataformas. Puede crear archivos NSIS para Windows y .deb o .tgz para * nix.

+0

NSIS es un sistema de instalación que puede construir instaladores de Windows en plataformas que no sean de Windows. Sin embargo, no puede construir instaladores para sistemas que no sean de Windows. – jamessan

+0

@jamessan: Ah, claro, mi error. Agregué otra edición para CPack, que es de lo que quería hablar. –

+0

Gracias por señalar el comando de archivo de CMake. La documentación en línea de CMake parece dejar mucho que desear. – aeisele

2

En mi lugar de trabajo (construimos sistemas integrados para la protección de energía) usamos CMake para resolver el problema. Nuestra configuración permite que cmake se ejecute desde varias ubicaciones.

/ 
CMakeLists.txt "install precompiled dependencies and build project" 
    project/ 
     CMakeLists.txt "build the project managing dependencies of subsystems" 
     subsystem1/ 
     CMakeLists.txt "build subsystem 1 assume dependecies are already met" 
     subsystem2/ 
     CMakeLists.txt "build subsystem 2 assume dependecies are already met" 

El truco es asegurarse de que cada archivo CMakeLists.txt se puede llamar de manera aislada sino que el archivo de nivel superior todavía puede construir todo correctamente. Técnicamente, no necesitamos los archivos sub CMakeLists.txt, pero hace felices a los desarrolladores. Sería un dolor absoluto si todos tuviéramos que editar un archivo de compilación monolítico en la raíz del proyecto.

No configuré el sistema (ayudé, pero no es mi bebé). El autor dijo que el sistema de construcción de cmake de refuerzo contenía algunas cosas realmente buenas, que lo ayudaron a que todo se desarrollara sin problemas.

+0

Siempre pensé que boost aún usaba su propia herramienta de compilación "BJam", pero si cambiaban a CMake, como sugiere tu respuesta, entonces también veré su solución, ¡gracias! Los Makefiles recursivos en subcarpetas individuales parecen ser el camino a seguir, ya sea CMake, Autotools u otra cosa. Gracias por la sugerencia. – aeisele

+0

@itti, boost ha estado considerando un sistema de compilación CMake. Uno de los desarrolladores de impulso está manteniendo una compilación de CMake actualizada, es posible que deba descargarla para que funcione completamente. –

+0

@itti, solo sugeriría archivos CMake recursivos de algunos niveles. Definitivamente hace las cosas más difíciles de entender si sigues el antiguo enfoque de autotools con un archivo de compilación en cada carpeta. –

0

En este momento estoy trabajando en una herramienta capaz de instalar automáticamente las dependencias de una aplicación C/C++ con la versión exacta requisito:

  • compilador
  • libs
  • herramientas (cmake, autotools)

Ahora funciona, para mi aplicación. (Instalación unittest ++, Boost, en peso, SQLite, cmake todo en el orden correcto)

La herramienta, llamada «C++ Manager Versión» (inspirado por el excelente administrador de versiones de rubí), se codifica en bash y alojado en GitHub: https://github.com/Offirmo/cvm

Se agradecen todos los consejos y sugerencias.

Cuestiones relacionadas