Sé que ha habido varias preguntas con títulos similares, pero ninguna parece dar una respuesta a lo que necesito (corríjame si me equivoco).Compilar varios archivos fuente ** cambiados ** a la vez en GNU make
consideran este makefile:
SOURCES=file1.cpp file2.cpp file3.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=myprog
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CXX) -o [email protected] $(OBJECTS)
file1.o: file1.cpp file1.h
file2.o: file2.cpp file2.h file1.h
file3.o: file3.cpp
.cpp.o:
$(CXX) $(CXXFLAGS) -c -o [email protected] $<
Si cambio file1.h, se ejecuta el siguiente:
g++ -c -o file1.o file1.cpp
g++ -c -o file2.o file2.cpp
g++ -o myprog file1.o file2.o file3.o
Lo que me gustaría tener es:
g++ -c file1.cpp file2.cpp
g++ -o myprog file1.o file2.o file3.o
(Sé que no puedo especificar el directorio de salida de objetos con GCC, pero puedo vivir con esto, debería ser posible trabajar con algunos cd
comandos.)
En nmake, esto se hace con una regla de inferencia de dos puntos (llamado "batch-mode rule"). Básicamente, agrupa las reglas de inferencia (por ejemplo, ".obj.cpp:") para objetivos múltiples e invoca el compilador para todas las dependencias en lugar de una vez por archivo. La variable $<
obtiene la lista de dependencias en lugar de solo la primera.
Ahora mismo usamos la construcción en paralelo (make -j) pero tiene sus propios problemas, y el compilador de VC++ funciona mucho mejor en el modo de invocación única, así que preferiría usar eso.
¿por qué su objetivo 'all' depende de su' $ (SOURCES) '? No es necesario ya que '' $ (OBJECTS) 'ya depende de ellos, uno por uno. –
Es solo un ejemplo que encontré. En nuestros archivos makefiles (son bastante complejos) solo dependemos de los ejecutables finales. De cualquier manera, no es de lo que se trata la pregunta. –
El contenedor gcc va a invocar cc1, gas, etc. varias veces. La única invocación de programa que guardará es el envoltorio de gcc mismo. –