如何构造makefile,其中项依赖于外部脚本创建的文件?

时间:2016-12-19 17:18:11

标签: makefile

我有一个包含Curl的项目的makefile,我们的一些项目依赖于这个Curl库。在我们的平台上,Curl提供了自己的非Make构建脚本,可以构建到一个设置位置。当调用Curl构建脚本时,它只在需要时才创建一个新的Curl库;否则它会在未触及现有神器的情况下退出。

如何构建我的项目的makefile以调用Curl构建脚本,但是如果实际重建了Curl库,那么只重新编译我们的东西?我目前正在这样做,但它没有按预期工作:

.PHONY: CURL.7
CURL.7:
    @cd $(CURL_PATH); sh makefile.sh
    @cp $(CURL_PATH)/CURL.7 $(TGT_DIR)
exp47: exp47.c CURL.7

这无条件地调用Curl构建脚本(由于PHONY语句),然后无条件地将其输出复制到我们的项目目录。但是'exp47'无条件地重新编译。有没有办法每次调用Curl配方,但如果实际重新创建了Curl工件,那么只重建'exp47'?

1 个答案:

答案 0 :(得分:1)

请注意.PHONY,而不是PHONY。如果您将CURL.7声明为.PHONY,那么它将始终运行并始终被视为过时,并且依赖于它的所有内容也将被视为过时。此外,由于您始终执行复制操作,因此目标curl文件将始终是新的,并且因为没有人实际创建文件CURL.7(您创建的$(TGT_DIR)/CURL.7不是同一件事)该规则将永远运行。

你可以通过放置一个"缓冲区"它们之间的规则,目标只有在库更改时才会更改。试试这个:

.PHONY: try-CURL.7
try-CURL.7:
        @cd $(CURL_PATH) && sh makefile.sh
$(TGT_DIR)/CURL.7: try-CURL.7
        @cp -p $(CURL_PATH)/CURL.7 $@

exp47: exp47.c $(TGT_DIR)/CURL.7

通过使用-p中的cp标志,您可以在执行复制时保留时间戳,这样如果CURL_PATH makefile.sh没有更改它也不会为你改变,这应该意味着依赖它的目标不会被更新。

注意我实际上没有测试过,所以我可能会忘记一些事情。