为什么我的make test
不工作?
我有这个简单的 makefile,运行时
# make test
make: 'test' is up to date.
从哪里来'test' is up to date.
!?
生成文件
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
如果test
将 makefile 中的命令更改为其他类似命令,wee
该命令还能正常工作吗?为什么?
# make wee
test
生成文件
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
从文件的最后一行可以看出,旁边
Makefile
有一个名为的文件。test
对于 make,规则指定目标输出文件,在您的情况下:
test
。您的test
规则也没有任何先决条件。因此,当你调用make 时
make test
,它会检查是否已经存在一个test
比其先决条件更新的文件(没有)。如果满足此条件,make 会很高兴地告诉你它不需要做任何工作。一旦你将规则的目标重命名为任何非现有文件,该规则就会徒劳地尝试创建文件
wee
。你的配方不会创建这样的文件,所以它总是会运行。正确的解决方案是将以下行添加到您的
Makefile
:引用make 的文档:
按请求运行您想要的操作。您需要做的是避免与文件冲突。
顺便说一句,同样的逻辑也适用于
run
你的 中的目标Makefile
。你的build
目标应该像下面这个未经测试的文件一样指定输出文件!为了清晰起见,我还省略了BINARY_HTTP
变量。请将此视为构建简洁、符合语法规范的 makefile 的下一步,而非最终结果。另请参阅Makefile 中的 .PHONY 的用途是什么?