2012-07-11 7 views
6

Esto es solo un segmento de un archivo MAKE. No entiendo muy bien lo que está pasando.Varios puntos y el mismo signo en el archivo MAKE (necesita explicación)

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) 
$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts 
    $(cc-command) 

Todo lo que entiendo es compilar estas líneas .cpp archivos en .o, después de 'imprimir-TPO', con 'CC-comando'. Pero no entiendo la semántica.

Si amplío la macro de 'OBJS', esta línea debería ser:

$(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) : $(OBJ)/%.o: $(SRC)/%.cpp | print-opts 
    $(cc-command) 

Para mí, parece que en '$ (MLRS:. $ (SRC) /% CPP = $ (OBJ) /%. o) ', afirma que todos los .cpp en $ (SRC) llegarían a .o en $ (OBJ), pero esto dependería de $ (OBJ) /%. o, que depende de $ (SRC) /% .cpp. Esto no tiene sentido ...

No entiendo cuál es el significado del signo igual aquí, y lo que significan dos puntos.

Respuesta

14

Supongamos que ha definido estas tres variables (y si no es así, la regla no va a funcionar muy bien):

SRC = source_dir 
OBJ = object_dir 
SRCS = source_dir/foo.cpp source_dir/bar.cpp 

Consideremos ahora la asignación

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) 

Este es a substitution reference; dice "para cualquier cosa en $(SRCS) que tenga el formato $(SRC)/%.cpp, cámbialo a $(OBJ)/%.o". Entonces OBJS evaluará a object_dir/foo.o object_dir/bar.o.

Ahora la regla:

$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts 
    $(cc-command) 

Thuis es un static pattern rule. Especifica una lista de objetivos ($(OBJS)), un patrón objetivo ($(OBJ)/%.o) y un patrón de requisitos previos ($(SRC)/%.cpp). Haga que las coincidencias sean un objetivo para el patrón de destino, y lo usa para construir el nombre de prerrequisito. Entonces, si Make usara esta regla para construir object_dir/foo.o, la raíz sería foo y el prerrequisito sería source_dir/foo.cpp.

(Usted no preguntó | print-opts, así que supongo que es ya claro.)

+0

Muchas gracias. Las referencias al manual gnu 'make' son muy útiles también. (Había revisado el manual anteriormente, pero no pude encontrar la información que necesitaba) – qinsoon

+0

Tad confundido por la referencia de sustitución. Entonces, si tengo 'main.c', lo insertará en el directorio de archivos del objeto y simplemente cambiará la extensión del archivo a' .o'. Esto conserva el contenido del archivo y simplemente cambia la extensión. Esto establece los nombres de todos los archivos de objeto con los que terminamos. Luego usamos la lista de nombres como un objetivo y compilamos los archivos de objetos, y sobrescribimos los archivos con el nuevo archivo objeto que acabamos de compilar. ¿Correcto? – Ungeheuer

+0

@Ungeheuer: No, la referencia de sustitución no hace nada en absoluto a los archivos, simplemente transforma las variables. Convierte "source_dir/main.cpp" en "object_dir/main.o"; esos son * nombres de archivo *, no * archivos *. Una vez que tenemos la cadena "dir_objeto/main.o", podemos pasarla a la regla de patrón, que sabe cómo construir un archivo de ese nombre. – Beta

Cuestiones relacionadas