Makefile 可以依赖于 shell 脚本的结果吗?

Dav*_*vid 6 shell makefile

有没有办法使用 shell 脚本的返回值作为 Makefile 中的依赖项?

例如:

生成文件:

proj: getsource.sh
    cc src1.c src2.c ...
getsource.sh: checksource.sh
    wget http://www.something.com/src1.c
Run Code Online (Sandbox Code Playgroud)

检查源.sh:

#!/bin/sh
# bash pseudo code because I can never remember bash's syntax
if [[ -not -exists src1.c ]]
    exit 1
else
    exit 0
...
Run Code Online (Sandbox Code Playgroud)

当在没有源的情况下执行时,Makefile 将运行 getsource.sh 目标,然后运行 ​​proj 目标。如果源存在,它只会运行 proj 目标。

Jos*_*son 2

AFAIK,Makefile 规则仅取决于本地文件的日期。因此,不幸的是,您必须执行类似 @xbug 所示的操作,并且在更通用的情况下:

file-I-care-about.ext: .some-precondition.dep
     run-command > file-I-care-about.ext

.some-precondition.dep:
     run-some-logic && touch .some-precondition.dep

Run Code Online (Sandbox Code Playgroud)

例如,我想确保我安装了一个需要安装的实用程序,但这完全适用于您想要断言的任何条件:

# Generate README from my source file
README.md: src1.cc .extractor-installed.dep
    mdextract src1.cc > $@

# Install doc extractor if it's not already installed
.extractor-installed.dep:
    which mdextract && touch $@ || npm install -g mdextract && touch $@
Run Code Online (Sandbox Code Playgroud)

which mdextract是我的“验证逻辑”,如果它通过,我会更新依赖项,但否则我会运行昂贵的命令,然后更新依赖项。