¿Por qué hace pensar que el objetivo está actualizado?


224

Este es mi Makefile:

REBAR=./rebar
REBAR_COMPILE=$(REBAR) get-deps compile

all: compile

compile:
    $(REBAR_COMPILE)

test:
    $(REBAR_COMPILE) skip_deps=true eunit

clean:
    -rm -rf deps ebin priv doc/*

docs:
    $(REBAR_COMPILE) doc

ifeq ($(wildcard dialyzer/sqlite3.plt),)
static:
    $(REBAR_COMPILE) build_plt analyze
else
static:
    $(REBAR_COMPILE) analyze
endif

Puedo correr make compilevarias veces y obtener

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ make compile
./rebar get-deps compile
==> erlang-sqlite (get-deps)
==> erlang-sqlite (compile)

Sin embargo, por alguna razón correr make testsiempre da

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ make test
make: `test' is up to date.

incluso si los archivos no están compilados. La pregunta es, ¿por qué?

Ejecutar el mismo comando funciona directamente:

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ ./rebar get-deps compile skip_deps=true eunit
==> erlang-sqlite (get-deps)
==> erlang-sqlite (compile)
Compiled src/sqlite3_lib.erl
Compiled src/sqlite3.erl
==> erlang-sqlite (eunit)
...

Respuestas:


460

Quizás tenga un archivo / directorio nombrado testen el directorio. Si este directorio existe y no tiene dependencias que sean más recientes, entonces este destino no se reconstruye.

Para forzar la reconstrucción en este tipo de objetivos no relacionados con archivos, debe hacerlos falsos de la siguiente manera:

.PHONY: all test clean

Tenga en cuenta que puede declarar todos sus objetivos falsos allí.


2
Tenía un directorio llamado build y otro llamado lib. En retrospectiva, estos no son nombres de destino perfectos. Ugh ..... hacer.
MattD

99
* Dónde all, testy clearestán los nombres de destino de tu makefile
ThorSummoner

Otra solución es cambiar la etiqueta. En su caso, cambie testpor test_ruleo algo diferente.
auraham

@MattD yo también, ¿es un problema para hacer?
gromit190

@Birger si tiene objetivos que desea invocar como "make build" y "make lib" y tiene esos directorios presentes, entonces deberá utilizar esta estrategia o una similar.
MattD

34

EDITAR: Esto solo se aplica a algunas versiones de make- debe verificar su página de manual.

También puedes pasarle la -Bbandera make. Según la página del manual, esto hace:

-B, --always-make Hacer incondicionalmente todos los objetivos.

Por make -B testlo tanto , resolvería su problema si se encontrara en una situación en la que no desea editar Makefileo cambiar el nombre de su carpeta de prueba.


-Bes un modo compatible con versiones anteriores para mí ... (FreeBSD, OS / GNU toolkit no parece estar especificado en cuestión)
Gert van den Berg

Oh interesante ... ¿ --always-makeFunciona para ti?
jamesc

No Sin .PHONYembargo, el objetivo parece algo portátil ... (Al menos para FreeBSD, no estoy seguro de cosas como Solaris)
Gert van den Berg

1
Esto desafía el propósito de hacer: determinar automáticamente qué partes de un programa deben reconstruirse después de un cambio. Si su archivo MAKE necesita la --always-makeopción para funcionar, su archivo MAKE está roto.
osvein

1
@GertvandenBerg .PHONY será parte del número 8 del estándar POSIX austingroupbugs.net/view.php?id=523
osvein

10

Ocurre cuando tiene un archivo con el mismo nombre que el nombre de destino de Makefile en el directorio donde está presente el Makefile.

ingrese la descripción de la imagen aquí


Este fue mi problema. ¡Gracias!
Aidan Rosswood

1

mi error fue hacer que el nombre de destino "filename.c:" en lugar de simplemente "filename:"

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.