使功能和“命令在第一个目标之前开始”?

时间:2014-04-03 21:42:47

标签: bash function makefile gnu-make

这是我运行的命令

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函数。

完整gist available on github

问题

我检查标签/空格,看起来是正确的。 我是否滥用call或严重声明update-latest

1 个答案:

答案 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中具有特定于目标的变量的所有目标。