Makefile重新编译未更改的文件

时间:2017-06-08 20:40:14

标签: makefile build-automation

我试图让我的Makefile只在文件发生变化时重新编译,并且它对Java目标非常出色,但不适用于JS。没有报告任何错误,但是当我第二次运行make bundle时,它仍会重新运行所有这些命令。

手动运行find ...的输出似乎产生了预期的结果,没有额外或缺少的行。

JAVA_SRC_DIR := .
JAVA_SOURCES := $(shell find $(JAVA_SRC_DIR) -name '*.java' -o -name '*pom.xml')

JS_SRC_DIR := ./ui-bundle
JS_EXCLUDE := \(node_modules\|coverage\)
JS_SOURCES := $(shell find $(JS_SRC_DIR) -name '*.js' -o -name '*.jsx' -o -name '.babelrc' -o -name 'package.json' | grep -v $(JS_EXCLUDE) | grep -v -e '^$')

bundle: $(JS_SOURCES)
    npm install
    ./node_modules/jest-cli/bin/jest.js --verbose
    ./node_modules/gulp/bin/gulp.js package

service: $(JAVA_SOURCES)
    mvn clean install -pl "!integration"

我猜测这与它有关,但是当我尝试找到make认为已更改make -d | grep "\(older\|newer\)"的文件时,它找不到任何内容,但是{ {1}}结束于:

make -d

此外 Finished prerequisites of target file `bundle'. Must remake target `bundle'. 似乎尝试运行某种npm命令。

我哪里错了?

1 个答案:

答案 0 :(得分:5)

问题是bundle只是规则的名称,规则实际上并不构建名为“bundle”的文件。无论先决条件有多新或多旧,当您make bundle时,Make看到没有这样的文件,推断它必须构建,并执行规则。

如果您希望Make在没有更改先决条件时禁止执行规则,您必须给它一些东西来比较它们。如果您可以识别规则始终修改的某个文件,则可以将该文件作为目标。我不能建议候选人,因为我不知道npmjestgulp做了什么,但假设它是jest_output

jest_output: $(JS_SOURCES)
    ...

或者您可以拥有一个名为bundle的实际文件,该文件用作Make的标记,一个具有名称和修改时间的空文件:

bundle: $(JS_SOURCES)
    npm install
    ./node_modules/jest-cli/bin/jest.js --verbose
    ./node_modules/gulp/bin/gulp.js package
    touch bundle