2012-05-14 22 views
5

Me pregunto cómo debería gestionar un proyecto de C++ en crecimiento. Ahora, estoy desarrollando un proyecto con Netbeans y es un trabajo sucio generar archivos make. El proyecto se ha vuelto demasiado grande y he decidido dividirlo en algunas partes. Cual es la mejor manera de hacer esto?Cómo administrar el creciente proyecto de C++

Estoy tratando de usar Scons como mi sistema de compilación. He tenido cierto éxito con esto, pero ¿debo editar los scripts de compilación cada vez que agregue o elimine archivos? Es muy aburrido.

Así que necesito su consejo.

P.S. Por cierto, ¿cómo hace un gran proyecto como Google Chrome? ¿Todos usan algún tipo de IDE para construir scripts generados solo para distribución de software?

+0

En muchas empresas hay una posición dedicada llamada algo así como "Buildmeister". Es el trabajo de estas personas mantener el entorno de construcción e incluso pruebas unitarias. – Mikhail

+0

@Misha, esta responsabilidad muchas veces se denomina Configuration Manager. – Brady

+0

@Misha y ¿qué pasa con el flujo de trabajo? ¿Es una forma correcta de permitir que cada desarrollador escriba código en IDE preferido, y Buildmeister convertirá sus proyectos en una compilación? –

Respuesta

4

También uso Netbeans para C++ y compilo con SCons. Uso el plugin jVi Netbeans que realmente funciona bien.

Por alguna razón, el complemento Netbeans Python ya no es oficial, lo que no entiendo en absoluto. Sin embargo, todavía puede obtenerlo, y realmente hace que la edición de los scripts de compilación SCons sea una experiencia agradable. Aunque Netbeans no tiene un complemento SCons (¿todavía?), Aún puede configurar su comando de compilación para ejecutar SCons.

En cuanto a mantener las secuencias de comandos SCons automáticamente por el IDE, tampoco hago eso, lo hago a mano.Pero no es como si tuviera que lidiar con esto diariamente, así que no veo que sea tan importante, especialmente si se tiene en cuenta la facilidad de lectura de los guiones.

Aquí está la escritura de la estructura en SCons que hace lo mismo como se mencionó anteriormente para CMake:

env = Environment() 
env.EnsurePythonVersion(2, 5) 
env.EnsureSConsVersion(2, 1) 

libTarget = env.SharedLibrary(target = 'foo', source = ['a.cpp', 'b.cpp', 'c.pp']) 
env.Program(target = 'bar', source = ['bar.cpp', libTarget]) 

La función SCons Glob() es una buena opción, pero tienden a alejarse de automáticamente edificio todo los archivos en un directorio. Lo mismo ocurre con la lista de subdirectorios que se construirán. Me he quemado lo suficiente con esto, y prefiero especificar explícitamente el archivo/dirs a construir.

En caso de que escuche esos rumores de que SCons es más lento que otras alternativas, el SCons GoFastButton tiene algunos indicadores que pueden ayudar.

+0

Es triste, pero Netbeans realmente todavía no tiene soporte de SCons. Pero sr42 dio una buena idea para usar Glob(). Creo que eso es lo que realmente quiero. Por cierto, ¿por qué prefiere especificar explícitamente? –

+0

@AlexPovar, es menos común con los archivos fuente, pero con subdirectorios, a menudo tengo varias versiones de un directorio (subdirA y subdirA.old por ejemplo) y si ambos se compilan, entonces podría tener conflictos o comportamiento inesperado en el tiempo de ejecución que no es fácil de depurar, ya que supongo que solo compila ciertos directorios. Algo similar puede ocurrir con los archivos fuente. Además, al agregar nuevos archivos fuente, es un recordatorio de que deben agregarse al sistema de compilación *** y *** a la fuente de control. – Brady

+0

¿Utiliza el archivo MAKE intermedio para llamar a Scon de Netbeans? –

4

La mayoría de los proyectos grandes se adhieren a un sistema de compilación que maneja automáticamente todos los detalles desordenados. Soy un gran admirador de CMake (que es lo que KDE usa para todos sus componentes) pero scons es otra opción popular. Mi editor (KDevelop) supuestamente se encarga de los proyectos de CMake, pero aún edito los guiones de compilación porque no es tan difícil.

Recomiendo aprender una herramienta muy bien y seguir con ella (hay una gran cantidad de documentación disponible para cualquier herramienta que le interese). Asegúrate de mirar también el control de versiones si aún no lo has hecho (tengo un punto débil para git, pero Mercurial y Subversion también son opciones muy populares).


Un ejemplo sencillo CMake:

project("My Awesome Project" CXX) 
cmake_minimum_required(VERSION 2.8) 
add_library(foo SHARED a.cpp b.cpp c.cpp) #we'll build an so file 
add_executable(bar bar.cpp) 
target_link_libraries(bar foo) #link bar to foo 

Esto es obviamente un caso trivial, pero es muy fácil de manejar y ampliar según sea necesario.

+0

Sí, administrar guiones de construcción a mano no es difícil, pero es bastante simple olvidar agregar algo. En este momento hay dos sistemas de compilación en el proyecto. Los archivos Makefiles son nativos de Netbeans pero me resulta difícil administrarlos, y Scons es fácil de usar pero no tiene integración IDE. Por cierto, ¿los proyectos de KDevelop se basan en CMake? Y sí, uso mercurial como DCVS. –

+0

KDevelop también se crea utilizando CMake y puede mantener los archivos del proyecto por usted. Como dije, nunca he dejado que maneje el mío para mí, pero actualizaré mi respuesta con un simple ejemplo de CMake para que pueda ver lo fácil que es. –

+0

CMake está bien, su principal problema es su sintaxis (que siempre encontré no intuitiva). No se puede superar algo como SCons o Waf que usan Python, un verdadero lenguaje de programación. Debería ser igual de fácil (si no más fácil) mantener archivos SCons como en CMake. – Brady

2

Estoy tratando de usar Scons como sistema de compilación. Tengo cierto éxito con esto, pero debería editar las secuencias de comandos de compilación cada vez que agregue o elimine un archivo. Es muy aburrido.

Dependiendo de cómo están organizados sus archivos, puede utilizar, por ejemplo, la función de Scon Glob() para obtener archivos de origen como una lista sin tener que enumerar todos los archivos de forma individual. Por ejemplo, para construir todos los archivos de origen ++ c en un archivo ejecutable, que puede hacer:

Program('program', Glob('*.cpp')) 

Puede hacer lo mismo en CMake uso de sus comandos.

Y, si usa SCONS, dado que es Python, puede escribir código Python arbitrario para crear sus listas de archivos de origen.

También puede organizar archivos en varias carpetas y tener SCons subsidiarios (o CMakeList.txt) crear archivos que el script de compilación maestra puede llamar.

+0

Suena bien. Tengo una organización de proyectos al estilo Java con paquetes. Parece ser bastante bueno trabajar con directorios en lugar de fuentes. –

Cuestiones relacionadas