这是我运行的命令
make -d -f dump.makefile
我得到的错误:
Reading makefile `dump.makefile'...
dump.makefile:31: *** commands commence before first target. Stop.
ifneq (,)
This makefile requires GNU Make.
endif
# force use of Bash
SHELL := /bin/bash
# function
today=$(shell date '+%Y-%m:%b-%d')
update-latest=$(shell ln -nf {$(call today),latest}.cfdict-"$(1)".localhot.sql)
# variables
credentials="$$HOME/.my.cfdict.cnf"
default: data-only structure-only csv-only all
data-only: what=data
argList=( --defaults-file="${credentials}" --no-create-db --no-create-info ) \
mysqldump "$${argList[@]}" cfdict > $(call today).cfdict-"${what}".localhot.sql
$(call update-latest,${what})
触发错误的行是$(call update-latest,${what})
,并调用update-latest
函数。
我检查标签/空格,看起来是正确的。
我是否滥用call
或严重声明update-latest
?
答案 0 :(得分:3)
导致您报告错误的问题是您没有将特定于目标的变量定义与规则的定义分开。您目前拥有此表单的规则:
data-only: what=data
... commands ...
您可能希望data-only: what=data
行定义特定于目标的变量和规则,但它不会。
您需要的是为变量声明设置o ne行,然后重复规则的目标名称。像这样:
data-only: what=data
data-only:
... commands ...
所以data-only
,只举一个例子,将成为:
data-only: what=data
data-only:
argList=( --defaults-file="${credentials}" --no-create-db --no-create-info ) \
mysqldump "$${argList[@]}" cfdict > $(call today).cfdict-"${what}".localhot.sql
$(call update-latest,${what})
我看到您将argList
声明为shell变量,因此无需更改。
您必须同样更新Makefile中具有特定于目标的变量的所有目标。