Pregunta

Estoy en el medio de la creación de un entorno de construcción para un proyecto de juego C ++. Nuestro principal requisito es la capacidad de construir no sólo nuestro código del juego, sino también sus dependencias (Ogre3D, CEGUI, impulso, etc.). Además nos gustaría ser capaces de construcción en Linux, así como en Windows como nuestro equipo de desarrollo está formado por miembros usando diferentes sistemas operativos.

CMake como su herramienta de construcción. Es por esto que hemos basado nuestro proyecto en CMake demasiado hasta el momento. Podemos compilar perfectamente bien una vez que todas las dependencias están configuradas manualmente en cada sistema de los miembros del equipo como CMake es capaz de encontrar las librerías.

La pregunta es si hay una forma viable de obtener las dependencias configuran automáticamente. Como desarrollador de Java que 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 estaré probando algunas de las herramientas para ver lo que cumple con nuestros requisitos, comenzando con CMake. de hecho he tenido mi parte con autotools hasta ahora y por mucho que me gusta la documentación (el autobook es una muy buena lectura), temo autotools no están destinados a ser utilizados en Windows de forma nativa.

Algunos de ustedes sugirió dejar que algunos IDE manejar la gestión de la dependencia. Nos constan de personas que utilizan todas las tecnologías posibles para codificar desde pura Vim a soplado totalmente Eclipse CDT o Visual Studio. Aquí es donde CMake permite utilizar una cierta flexibilidad con su capacidad de generar archivos de proyecto nativos.

¿Fue útil?

Solución

En la versión más reciente CMake 2.8 se encuentra la nueva ExternalProject módulo. Esto permite descargar el código / salida, configurar y construir como parte de su árbol principal de construcción. También debe permitir establecer dependencias.

En mi trabajo (grupo de procesamiento de imágenes médicas) utilizamos CMake para construir todas nuestras propias bibliotecas y aplicaciones. Tenemos una herramienta interna para rastrear todas las dependencias entre proyectos (definidos en una base de datos XML). La mayoría de las bibliotecas de terceros (como Boost, Qt, VTK, ITK etc ..) están construidas una vez para cada sistema apoyamos (mswin32, MSWin64, linux32 etc ..) y comprometidos como archivos zip en el sistema de control de versiones. CMake A continuación, extraer y configurar el archivo zip correcto dependiendo del sistema que el desarrollador está trabajando.

Otros consejos

He estado usando GNU Autotools (Autoconf, Automake, Libtool) durante el último par de meses en varios proyectos que he estado involucrado en y creo que funciona muy bien. La verdad es que lo hace tomar un poco acostumbrarse a la sintaxis, pero lo he utilizado con éxito en un proyecto que requiere la distribución de los scripts de Python, bibliotecas de C, y una aplicación de C ++. Te voy a dar algunos enlaces que me ayudaron cuando me hice una pregunta similar aquí.

Algunas más enlaces:

  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 usted es capaz de utilizarlo en el interior de Cygwin, pero en cuanto a realidad la distribución de archivos y dependencias en las plataformas de Windows que está probablemente mejor usar un instalador MSI de Windows (o algo que se puede empaquetar su proyecto dentro de Visual Studio).

Si quiere distribuir dependencias que puede ponerlos en marcha bajo un subdirectorio diferente, por ejemplo, LibZIP , con una entrada de Makefile.am específico que va a construir la biblioteca. Al realizar una make install la biblioteca se instalará en el lib carpeta que el script de configuración determina que debe utilizar.

Buena suerte!

Hay varias sustituciones maquillaje interesantes que hacen un seguimiento de forma automática dependencias implícitas (de los archivos de cabecera), son multiplataforma y puede hacer frente a los archivos generados (por ejemplo definiciones de sombreado). Dos ejemplos que solía trabajar con son SCons y Jam / bjam .

No sé de una manera multiplataforma de conseguir * hacer un seguimiento automático de las dependencias. Lo mejor que puede hacer es utilizar una secuencia de comandos que se analizan los archivos de origen (o tiene compilador de C ++ hacer eso) y encuentra #includes (compilación condicional hace que este complicado) y genera parte del makefile. Pero será necesario llamar a este script cada vez que algo podría haber cambiado.

  

La pregunta es si hay una forma viable de obtener las dependencias configuran automáticamente.

¿Qué quiere decir configura?

Como usted ha dicho, CMake compilará todo una vez que las dependencias están en las máquinas. Simplemente estás buscando una manera de empaquetar la fuente de la dependencia? Una vez que toda la fuente está ahí, CMake y una herramienta de construcció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 se pueden utilizar para empaquetar de seguridad de archivos y tales para su distribución en varias plataformas. Se puede crear NSIS para Windows y archivos .deb o .tgz para * nix.

En mi lugar de trabajo (construimos sistemas integrados de protección de energía) se utilizó CMake para resolver el problema. Nuestra configuración permite cmake a ejecutar desde diversos lugares.

/
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 la sub CMakeLists.txt archivos pero hace feliz a los desarrolladores. Sería un dolor absoluta si todos tuvimos que editar un fichero de construcción monolítica en la raíz del proyecto.

Yo no se estableció el sistema (ayudé pero no es mi bebé). El autor dijo que el sistema de impulso cmake acumulación tenía algunas cosas realmente buenas en él, que ayudan a conseguir todo el edificio cosa suavemente.

En muchos sistemas * nix, algún tipo de gestor de paquetes o construir el sistema se utiliza para esto. El más común para la materia de origen es GNU Autotools, lo que he oído es una fuente de dolor extremo. 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 objetivo (opcionalmente con submetas) 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 utilizar curl, etc para descargar el dep
  • En todos los casos, tienen los objetivos dep hacer una llamada recursiva maquillaje (make; make install; make clean; etc) para el Makefile (u otro archivo de script de configuración / build) de la dependencia. Si el dep ya está construido e instalado, que volverá bastante rápidamente.

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.

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

  • compilador
  • libs
  • herramientas (cmake, autotools)

En este momento funciona, para mi aplicación. (Instalación unittest ++, Boost, Wt, 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

Cualquier consejos y sugerencias son bienvenidas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top