¿Usar directamente Make se considera obsoleto? [cerrado]

31

Así que me he encontrado con muchos comentarios / publicaciones / etc. con respecto a la creación de makefiles directamente, y cómo es algo tonto hacer en 2015. Conozco herramientas como CMake, y en realidad uso CMake con bastante frecuencia. La cuestión es que CMake solo está creando el Makefile para usted y ayudando a eliminar el tedio de hacerlo usted mismo. Por supuesto, agrega muchas otras características excelentes ... pero al final sigue siendo un Makefile.

Entonces, mi pregunta es, ¿la charla 'obsoleta' sobre make hace referencia a toda la utilidad Make, o simplemente la idea de escribir manualmente sus propios Makefiles? No utilizo un IDE para el desarrollo de C / C ++ (solo emacs), por lo que siempre he escrito Makefiles.

Si Make se considera obsoleto, ¿qué debe usar un desarrollador de C / C ++ para construir proyectos pequeños y personales?

JParrilla
fuente
8
Para pequeños proyectos personales, un makesin Makefile es suficiente. ¿Cuál es la molestia?
ott--
8
Cada pieza de software disponible en mis sistemas FreeBSD, tanto de escritorio como de servidores, tiene un Makefile que comienza con 'make'. No. 'make' no es obsoleto.
Rob
3
Las personas son libres de usar IDE, pero si sus IDE no pueden apoyar proyectos que usan Makefiles casi 40 años después de que makese escribió por primera vez, entonces no deberían esperar que la gente evite eso.
Miles Rout
1
La "charla obsoleta sobre la marca" es solo un síntoma o un punto de dolor , no una proclamación de desaprobación. Especialmente cuando todavía no existe un reemplazo total superior, y todos los enfoques para reducir el dolor aún se usan de alguna manera, simplemente ocultos para los usuarios que son más propensos al dolor. Aunque se han dado muchas buenas respuestas, la pregunta en sí está basada en una opinión límite.
rwong
1
CMakeEs una capa de abstracción. Esta abstracción es necesaria para domar la variedad salvaje de productos IDE para consumidores que no cumplen con el código abierto Makefile. Nuevamente, no es solo abstracción, sino que permite características de configuración (como autoconf). Al igual que otras abstracciones, permite alternativas . Pero allana el camino de una nueva idea experimental de alternativas de Makefile fácilmente disponibles para los usuarios de CMake.
shuva

Respuestas:

30

La gran diferencia es que CMake es un sistema de metaconstrucción multiplataforma . Un solo proyecto CMake puede producir el archivo MAKE Unix / Linux habitual, un proyecto de Visual Studio para Windows, un proyecto XCode para Mac y casi cualquier otro sistema que no sea de metacompilación que desee utilizar o admitir.

No diría que usar make directamente o incluso editar manualmente makefiles es "obsoleto", pero esas son cosas que probablemente no deberías hacer a menos que estés trabajando en cosas de Unix / Linux que no necesitarán portarse a Windows, al igual que tú no debería editar los archivos de proyecto de Visual Studio directamente si alguna vez desea portarlos a Windows. Si tiene algún interés en la portabilidad, vale la pena aprender un sistema de metaconstrucción como Scons o CMake.

Ixrec
fuente
99
POSIX maketambién es multiplataforma.
Blrfl
66
@Blrfl esto puede ser cierto, pero generalmente encontrará las líneas de comando que necesita usar para compilar y / o vincular su proyecto son específicas de la plataforma, incluso si todas las plataformas a las que apunta son compatibles con POSIX e incluso si usted está utilizando el mismo compilador en todos (todavía habrá problemas molestos con las ubicaciones de los archivos de inclusión, si es necesario -lm, -lnsletc. o si esas instalaciones están incluidas en la biblioteca de C, etc.).
Jules
55
@Jules Hay mucho más (o menos) que CMake, básicamente está diseñado para la creación de su aplicación modular estándar para sistemas con cargadores ELF, y proporciona abstracciones para todas las herramientas necesarias para esa cadena de herramientas específica. Si se aleja de esa cadena de herramientas (p. Ej., Script de enlazador personalizado para metal desnudo), de CMakerepente no proporciona soporte o portabilidad, termina hackeándolo tal como solía hackear scripts de compilación totalmente personalizados.
Ext3h
Lo mismo ocurre con Q make (a pesar de no ser el comportamiento inconsistente mal documentado ** ap CMake is), por cierto;)
mlvljr
11

¿Está makerealmente desactualizado?

No lo creo. Al final, make sigue siendo lo suficientemente potente como para proporcionar toda la funcionalidad deseada, como la compilación condicional de fuentes modificadas y similares. Decir que makeestaba desactualizado, sería lo mismo que decir que escribir scripts de enlazado personalizados estaba desactualizado.

Pero lo que raw makeno proporciona son funcionalidades extendidas y bibliotecas de valores para mayor comodidad, como la generación de encabezado paramétrico, el marco de prueba integrado o incluso solo bibliotecas condicionales en general.

Por otro lado, CMakeestá directamente diseñado para generar bibliotecas ELF genéricas y ejecutables. Cada vez que se aleja de estos procedimientos predefinidos, debe comenzar a hackear CMakecomo solía hackear sus propios Makefiles.

Teniendo en cuenta que puede crear mucho más en C ++ que solo su aplicación promedio para un sistema que conoce cargadores ELF, CMakeseguramente no es adecuado para todos los escenarios. Sin embargo, si está trabajando en un entorno tan estandarizado, CMakeo cualquiera de estos marcos de generador de scripts modernos, sin duda son sus mejores amigos.

Siempre depende de qué tan especializada sea su aplicación y qué tan bien la estructura del CMakemarco se ajuste a su flujo de trabajo.

Ext3h
fuente
Si bien es útil, make es un sistema horrible con braindead, sintaxis arcana y toneladas de limitaciones innecesarias que generan muchos momentos extravagantes.
antred
7

Érase una vez que los idiomas de alto nivel eran solo una idea. La gente trató de implementar compiladores. En aquel entonces había limitaciones severas de hardware: no había herramientas gráficas, por lo que el "texto sin formato" terminó siendo utilizado para el formato del archivo de entrada; las computadoras generalmente tenían una cantidad extremadamente pequeña de RAM, por lo que el código fuente tenía que dividirse en pedazos y el compilador se dividía en utilidades separadas (preprocesador, compilador, ensamblador, enlazador); Las CPU eran lentas y caras, por lo que no podía hacer optimizaciones costosas, etc.

Por supuesto, con muchos archivos de origen y muchas utilidades que se utilizan para crear muchos archivos de objetos, es un desastre construir cualquier cosa manualmente. Como solución para los defectos de diseño en las herramientas (causados ​​por hardware muy limitado), las personas comenzaron a escribir scripts para eliminar parte de la molestia.

Lamentablemente, los guiones eran incómodos y desordenados. Para solucionar los problemas con los scripts (que eran una solución para los defectos de diseño en las herramientas causados ​​por un hardware limitado), finalmente, las personas inventaron utilidades para facilitar las cosas, por ejemplo make.

Sin embargo; Los makefiles son incómodos y desordenados. Para solucionar los problemas con los archivos MAKE (que eran una solución alternativa para las fallas de diseño en las herramientas causadas por un hardware limitado) la gente comenzó a experimentar con archivos MAKE generados automáticamente; comenzando con cosas como hacer que el compilador genere dependencias; y que conduce a herramientas como auto-conf y cmake.

Aquí es donde estamos ahora: soluciones alternativas para una solución alternativa para las fallas de diseño en las herramientas causadas por un hardware limitado.

Tengo la expectativa de que para fines de siglo habrá algunas capas más de "soluciones alternativas para soluciones alternativas" en la parte superior de la pila existente. Irónicamente, las severas limitaciones de hardware que causaron todo esto desaparecieron hace muchas décadas y la única razón por la que todavía estamos usando un desastre tan arcaico ahora es " así es como siempre se ha hecho ".

Brendan
fuente
1
Entonces, ¿cuál es la alternativa? ¿La alternativa está cambiando totalmente el concepto de compilación tal como la conocemos?
JParrilla
1
@Darkslash: una vez que empiezas a considerar alternativas (hipotéticas), es como abrir compuertas: terminas cuestionando todo (y terminas con ideas como la separación de la semántica y la sintaxis, y el rediseño de IDE y herramientas y entrega como un conjunto en lugar de piezas individuales de la rompecabezas más grande). Más práctico es darse cuenta de que las herramientas como cmakesolo tratan los síntomas y no pueden curar la / s causa / s raíz; lo que hace que sea más fácil aceptar el hecho de que no tiene otra opción que usar herramientas que probablemente nunca estarán cerca del "ideal".
Brendan
55
Los Makefiles no son de ninguna manera "incómodos y desordenados". Son increíblemente elegantes: makees en esencia un motor para atravesar un gráfico de dependencia acíclico. Nada sobre 'scripts' o la línea de comando es 'arcaico'.
Miles Rout
1
@MilesRout: La parte incómoda y desordenada es la construcción del gráfico. El recorrido es lo suficientemente elegante. Pero solo tome el ejemplo más común de la parte desordenada: los archivos de encabezado C. Cada uno #includees un borde, pero makeno puede analizar archivos C. Todavía no es un problema, porque makepodría almacenar estos bordes con el siguiente nodo (el archivo * .o), pero tampoco lo hace.
MSalters
3
No estoy de acuerdo con que sea posible un mejor diseño. makeno es solo para compilar C! Desea un programa que toma .cy .harchiva y da Makefiles. Pero eso no es make, y eso no es lo que makedebería hacer. Nuevamente, makeno todo se trata de C, y una solución específica de C incorporada makees una mala idea (y, por cierto, una violación de la filosofía UNIX).
Miles Rout
5

make (la herramienta o el uso directo de la misma a través de un Makefile) no está desactualizada, particularmente para "proyectos pequeños y personales" como los usa.

Por supuesto, también puede usarlo para proyectos más grandes, incluidos los destinados a múltiples plataformas. Con variables específicas de destino, puede personalizar fácilmente la forma en que construye para diferentes plataformas. Hoy en día, las distribuciones de Linux vienen con cadenas de herramientas de compilación cruzada (por ejemplo, mingw-w64 ) para que pueda construir un paquete completo de software de Windows (con el instalador si lo desea) desde Linux, todo impulsado desde su Makefile.

Las herramientas como cmake y qmake pueden ser útiles, pero no están exentas de problemas. Por lo general, están bien para crear una aplicación en sí misma junto con cualquier biblioteca (aunque siempre tuve problemas con qmake para hacer una verificación de dependencia adecuada entre las bibliotecas y los programas que las usan), pero siempre lucho con las restricciones de esas herramientas al hacer el resto del trabajo (crear instaladores, generar / instalar documentación o archivos de traducción, hacer cosas inusuales como convertir un archivo en una biblioteca compartida, etc.). Todo esto se puede hacer make, aunque cosas como el seguimiento de dependencias pueden requerir un poco de esfuerzo.

IDEs como Qt Creator y Eclipse también pueden importar proyectos basados ​​en Makefile, para que pueda compartirlos con desarrolladores que usan IDE. Creo que Qt Creator IDE es excelente como IDE de C ++, pero después de pasar algún tiempo para ser más efectivo con Emacs, y dado que estoy haciendo más desarrollo de Ada, me encuentro prefiriendo Emacs para todo. Para volver a la pregunta sobre make, como un paso posterior al enlace en mi Makefile, actualizo mi archivo TAGS (para la navegación de símbolos en Emacs), cargado con M-x visit-tags-table:

find $(SRC_DIR) $(TEST_DIR) -regex ".*\.[ch]\(pp\)?" -print | etags -

O para el desarrollo de Ada:

find $(SRC_DIR) $(TEST_DIR) -name "*.ad?" -print | etags -
Patricio
fuente
2

Esta respuesta complementa la respuesta @lxrec.

Los Makefiles se pueden usar para muchas cosas, no solo para crear un programa / biblioteca a partir del código fuente. Los sistemas de compilación como CMake o autotools están diseñados para tomar código y compilarlo de manera que se ajuste a la plataforma del usuario (es decir, encontrar bibliotecas o especificar las opciones de compilación correctas). Podría, por ejemplo, tener un archivo MAKE que ayude a automatizar algunas tareas de lanzamiento, como: construir un archivo zip que contenga código con la versión derivada de git; ejecutar pruebas contra su código; cargar dicho archivo zip a algún servicio de alojamiento. Algunos sistemas de compilación (como el automake) pueden proporcionar una manera fácil de hacer esto, otros no.

Eso no quiere decir que necesite usar makefiles para esto, podría usar un lenguaje de scripting (shell, python, etc.) para tales tareas.

James Tocknell
fuente
1

No creo que los escritos humanos Makefilesean obsoletos, especialmente cuando:

  1. usando POSIX make, que te da un portátil Makefile
  2. o usando GNU make 4, que le brinda muchas características muy interesantes, en particular la capacidad de escritura de GUILE, que permite codificar eficientemente las características sofisticadas proporcionadas por los Makefilegeneradores (creo que las características de autotools o Cmake podrían escribirse fácilmente mediante la personalización Guile de GNU make ) Por supuesto, el precio a pagar es requerir que GNU haga 4 (no es gran cosa, en mi humilde opinión).
Basile Starynkevitch
fuente
0

Los Makefiles no son obsoletos, de la misma manera que los archivos de texto no son obsoletos. Almacenar todos los datos en texto sin formato no siempre es la forma correcta de hacer las cosas, pero si todo lo que desea es una Lista de tareas, entonces un archivo de texto sin formato está bien. Para algo más complicado, es posible que desee un formato más complicado como Markdown o XML o un formato binario personalizado o algo intermedio, pero para casos simples, el texto sin formato funciona bien.

Del mismo modo, si todo lo que desea es una forma de evitar escribir g++ -g src/*.c -o blah -W -Wall -Werror && ./blahtodo el tiempo, ¡un Makefile escrito a mano es perfecto!

Si desea construir algo que sea altamente portátil, donde no tenga que administrar esa portabilidad usted mismo, probablemente quiera algo como Autotools para generar el Makefile adecuado para usted. Autotools detectará las funciones compatibles con varias plataformas. Un programa escrito en el estándar C89 construido con Autotools se compilará prácticamente en todas partes.

Miles Rout
fuente
"se compilará prácticamente en todas partes" -> "se compilará en los sistemas tipo Unix más recientes". No creo que autotoolsfuncione en ningún grado relevante en un sistema Windows, por ejemplo (descontando Cygwin / MingW, que es realmente un sistema similar a Unix sobre Windows).
sleske
No tiene nada que ver con ser reciente. La ventaja de las herramientas automáticas es que funciona en todos los sistemas remotamente similares a POSIX. Windows es algo compatible con POSIX.
Miles Rout
Sí, estoy corregido. En realidad, recuerdo que una crítica de las herramientas automáticas es precisamente que contiene código incluso para sistemas muy antiguos, así que descarte el "reciente". Sin embargo, todavía mantengo la parte de Windows.
sleske
Y la culpa de eso recae completamente en Microsoft. Si se preocuparan por producir un producto de calidad, Windows tendría el soporte adecuado para los estándares internacionales de sistemas operativos (como POSIX). POSIX no es solo una "cosa de Unix", es el estándar del sistema operativo portátil para todos los sistemas operativos. Windows es solo un montón de basura no compatible.
Miles Rout
@MilesRout todavía la conclusión es que "prácticamente en todas partes" excluye el 90% de las computadoras de escritorio .
el.pescado
-2

Si su proyecto es simple y contiene muy pocos archivos, no se necesita ningún archivo de creación.

Sin embargo, cuando el proyecto es complejo, usa numerosas áreas de memoria, tiene muchos archivos, entonces es necesario colocar cada área de memoria en el lugar correcto de la memoria direccionable, es altamente deseable no volver a compilar cada archivo cada vez que se produce un cambio trivial hecho a un archivo,

Si desea borrar archivos antiguos / compilar / vincular / instalar con la mínima cantidad de problemas y posibilidades de errores al presionar las teclas, el archivo MAKE es una verdadera bendición.

Cuando ingresa al 'mundo real', los proyectos rara vez son solo 1 o 2 archivos, sino cientos de archivos. un archivo MAKE siempre realizará las acciones correctas y no acciones innecesarias (después de que se depure), por lo que solo debe escribir un comando simple y el archivo MAKE hace todo el trabajo

usuario3629249
fuente
1
Que no respondieron a por qué prefieren makemás cmakeo viceversa.
Ext3h
El uso de makefiles no reconstruye todos los archivos cada vez. (de lo contrario, CMake o Auto-tools no podrían usarlo)
ideasman42