Makefile 制作:“;目标公司无需采取任何措施”;同时调用两个虚假目标时
简单生成文件:Makefile 制作:“;目标公司无需采取任何措施”;同时调用两个虚假目标时,makefile,gnu-make,Makefile,Gnu Make,简单生成文件: .PHONY:\ gitbranch-foo gitbranch-foo: dir=./foo gitbranch-foo: git-spawn-branch .PHONY:\ gitbranch-bar gitbranch-bar: dir=./bar gitbranch-bar: git-spawn-branch .PHONY:\ git-spawn-branch git-spawn-branch: @$(call git_branch,$(dir),$(bra
.PHONY:\
gitbranch-foo
gitbranch-foo: dir=./foo
gitbranch-foo: git-spawn-branch
.PHONY:\
gitbranch-bar
gitbranch-bar: dir=./bar
gitbranch-bar: git-spawn-branch
.PHONY:\
git-spawn-branch
git-spawn-branch:
@$(call git_branch,$(dir),$(branch))
@echo > /dev/null
define git_branch
cd $(1); \
git checkout -b $(2) || true; \
git push -u origin $(2) || true;
endef
同时调用两个规则:
make gitbranch-foo gitbranch-bar branch=something/blah/blah -rRd
正如您所看到的,“foo”repo成功切换,但make甚至没有处理“bar”repo。为什么?
Switched to a new branch 'something/blah/blah' <-- 'foo' switches successfully
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create pull request for something/blah/blah:
remote: ....
remote:
To xyz.net:foo
* [new branch] master -> something/blah/blah
Branch 'something/blah/blah' set up to track remote branch 'something/blah/blah' from 'origin'.
make: Nothing to be done for 'gitbranch-bar'. <-------- 'bar' is not even processed why?
不过,我还是不明白。任何关于“make”为何如此行为的见解都值得赞赏
注意:我知道我可以像下面这样重构makefile,让它完成我的工作-我只是想了解为什么最初的方法没有按预期工作
.PHONY:\
gitbranch-foo
gitbranch-foo:
@$(call git_branch,./foo,$(branch))
@echo > /dev/null
.PHONY:\
gitbranch-bar
gitbranch-bar:
@$(call git_branch,./bar,$(branch))
@echo > /dev/null
define git_branch
cd $(1); \
git checkout -b $(2) || true; \
git push -u origin $(2) || true;
endef
答案完全是由于
make
的规则,与此处的任何其他标记无关(我将删除所有其他标记)。无法工作的makefile显示:
- 要构建
,我们必须构建gitbranch foo
git spawn branch
- 要构建
,我们必须构建git分支栏
git spawn分支
git-spawn分支的代码以及其他相关内容,但我们就到此为止)
然后运行make,告诉它同时构建gitbranchfoo
和gitbranchbar
在本例中,选择其中一个进行构建-gitfoo
,然后开始构建。哦,嘿,make对自己说,这需要构建git-spawn分支,而我们还没有这样做。关闭make,它根据规则构建git spawn分支
。现在它建成了!Make可以返回到buildinggitfoo
。这将执行剩余的配方,该配方为空
如果允许并行构建,make
现在也可以开始构建gitbranch-bar
而gitbranch-foo
构建。如果没有,我们等待gitfoo
在此时完全构建。无论哪种方式,我们都很快开始构建gitbranch-bar
。嗯,make对自己说,这需要构建git-spawn分支
。。。但幸运的是,我已经做到了!向前的!现在让我们来完成剩下的git分支吧
!这需要执行空的配方,它运行得非常快
现在完成了。它已经建造了所需的一切
(有效的makefile明智地直接从每个规则中使用$call
,因此需要为每个目标运行$call
扩展到的命令,而不是隐藏在第三个目标中,该目标只需构建一次,无需再运行)
(注意,gmake文档提到每次都会运行.PHONY
规则。这意味着每次调用make
,而不是每次调用该规则一次。)答案完全是由于make
的规则,与此处的任何其他标记无关(我将删除所有其他标记)。无法工作的makefile显示:
- 要构建
gitbranch foo
,我们必须构建git spawn branch
- 要构建
git分支栏
,我们必须构建git spawn分支
(当然还有用于构建git-spawn分支的代码以及其他相关内容,但我们就到此为止)
然后运行make,告诉它同时构建gitbranchfoo
和gitbranchbar
在本例中,选择其中一个进行构建-gitfoo
,然后开始构建。哦,嘿,make对自己说,这需要构建git-spawn分支,而我们还没有这样做。关闭make,它根据规则构建git spawn分支
。现在它建成了!Make可以返回到buildinggitfoo
。这将执行剩余的配方,该配方为空
如果允许并行构建,make
现在也可以开始构建gitbranch-bar
而gitbranch-foo
构建。如果没有,我们等待gitfoo
在此时完全构建。无论哪种方式,我们都很快开始构建gitbranch-bar
。嗯,make对自己说,这需要构建git-spawn分支
。。。但幸运的是,我已经做到了!向前的!现在让我们来完成剩下的git分支吧
!这需要执行空的配方,它运行得非常快
现在完成了。它已经建造了所需的一切
(有效的makefile明智地直接从每个规则中使用$call
,因此需要为每个目标运行$call
扩展到的命令,而不是隐藏在第三个目标中,该目标只需构建一次,无需再运行)
(注意,gmake文档提到每次都会运行.PHONY
规则。这意味着每次调用make
一次,而不是每次调用规则一次。)+100->请注意,gmake文档提到每次都会运行.PHONY规则。这意味着每次调用make一次,而不是每次调用规则一次“Oohh,让它变得非常清晰!+100->”注意,gmake文档提到每次都会运行.PHONY规则。这意味着每次调用make一次,而不是每次调用规则“噢,这让它现在非常清楚!
.PHONY:\
gitbranch-foo
gitbranch-foo:
@$(call git_branch,./foo,$(branch))
@echo > /dev/null
.PHONY:\
gitbranch-bar
gitbranch-bar:
@$(call git_branch,./bar,$(branch))
@echo > /dev/null
define git_branch
cd $(1); \
git checkout -b $(2) || true; \
git push -u origin $(2) || true;
endef