Por que meu make test
não está funcionando?
Eu tenho esse makefile simples e ao executar
# make test
make: 'test' is up to date.
De onde vem 'test' is up to date.
!?
makefile
BINARY_HTTP=http
build:
@go build -o bin/${BINARY_HTTP} cmd/${BINARY_HTTP}/main.go
run: build
ifdef skip-user
@./bin/${BINARY_HTTP}/main -skip-user
else
@./bin/${BINARY_HTTP}/main
endif
test:
@echo "test"
@go test -count=1 ./test
Se o test
comando no makefile for alterado para algo parecido, wee
o comando funciona? Por quê?
# make wee
test
makefile
BINARY_HTTP=http
build:
@go build -o bin/${BINARY_HTTP} cmd/${BINARY_HTTP}/main.go
run: build
ifdef skip-user
@./bin/${BINARY_HTTP}/main -skip-user
else
@./bin/${BINARY_HTTP}/main
endif
wee:
@echo "test"
@go test -count=1 ./test
Como evidenciado pela última linha do seu
Makefile
, você tem um arquivo chamadotest
ao lado dele.Para make, uma regra especifica um arquivo de saída de destino , no seu caso:
test
. Suatest
regra também não tem nenhum pré-requisito .Então, o que acontecerá quando você chamar
make test
o comando make é que ele verificará se já existe um arquivo chamadotest
que seja mais recente que os pré-requisitos (não há nenhum). Essa condição será satisfeita e o comando make informará com satisfação que não precisa realizar nenhum trabalho.Ao renomear o destino da sua regra para algo que não seja um arquivo existente, a regra será executada em uma tentativa inútil de criar um arquivo
wee
. Sua receita não cria esse arquivo, então isso sempre será executado.A solução correta é adicionar a seguinte linha ao seu
Makefile
:Citando o documento do make :
Executar sob demanda é o que você quer fazer. Evitar conflitos com um arquivo é o que você precisa fazer.
A propósito, a mesma lógica se aplica ao
run
destino no seuMakefile
arquivo . E o seubuild
destino deve especificar o arquivo de saída como no arquivo não testado a seguir! Também omiti aBINARY_HTTP
variável para maior clareza. Por favor, veja isso como um possível próximo passo em direção a um makefile limpo e idiomático, não como o resultado final.Veja também Qual é a finalidade de .PHONY em um Makefile?