¿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)
...
Alexey Romanov
fuente

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í.

Didier Trosset
fuente
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.

jamesc
fuente
-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í

Piyush Sonigra
fuente
Este fue mi problema. ¡Gracias!
Aidan Rosswood
1

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

ThorSummoner
fuente