¿Cuáles son las ventajas de usar `make` para proyectos pequeños? [cerrado]

8

He visto que makees útil para proyectos grandes, especialmente con dependencias confusas descritas en a Makefile, y también ayuda con el flujo de trabajo. No he escuchado ninguna ventaja de usar makepara proyectos pequeños. ¿Hay alguna?

Goodwin Lu
fuente
2
optimismo para el crecimiento? :) ¿Buenos hábitos? Esto podría desviarse en territorio de opinión.
Jeff Schaller
escriba makepara descubrir la respuesta. crea una plantilla decente Makefile y simplemente edita la variable de sus archivos fuente. No es necesario escribir todo ese jazz.
user2497
son una especie de pesadilla para proyectos grandes, así que, sinceramente, diría que solo son buenos para proyectos pequeños;)
Eevee
Podría usar makefiles, pero no lo hago. He dividido mi código fuente para mi proyecto (personal) más grande en 10 archivos, vuelvo a compilar el primero, y el primero tiene #incluye los otros nueve. Con la velocidad de recompilación, no me importa si todo se vuelve a compilar cada vez.
Jennifer
1
La pereza :-) makees un comando mucho más rápido para escribir que la mayoría de los demás, incluso si no crea un Makefile inteligente para manejar las dependencias de manera limpia :-)
Stephen Harris

Respuestas:

11

¿A diferencia de qué?

Supongamos que tiene un programa que ha dividido en dos archivos, que ha llamado imaginativamente file1.cfile2.c. Puede compilar el programa ejecutando

cc file1.c file2.c -o yourprogram

Pero esto requiere recompilar ambos archivos cada vez, incluso si solo uno ha cambiado. Puede descomponer los pasos de compilación en

cc -c file1.c
cc -c file2.c
cc    file1.o file2.o -o yourprogram

y luego, cuando edite uno de los archivos, vuelva a compilar solo ese archivo (y realice el paso de vinculación sin importar lo que haya cambiado). Pero, ¿qué sucede si edita un archivo, y luego el otro, y olvida que editó ambos archivos y accidentalmente vuelve a compilar uno?

Además, incluso para solo dos archivos, tiene alrededor de 60 caracteres de comandos allí. Eso rápidamente se vuelve tedioso de escribir. OK, claro, puedes ponerlos en un script, pero luego vuelves a recompilar cada vez. O puede escribir un script realmente sofisticado y complicado que verifique qué archivo (s) se han modificado y solo haga las compilaciones necesarias. ¿Ves a dónde voy con esto?

G-Man dice 'restablecer a Mónica'
fuente
Para proyectos muy pequeños, gcc -O3 -march=native -fwhole-program *.c está básicamente bien para un ciclo de edición / compilación / perfil. Pero aún desea un Makefile para que otras personas lo usen. Ser capaz de usar -fwhole-programes una ventaja divertida de compilar todo junto, pero -fltonormalmente le da más o menos las mismas optimizaciones.
Peter Cordes
2
Una vez que empiezo a agregar modificadores a la línea de comandos del compilador (incluso para un archivo fuente), me resulta difícil recordarlos la próxima vez. Ocasionalmente, solo pondré un comentario en el archivo fuente, pero en ese momento debería usar un Makefile ...
Roger Lipscombe
@ger Lipscombe: Y si necesita compilar para diferentes entornos, es tan simple como definir algunas macros en su archivo MAKE. Y con un poco de creatividad, puede conectar el comando make a una tecla de función editior, capturar la salida en un archivo y usar otra tecla para
ubicarlo
15

Muchas otras personas están entrando en los detalles de los makefiles más complejos y mucha de la complejidad que conlleva. Normalmente uso makefiles por una razón completamente diferente:

No quiero recordar nada.

Incluso si tu proyecto es realmente aburrido y simple, y no usas makefiles "correctamente":

all:
    gcc main.c -o project

No necesito pensarlo o tratarlo de manera diferente a un proyecto que es más complejo:

all:
    gcc libA.c libB.c main.c -o project2

O si especifiqué banderas (por ejemplo -O2), no necesito recordar cuáles eran.

Además, si comienza con un archivo MAKE simple y necesita fusionar / refactorizar más tarde, no necesita recordar construir cada proyecto de manera diferente.

Stack Tracer
fuente
Yo uso makefiles incluso en proyectos no compilados. Creo reglas 'falsas' que ejecutan comandos complejos relevantes solo para el directorio involucrado. Por ejemplo: limpieza, instalación en ubicaciones correctas, instalación de imágenes acoplables. Simplemente lo hace más fácil.
anthony
5

Incluso con proyectos pequeños, puede ser útil mantener la lógica de dependencia bajo control y las compilaciones automatizadas. También lo usé para activar instalaciones y desinstalaciones, por lo que fue un interruptor principal que restableció el escenario.


fuente
3

Si vincula su aplicación desde 2 fuentes ( .carchivos), no necesita volver a compilar cada archivo, sino solo el modificado si está utilizando make.

Además, te daré un ejemplo del mundo BSD. Tienen marco de Makefiles basados ​​en el sistema. Le proporcionan rutas a los directorios del sistema y tienen objetivos para instalar su software y páginas de manual.

Por ejemplo, acabas de escribir la beer.caplicación y el manual llamado beer.6. Tu creas Makefile:

PROG=   beer
MAN=    beer.6

.include <bsd.prog.mk>

..y llamar make install. Compila e instala automáticamente su aplicación /usr/biny compila e instala su página de manual en el lugar donde manpuede encontrarla. ¡Acabas de instalar tu aplicación con un simple comando!

Muy conveniente y absolutamente transparente para cualquiera que esté familiarizado con BSD. Mucho mejor que el script manual.

usuario996142
fuente
1

Ejemplo Makefilepara mi proyecto muy pequeño:getPixelColor

Hace exactamente lo que dice su nombre, tomando dos argumentos opcionales, las coordenadas.

Me gusta especialmente la forma en que las cosas se vuelven dependientes allí.

COORDS ?= 0 0

CXX := g++-8
CXXFLAGS := -std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
LDLIBS := -lX11
RM := rm -f

BIN := getPixelColor
SRC := $(BIN).cpp

$(BIN): $(SRC)
    $(CXX) $(CXXFLAGS) $(SRC) -o $(BIN) $(LDLIBS)

.PHONY: clean
clean:
    $(RM) $(BIN)

.PHONY: run
run: $(BIN)
    ./$(BIN) $(COORDS)

Como puede ver, puede hacer todo lo que necesita, sin escribir nada adicional:


Uso

Puede ejecutarlo de esta manera:

  1. Limpiar el viejo binario:

    make clean
  2. Compila un nuevo binario:

    make
  3. Ejecute el ejecutable de 2 maneras:

    • las coordenadas predeterminadas [0,0]

      make run     # equals COORDS='0 0'
    • cualquier coordenada dada

      COORDS='5 6' make run

Los Makefiles pueden ser extremadamente útiles a veces. Cuanto más grande es el proyecto, mayor es el beneficio. Pero incluso con eso, mi proyecto C ++ más pequeño, como puede ver en los ejemplos, le ahorra muchos dolores de cabeza.

LinuxSecurityFreak
fuente
0

makeestá bastante confiablemente disponible. Si distribuye su proyecto con un makefile, los usuarios tendrán una referencia simple de cómo realizar tareas de la misma manera que usted. El makefilepuede ser para algo más que una compilación.

Tome un proyecto que no requiere compilación, por ejemplo. Recuerdo haber trabajado en un proyecto de Python que tenía un comando make para borrar todos los .pycarchivos, un comando make para ejecutar las pruebas, uno para descargar una copia de los datos estáticos del servidor de desarrollo, etc.

Adam Barnes
fuente