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可以返回到building
gitfoo
。这将执行剩余的配方,该配方为空

如果允许并行构建,
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可以返回到building
gitfoo
。这将执行剩余的配方,该配方为空

如果允许并行构建,
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