修改工作 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)
已经完成。
我以这个 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)
已经完成。