【发布时间】:2015-07-21 18:37:12
【问题描述】:
我正在使用 GNU make 来处理一些数据。当我尝试使用变量名运行目标时,make 将运行该目标,无论目标文件是否已经存在。考虑以下Makefile:
include config.mk
.PHONY : all
all : $(PG_DB).db
$(PG_DB).db :
createdb $(PG_DB) -U $(PG_USER)
touch $@
config.mk 包含的位置:
MAKEFLAGS += --warn-undefined-variables
SHELL := bash
.SHELLFLAGS := -eu -o pipefail
.DEFAULT_GOAL := all
.DELETE_ON_ERROR:
.SUFFIXES:
PG_USER="foo"
PG_DB="foo"
当我运行make 时,make 创建 Postgres 数据库,然后触及文件foo.db。但是,当我再次运行make 时,输出为:
createdb "foo" -U foo
createdb: database creation failed: ERROR: database "foo" already exists
make : *** ["foo".db] Error 1
这不应该发生!我希望make 在这种情况下检查假目标all 的先决条件,看到foo.db 已经存在,然后立即退出而不做任何事情。
奇怪的是,这正是我去掉目标名称中的变量时发生的情况:
include config.mk
.PHONY : all
all : foo.db
foo.db :
createdb $(PG_DB) -U $(PG_USER)
touch $@
当我使用修改后的Makefile 运行make 时,我得到:
make: Nothing to be done for `all`.
这正是我所期望的。
这是怎么回事?
【问题讨论】:
-
在变量失败案例中包含运行
make -rRd的输出?还有这是什么版本的make? 4.0? 4.1?