2008-09-15 14 views
56

He estado utilizando make y makefiles durante muchos años, y aunque el concepto es sólido, la implementación tiene algo que desear.¿Alternativas prometedoras para hacer?

¿Alguien ha encontrado alguna buena alternativa para hacer que no complique demasiado el problema ?

+0

¿La respuesta no dependerá en gran medida de cuál es el problema? Para las cosas que he tratado de hacer con él, 'make' es demasiado simplista. – reinierpost

+0

Ruby Rake, CoffeeScript Cake, Python Scons, Java Ant/Maven, C# MSBuild, multiplataforma CMake – Pred

Respuesta

23

echa un vistazo a SCons. Por ejemplo, Doom 3 y Blender hacen uso de él.

+0

+1 para scons: conceptualmente lo suficientemente similar para hacer que sea fácil entender pero arregla algunas de las cosas peor rotas sobre make (como el manejo de espacios en los nombres). – Tom

+0

SCons es solo Python 2, y después de perder el tiempo en tring use SCons para compilar una versión de Python 3 de un proyecto escrito en Python y C++, aconsejaría a las personas que se mantuvieran alejadas. Simplemente use CMake, se está convirtiendo en estándar para C++ en este momento. O si desea usar un sistema de compilación basado en Python, use [Meson] (http://mesonbuild.com/). Funciona rápido y se está desarrollando activamente, lo que no se puede decir de SCons. – ostrokach

10

Recomiendo usar Rake. Es la herramienta más fácil que he encontrado.

Otras buenas herramientas que he utilizado, sin embargo, si Ruby no es su cosa, son:

  • AAP (Python)
  • SCons (Python)
  • Ant (Java, de configuración en XML, bastante complejo)
3

Depende de lo que estás tratando de hacer. Si todos que desea son dependencias de destino de estilo y invocación de comando, entonces Make es en realidad una de las mejores herramientas para la tarea. :-) Rake es muy agradable, pero puede ser torpe en algunos casos simples. Ant es, por supuesto, una ciudad de verbosidad, pero tiene un mejor soporte para la construcción de lenguajes similares a Java (incluidos Scala y Groovy). Además, Ant está disponible en todas partes. Esa es la razón principal por la que lo uso. Debido a que funciona de manera consistente en Windows, en realidad es incluso más multiplataforma que Make.

Si desea la administración de dependencias para bibliotecas de tipo Java, Maven es la opción canónica, pero personalmente me gusta Buildr mucho mejor. Es más rápido y mucho más fácil de personalizar (está basado en Rake). Desafortunadamente, todavía no es tan ubicuo como Maven.

25

Tengo un montón de amigos que juran por CMake para el desarrollo multiplataforma:

http://www.cmake.org/

Es el sistema de construcción utilizado para VTK (entre otras cosas), que es una biblioteca de C++ con cruzada plataforma Python, Tcl y enlaces de Java. Creo que es probablemente la cosa menos complicada que encontrarás con tantas capacidades.

Siempre puedes probar el estándar autotools. Los archivos de Automake son bastante fáciles de armar si solo se ejecuta en Unix y si se apega a C/C++. La integración es más complicada, y las autotools están lejos del sistema más simple que haya existido.

+6

Tenga en cuenta que CMake solo genera archivos make. Entonces, si el problema con la implementación de GNU Make es que no puede hacer lo que usted desea, entonces CMake probablemente no lo ayude. O autotools, para el caso. – Tom

+6

CMake no solo genera archivos make. CMake puede generar toneladas de diferentes tipos de archivos de compilación destinados a toneladas de diferentes compiladores y plataformas. Personalmente, odio CMake porque la sintaxis de configuración es absolutamente repugnante. – Taywee

15

Algunos de los proyectos de GNOME han estado migrando al waf.

Se basa en Python, como Scons, pero también es independiente, por lo que en lugar de requerir que otros desarrolladores tengan instalada su herramienta de compilación favorita, solo copie la secuencia de comandos de compilación independiente en su proyecto.

-1

No estoy seguro de si hace la pregunta correcta aquí.

¿Estás buscando una marca simplificada? En ese caso, debe conseguir que alguien que esté muy familiarizado con make cree una serie de archivos (M | m) que simplifiquen su problema.

¿O desea ver la tecnología subyacente? ¿Deseamos hacer cumplir una arquitectura de tipo de diseño por contrato que está incorporada en el diseño del código y se aplica en él? O posiblemente, el idioma en sí, p. Ada y su concepto de especificaciones (interfaces) y cuerpos (implementaciones)?

¿Qué dirección seguirás definitivamente afectará los resultados potenciales de tal pregunta?

Básicamente, nuevas formas de construir sistemas a partir de solo aquellos componentes que realmente han cambiado en comparación con la adopción de nuevas tecnologías que tienen tales mecanismos incorporados en el diseño.

Disculpe, no es una respuesta directa. Solo quería intentar que evalúes qué camino deseas seguir.

aplausos,

Rob

+0

Una respuesta simple a una pregunta compleja no es posible. Brindar más enfoque en la pregunta ayudaría. –

1

todavía prefieren hacer después de haber considerado un manojo de las alternativas. Cuando usted genera dependencias automáticamente a través del compilador o algo así como fastdep, no queda mucho por hacer. En particular, no quiero que mi script de compilación esté vinculado al lenguaje de implementación, y no me gusta escribir cosas en XML cuando hay disponibles más alternativas legibles. Sin embargo, una herramienta que expone un lenguaje de propósito general tiene mérito, pero otro lenguaje interpretado no lo hace (afaik). What is Wrong with Make? podría apelar a su punto de vista acerca de alejarse de make.

/Allan

+0

También prefiero hacer; es un estándar pantanoso, disponible en todas partes, y hay una posibilidad razonable de que alguien nuevo en el proyecto lo haya usado antes (o al menos una mejor oportunidad que cualquier otra cosa). Pero. Tengo una gran base de código (varios miles de archivos fuente C++) escrita para Visual C++ y que estoy tratando de construir bajo GCC en Linux. Hacer parecía la opción más obvia para una herramienta de compilación, y hemos escrito un convertidor rápido y sucio que analiza archivos vcxproj y produce Makefiles. Todo fue genial, hasta que lo probamos en un proyecto con un espacio en el nombre. ¿Que se supone que hagamos? – Tom

+0

Para el registro, he terminado con SCons. Como nuestro convertidor se escribió en Python de todos modos, fue bastante fácil convertirlo a SCONScript. – Tom

10

doit es una herramienta pitón. Está basado en los conceptos de herramientas de compilación pero más genérico.

  • puede definir cómo una tarea/regla es hasta a la fecha de
  • dependencias se pueden calcular de forma dinámica por otras tareas
  • acciones
  • de tarea se puede (no sólo la comprobación marcas de tiempo, los archivos no son necesarios objetivo) Las funciones de python o comandos shell
+0

gracias esta respuesta, doit parece una herramienta increíble – Bedros

0

FlowTracer de RTDA es otra buena opción que he visto utilizado comercialmente en un entorno de gran escala (decenas de miles de puestos de trabajo): http://www.rtda.com/flowtracer-design-flow-infrastructure-software

Tiene una GUI que muestra el gráfico de dependencia con cuadros codificados por colores para trabajos y óvalos para archivos. Cuando la cantidad de trabajos y archivos aumenta, una herramienta basada en GUI como FlowTracer es bastante esencial.

El costo de instalación inicial es más alto que Make. Hay una curva de aprendizaje para configurar tu primer flujo utilizándolo. Después de eso, se vuelve más rápido.

4

Tenga en cuenta la herramienta de compilación ninja (v1.8.2 de septiembre de 2017) que está influenciado por tup y redo.

El generador de archivo de generación cmake (por ejemplo, para Unix Makefile, Visual Studio, Eclipse CDT, XCode, ...) también pueden generar ninja construir archivos desde la versión 2.8.8 (abril de 2012) y, que yo sepa, es ahora aún ninja la herramienta de compilación predeterminada utilizada por cmake.

Se supone que supera a la herramienta make (mejor seguimiento de la dependencia y también está paralelizado).

cmake es una herramienta ya bien establecida. Siempre puede elegir más adelante la herramienta de compilación sin modificar sus archivos de configuración. Por lo tanto, si se desarrolla una compilación mejor en el futuro, que será compatible con cmake, puede cambiarla convenientemente.

Tenga en cuenta que para C/C++ mejorar el tiempo de compilación se limita a veces a causa de las cabeceras incluido a través del preprocesador (en particular, cuando se utiliza librerías sólo de encabezado, por ejemplo boost & eigen) que se espera será sustituida por la propuesta de modules (en una revisión técnica de C++ 11 o eventualmente en C++ 1y). Consulte este presentation para obtener detalles sobre este tema.

+3

Notablemente 'tup' depende de' fusible' y tiene la extensión del núcleo fusible en ejecución, que en lo que a mí respecta sugiere que los mantenedores están locos. 'rehacer' no se ha actualizado en dos años. Yo recomendaría 'ninja'. – mxcl

4

Escribí una herramienta llamada sake que trataba de hacer que escribir cosas parecidas a archivos parecidos fuera muy fácil de leer y escribir.

+0

Interesante; pero, ¿podría darnos un poco de información sobre por qué cree que el sake es más fácil de "leer y escribir"?No deberíamos tener que instalar el proyecto para ver si responde la pregunta. –

+0

¡Claro! Me pareció que parte de la razón por la que al autor de la pregunta original le preocupaba que la implementación de Make "complicara demasiado el problema" se debía a la sintaxis oscura de los makefiles. Sake usa archivos que están escritos en YAML y, por lo que he podido deducir de los comentarios de otras personas, es mucho más fácil de leer y escribir. – tonyfischetti

+0

El hecho de que use la sintaxis YAML debería ser parte de la respuesta, quizás con cierta elaboración sobre cómo YAML contrasta con la sintaxis 'make'. –