tutorial make makefile wildcard gnu-make target

tutorial - makefile ubuntu



Método apropiado para objetivos comodín en GNU Make (1)

Tu primer ejemplo está casi allí:

SRC = $(wildcard src/*.cpp) OBJ = $(patsubst src/%.cpp, obj/%.o, $(SRC)) prog: $(OBJ) $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) $(OBJ) -o prog obj/%.o: src/%.cpp $(CC) $(CFLAGS) -c $< -o $@

Estoy tratando de escribir un Makefile con mis archivos fuente y objeto separados y parece que no puedo encontrar la manera correcta de lograr esto. Tengo dos métodos que funcionan, pero espero que alguien pueda señalar la forma "correcta" de hacerlo.

Mi proyecto está separado en una carpeta src y obj con el Makefile al mismo nivel que estos.

El primer método utiliza la función de comodín para encontrar los archivos de origen en src luego usa el reemplazo de texto para determinar los archivos de objeto correspondientes.

SRC = $(wildcard src/*.cpp) OBJ = $(SRC:.cpp=.o) prog: $(OBJ) $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o prog $(patsubst src/,obj/,$(OBJ)) %.o: %.cpp $(CC) $(CFLAGS) -c $< -o $(COMPILE)/$(@F)

Esto parece funcionar, sin embargo, cada vez que ejecuto make prog , compila todos los archivos de objetos. La variable OBJ tiene que tener el src/ delante de todos los objetos o, de lo contrario, obtendré "no hay regla para hacer objetivo". En el lado positivo, puedo usar fácilmente el comando patsubst en el objetivo del programa para especificar los archivos de objeto.

El segundo método es similar pero usa vpaths y reemplazo de texto en la variable OBJ :

vpath = %.cpp src vpath = %.o obj SRC = $(wildcard src/*.cpp) OBJ = $(subst src/,,$(SRC:.cpp=.o)) POBJ = $(patsubst src/,obj/$(SRC:.cpp=.o)) prog: $(OBJ) $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o prog $(POBJ) %.o: %.cpp $(CC) $(CFLAGS) -c $< -o $(COMPILE)/$(@F)

Esto elimina la recompilación de archivos de objetos, pero me obliga a agregar otra variable POJB para el objetivo del programa (ya que no puedo hacer ninguna patsubst solo en los archivos de objetos sin un basedir).

Ambos métodos funcionan y cada uno tiene sus ventajas sobre el otro, pero ¿cuál es el enfoque "correcto" y, de no ser así, cuál es la forma correcta de lograr este tipo de edificio?