修改工作 makefile 以在编译和链接之前做预阶段

Modify working makefile to do pre-stage before compiling and linking

我以这个 makefile 为例:

https://gist.github.com/mihaitodor/bfb8e7ad908489fdf3ceb496573f306a

在compiling/linking之前我需要做一个前期工作,包括cd一个目录和运行一个脚本。没有前置阶段,它可以正常编译和链接。

我想我需要更改 all 规则:

all : $(TESTS)

我试过这个:

all : cd /bla/bla ./my_script $(TESTS)

我已经试过了:

all :
     cd /bla/bla ./my_script
     $(TESTS)

但它停止了 compile/linking 阶段。

鉴于上面的URL,我应该在哪里插入我的前置阶段?

简短的回答是您可能应该创建一个新的配方,并使任何依赖于您的脚本的底层目标 运行ning 依赖于它。类似于:

.ran_my_script: $(GTEST_SRCS_)
   cd /bla/bla ./my_script
   touch $@

test_mihai.o gtest_main.o gtest.o : .ran_my_script

这样它将运行您的脚本它尝试生成任何列出的目标之前。然后它触及文件 $@ (.ran_my_script)。这将比任何 .o 文件更新,这意味着脚本不会重新 运行 除非有人修改其中一个脚本依赖项(即 $(GTEST_SRCS_))。您必须弄清楚哪些工件实际上依赖于您的脚本,以及您的脚本依赖于哪些工件。

请注意,如果任何来源发生变化,那么 .ran_my_script 将被视为已过时,依赖它的任何内容也是如此。这意味着如果您修改任何源,它将重建所有 .o 文件。我假设这就是您想要的。

因为我假设您是 makefile 的新手,所以我要指出两点:首先 $@ 解析为目标名称(上例中的 .ran_my_script),其次,最后一行导致 .ran_my_script 成为 test_mihai.o 和朋友的依赖项——但是因为它没有任何关联的配方,所以这一行不会覆盖针对相同目标的任何其他配方在 makefile 之前或之后指定。


至于为什么您所做的不起作用:

all: cd /bla/blah ./my_script $(TESTS)

表示目标all依赖于目标cd/bla/bla./my_script$(TESTS)。它将在构建 all 之前尝试构建所有这些。当然,您可能没有构建 cd 等规则,因此这将失败。

你的下一个例子,

all :
     cd /bla/bla ./my_script
     $(TESTS)

你用两个配方创建了一个全部目标。首先,它会尝试 运行 你的脚本,然后它会尝试 运行 $(TESTS) 解决的任何问题。请注意,在这种情况下 $(TESTS) 不是 bash 命令,因此这也会失败。

您可能会想做这样的事情:

all : $(TESTS)
     cd /bla/bla ./my_script

但这会导致您的脚本 运行 作为 all 目标的一部分,运行s after $(TESTS)已经完成。