我有一个包含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'?
答案 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没有更改它也不会为你改变,这应该意味着依赖它的目标不会被更新。
注意我实际上没有测试过,所以我可能会忘记一些事情。