Cómo depender de los objetivos de una invocación previa de make

Tengo una lib (digamos mylib) y dos ejecutables y uno de estos (digamos exe1) depende de lib. En el sistema de archivos tengo:

src
   Makefile
   ...
   lib
     mylib
       Makefile
       ...
   exe1
     Makefile
     ...
   exe2
     Makefile
     ...

y al lanzar make in src dir todo está construido.

Makefile en origen:

EXE=exe1 exe2
LIB=mylib

all: $(LIB) $(EXE)

.PHONY: $(LIB) $(EXE)

$(LIB):
    $(MAKE) -C lib/$@

$(EXE): $(LIB)
    $(MAKE) -C $@

y, por ejemplo, Makefile por exe1 es:

...
all: exe1 copy

exe1: exe1.o
    $(CC) $(CFLAGS) $(OBJ) $(LDFLAGS) -o $@

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@
...

Mi problema es que si cambio un archivo en mylib dir la biblioteca está correctamente reconstruida pero exe1 obviamente no... hay alguna forma de saberlo make que exe1 target depende de un objetivo (mylib) que se especifica en una invocación previa de make sin especificar dependencias en mylibarchivos de en exe1 Makefile?

Gracias a todos.

preguntado el 28 de agosto de 12 a las 10:08

No creo que haya una manera sensata de hacer esto con Makefiles separados. Si tuviera un solo Makefile para todo su proyecto, esto debería ser simple. -

El comentario de ripleee probablemente no sea la respuesta que quieres escuchar, pero es verdad. Busque un documento llamado "Recursive Make Considered Harmful". Ambos normales Makefiles y automake Makefile.am ambos pueden expresar sistemas de compilación no recursivos. -

1 Respuestas

@tripleee y @JackKelly (maldito sea su nombre) tienen razón, este no es un sistema de archivos MAKE saludable.

Puedes obtener algo como lo que quieres cambiando src/Makefile:

EXE=exe1 exe2
LIB=lib/mylib/mylib

all: $(LIB) $(EXE)

.PHONY: $(EXE)

$(LIB):
    $(MAKE) -C lib/mylib

exe1: $(LIB)

$(EXE):
    $(MAKE) -C $@

y cambiando exe1/makefile para que así sea siempre reconstruir exe1:

.PHONY: exe1

Esto todavía tiene muchos problemas, pero al menos se reconstruirá correctamente. lib/mylib/mylib y src/exe1/exe1 cuando ejecutas Make in src. (Va a no funciona si ejecuta Make in src/exe1/.)

Respondido 29 ago 12, 04:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.