Make me parece simplemente un script de shell con un manejo un poco más fácil de los argumentos de la línea de comandos.
¿Por qué es estándar ejecutar make en lugar de ./make.sh
Make me parece simplemente un script de shell con un manejo un poco más fácil de los argumentos de la línea de comandos.
¿Por qué es estándar ejecutar make en lugar de ./make.sh
Respuestas:
La idea general es que make
admite (razonablemente) reconstrucciones mínimas, es decir, usted le dice qué partes de su programa dependen de qué otras partes. Cuando actualiza alguna parte del programa, solo reconstruye las partes que dependen de eso. Si bien podría hacer esto con un script de shell, sería mucho más trabajo (verificar explícitamente las fechas de última modificación en todos los archivos, etc.) La única alternativa obvia con un script de shell es reconstruir todo cada vez. Para proyectos pequeños, este es un enfoque perfectamente razonable, pero para un proyecto grande, una reconstrucción completa podría tomar fácilmente una hora o más; si lo usa make
, puede lograr lo mismo en un minuto o dos ...
Probablemente también debería agregar que hay bastantes alternativas para hacer que tienen capacidades al menos ampliamente similares. Especialmente en los casos en que solo se están reconstruyendo unos pocos archivos en un proyecto grande, algunos de ellos (por ejemplo, Ninja ) a menudo son considerablemente más rápidos que los de creación.
Hay varias cosas que hacen que sean difíciles de hacer con los scripts de shell ...
Make garantiza que solo los archivos necesarios se vuelvan a compilar cuando realice cambios en sus archivos fuente.
Por ejemplo:
final : 1.o 2.o
gcc -o final 1.o 2.o
1.o : 1.c 2.h
gcc -c 1.c
2.o : 2.c 2.h
gcc -c 2.c
Si solo cambio el archivo 2.h
y lo ejecuto make
, ejecuta los 3 comandos, en orden inverso.
Si solo cambio el archivo 1.c
y lo ejecuto make
, solo ejecuta los primeros 2 comandos en orden inverso.
Intentar lograr eso con su propio script de shell implicará muchas if/else
comprobaciones.
rsync -r -c -I $SOURCE $DEST_DIR
en shell.
Además de lo anterior, Make es un lenguaje de programación paralelo declarativo (-ish).
Digamos que tiene 4.000 archivos gráficos para convertir y 4 CPU. Intente escribir un script de shell de 10 líneas (estoy siendo generoso aquí) que lo hará de manera confiable mientras satura sus CPU.
Quizás la verdadera pregunta es por qué la gente se molesta en escribir scripts de shell.
make maneja las dependencias: el archivo MAKE las describe: el binario depende de los archivos de objetos, cada archivo de objetos depende de un archivo de origen y encabezados ... cuando se ejecuta make, se compara la fecha de los archivos para determinar qué se necesita volver a compilar .
Uno puede invocar directamente un objetivo para no construir todo lo descrito en el Makefile.
Además, la sintaxis de make proporciona sustitución, vpath
Todo esto se puede escribir en scripts de shell, haciendo que ya lo tenga.