¿Qué tan importante es aprender makefiles? [cerrado]

12

Trabajo en c ++ principalmente como un pasatiempo (todavía estoy en la escuela y, por lo tanto, no tengo un trabajo real). Los IDEs generan el archivo MAKE para mí y me pregunto si vale la pena aprender cómo hacerlos yo mismo. Por "vale la pena aprender" quiero decir, ¿debería dejar todo y aprender a escribirlos antes de continuar aprendiendo c ++? ¿Aprenderlos será realmente necesario? Si es así, ¿debería aprender sobre ellos (sintaxis general y comprender cómo funcionan, etc.) o realmente aprender a escribirlos?

sinθ
fuente
1
La mayoría de los proyectos de código abierto hacen un uso intensivo de los makefiles de una forma u otra. Entonces, sí, debes aprender cómo funcionan los makefiles. Escribirlos por las manos es otra historia y debe ser evitado con preferencia a la generación de ellos por alguna herramienta, excepto que tiene muy pocos archivos o puede utilizar las reglas genéricas / implícitas y otras técnicas similares
permeakra
si desea que otros compilen su fuente en Linux y otros sistemas operativos basados ​​en Unix, debe aprenderlos.
Podrías aprender los conceptos básicos de makefiles, dependencias y sustituciones, etc., en menos tiempo que te llevará leer todas las respuestas a esta pregunta :)
JohnB

Respuestas:

14

Sí, definitivamente vale la pena entender cómo funcionan los Makefiles. Puede que no sea relevante para usted en este momento (porque está utilizando un IDE que los genera), pero lo más probable es que el conocimiento sea útil en el futuro.

Por "vale la pena aprender" quiero decir, ¿debería dejar todo y aprender a escribirlos antes de continuar aprendiendo c ++?

Francamente, esa es una noción extraña de "vale la pena aprender" ...

Pero no, no creo que necesites hacer eso.

¿Aprenderlos será realmente necesario?

No podemos predecir si realmente necesitará este conocimiento en el futuro. Depende de si continúa con la programación C ++ y en qué contexto lo hace.

Si es así, ¿debería aprender sobre ellos (sintaxis general y comprender cómo funcionan, etc.) o realmente aprender a escribirlos?

Recomiendo ambos. Si no puede escribir un Makefile, es discutible que sepa lo que está sucediendo.

Existe el otro punto de vista que dice que demasiado conocimiento no es útil.

Si profundiza en esto, aprenderá que hay muchas versiones diferentes de Make, y que escribir un Makefile complicado que funciona con múltiples versiones de Make en múltiples plataformas es ... difícil. Sin embargo, en el mundo del código abierto, es una "mejor práctica" utilizar herramientas como automake, autoconfetc., para generar los archivos MAKE, etc. Si lo hace, gran parte de la complejidad relacionada con la versión / plataforma se trata detrás de escena. .


Finalmente, etiquetó la pregunta con "java". Mi opinión es que no debe usar makepara crear aplicaciones Java (a menos que también esté creando bibliotecas de código nativo). Hay herramientas de compilación específicas de Java que son mucho más fáciles de usar ... y hacen un mejor trabajo que make.

Stephen C
fuente
8

Si está trabajando con código abierto o sistemas operativos tipo Unix, sí. Sin embargo, anímate, no son tan complicados. Aprender makele ahorrará mucho tiempo a largo plazo.

EhevuTov
fuente
¿Aprender a leer o aprender a escribir?
Ambos. Desea saber cómo leerlo para poder depurar problemas del software que usa o escribir para poder crear el suyo.
EhevuTov
Entonces tengo que estar en desacuerdo con la parte de escritura. Hay muchas otras formas, posiblemente mucho mejores, de automatizar las compilaciones. Escribir archivos make realmente útiles está lejos de ser trivial y no es necesario.
3

Los Makefiles son importantes en los sistemas UNIX (por ejemplo, AIX, Linux, OS X). Sin embargo, creo que su importancia absoluta "tienes que saberlo" ha disminuido en los últimos años. Por ejemplo, realmente no los encuentra en el desarrollo de Windows (Visual Studio, etc.) y XCode (en OS X) usa un sistema completamente diferente. No me gusta mucho Java, pero creo que usan archivos de hormigas y demás.

Hay un sistema muy bueno llamado CMake que genera archivos de compilación nativos para el sistema operativo en el que se está ejecutando. Por ejemplo, si escribe la especificación de su proyecto en CMake, puede crear un proyecto de compilación de Visual Studio en Windows, un proyecto XCode en Mac y un Makefile en Linux. En cierto modo, CMake reemplaza autoconf y automake.

Por lo general, creo archivos CMake para mis "grandes proyectos", pero sé Make en caso de que quiera escribir un Makefile rápido "solo hazlo". Es bueno para su alfabetización cultural, porque hay toneladas y toneladas de bibliotecas de software que usan Makefiles, y inevitablemente necesitará editar los compiladores específicos y las ubicaciones de las bibliotecas. Pero encontrará que los grandes proyectos (como KDE) están migrando hacia CMake y similares, ya que Make tiene algunas limitaciones que crían su fea cabeza cuando los proyectos se complican.

Eric Brown
fuente
Aprender CMake será órdenes de magnitud más beneficioso. Los Makefiles se pueden ver como un detalle de implementación: no se moleste en aprenderlos (hasta que se vea realmente obligado a hacerlo), al igual que los archivos de proyecto de Visual Studio.
2

Soy parcial ya que creo que los makefiles son un sistema terrible. Debería aprender la sintaxis general para poder modificar un archivo MAKE existente. Pero no creo que sea útil aprender todo al respecto ni hacer uno desde cero.


fuente
¿Te importaría explicar por qué los makefiles son un sistema terrible? ¿Comparado con que?
JonnyJD
@ JonnyJD: Una cosa es que no creo que un buen sistema de compilación deba hacer que coloque un archivo make en cada subdirectorio. Pero es malo porque no es mucho más fácil de usar que escribir un archivo bat que realmente dice algo.
Parece que no te gusta generar archivos de compilación a mano. Lo que en sí mismo no es gran cosa. Los Makefiles son una variante que debería ser posible leer y escribir manualmente. (modularizado, solo simplemente corrigió el seguimiento de dependencia en comparación con bash / bat) La parte automatizada es automake. Lo único que en realidad es muy diferente es especificar dependencias en una GUI y guardar todo esto en un archivo de proyecto. ¿O qué sistema de compilación es mucho menos terrible?
JonnyJD
2

Al igual que con muchos aspectos de la salida IDE, un archivo MAKE autogenerado típico a menudo está estructurado de manera ineficiente.

Con un nivel adecuado de comprensión, a menudo es posible mejorar significativamente el rendimiento (compilaciones más rápidas, etc.). Sin embargo, a menos que realmente sepa lo que está sucediendo, es más probable que FUBAR, cuando juegue con un archivo autogen-ed.

Recomiendo encarecidamente poder comprender lo que está sucediendo ... si posteriormente elige comenzar a editar uno existente o crear el suyo propio, es un tema diferente.

Andrés
fuente
2

Ser capaz de usar con éxito makeo algo así le permite marcar la casilla "entiende cómo modelar las dependencias entre partes de un programa compuesto por más de un módulo".

Blrfl
fuente
1

Aprender a escribir Makefiles es una buena idea por varias razones.

  1. Make es un lenguaje que le permite codificar dependencias entre componentes mediante reglas. Obtendrá mucha experiencia escribiendo código de esta manera, y amplía sus herramientas para pensar en resolver problemas de programación.
  2. Los principios que aprende con Make se pueden usar con Ant, Maven y Rake si elige aprender programación en el mundo Java o Ruby.
  3. Muchos IDE tienen archivos mágicos que llevan información de configuración para ayudarlo a construir su software. Si no me cree, intente escribir un script para construir su software sin el IDE. Cuando escribe sus propios Makefiles, se da cuenta de las dependencias entre su código, sus bibliotecas y sus variables de entorno. A medida que los sistemas se hacen más grandes, esto resulta ser una herramienta útil para depurar su sistema.
Jay Godse
fuente
0

Siempre debe intentar comprender el sistema de compilación que está utilizando.

Eso no significa necesariamente que deba poder crear todos los archivos de compilación a mano. La parte importante es comprender qué está haciendo el sistema de compilación para su proyecto y la capacidad general de compilar pequeños proyectos manualmente (como en "escribir comandos en una terminal").

Solo tiendo a pensar que crear Makefiles (simples) es el paso más fácil para comprender lo que está sucediendo, pero es posible que tenga otros medios para comprender cómo construir cosas.

Por qué / cuándo aprender Makefiles

Si sigue programando solo para Windows y no espera que nadie más compile su código, siéntase libre de compilar el código como desee.

Si desea programar el compilador agnóstico (como en "dejar que otros decidan qué compilador o IDE quieren usar"), entonces debe aprender otro sistema de compilación que simplemente dejar que su IDE "se encargue de ello".

Si desea programar para diferentes plataformas, entonces ciertamente necesita usar un sistema de compilación generalizado.

Eso todavía no significa que deba saber en detalle cómo funcionan los Makefiles autogenerados. Solo tiene que saber cómo funcionan los archivos de entrada para el sistema de compilación. Es posible que a veces tengan una sintaxis similar.


Personalmente, me gustan mucho los Makefiles y los uso para muchas cosas. No solo compilando código. Creo un Makefile para cada PDF más grande que creo (con LaTeX) y para cada proyecto en el que necesito automatizar un par de tareas (construcción, empaquetado, carga, actualización de dependencias desde repositorios de origen, copias de seguridad manuales de extracción / inserción)

Sin embargo, estoy trabajando mucho en el terminal y estoy trabajando con Linux. No uso lo que llamarías un IDE que no sea vim (potente editor de texto) y herramientas de consola. Esto podría ser muy diferente para ti.

Si alguna vez se quejó de tener que ejecutar diferentes comandos recurrentes solo para "actualizar" / paquete / cargar / ... un "proyecto", entonces aprender a escribir Makefiles podría ser algo útil para usted.

Si tiene y usa herramientas / GUI / IDEs para todo, entonces es posible que no obtenga nada de ese conocimiento.

JonnyJD
fuente