生成文件中的错误
我正在使用 gnu Make 3.82,但有一个恼人的问题。
我有一个规则设置目录之间的依赖关系。
OBJDIR=../obj
$(objdir)/%.o: %.C
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
为此,obj 目录必须存在。 我想 mkdir 该目录作为先决条件
$(objdir)/%.o: %.C $(objdir)
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
$(objdir):
mkdir $(objdir)
这不起作用,因为当目录存在时它会失败然后 make 停止 我尝试了 shell
if [ ! -d $(objdir) ] ; then \
mkdir $(objdir) \
fi
,但显然我出了问题。这样做的最佳方法是什么?
I am using gnu Make 3.82 and have an annoying problem.
I have a rule setting dependencies between directories.
OBJDIR=../obj
$(objdir)/%.o: %.C
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) lt; -o $(DEPDIR)/$(notdir $(basename lt;).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c lt;
In order to do this, the obj directory must exist.
I want to mkdir the directory as a prerequisite
$(objdir)/%.o: %.C $(objdir)
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) lt; -o $(DEPDIR)/$(notdir $(basename lt;).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c lt;
$(objdir):
mkdir $(objdir)
This doesn't work, because it fails when the directory is there and then the make stops
I tried shell
if [ ! -d $(objdir) ] ; then \
mkdir $(objdir) \
fi
but obviously I've got something wrong. What's the best way of doing this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
一种简单的方法是使用:
当目录存在时它不会失败。
我通常为此创建一个宏 MKPATH:
然后在规则中引用该宏:
这样,如果有必要,我可以在不更改 makefile 的情况下更改行为。
您的 shell 片段:
无法按编写的方式工作,因为 make 单独执行每一行。
您可以写(注意添加的分号):
或:
或:
请注意,命令行总体上必须成功,因此不要尝试:
如果目录存在,第一个替代方案失败,但 shell 以非零值退出状态,从而失败......并导致构建失败。
One simple way is to use:
It doesn't fail when the directory exists.
I usually create a macro, MKPATH, for this:
and then reference the macro in the rule:
That way, I can change the behaviour without changing the makefile if it becomes necessary.
Your shell fragment:
does not work as written because make executes each line separately.
You could write (note the added semi-colon):
Or:
Or:
Note that the command line must be successful overall, so do not try:
If the directory exists, the first alternative fails, but the shell exits with a non-zero status, thus failing...and causing the build to fail.
mkdir
"mkdir -p"
更改:
为 =>
如果特定的mkdir没有-p,那么:
Makefiles
将
目标:
和命令(mkdir
等)放在单独的行上。另外,在 make 中,要忽略失败的命令,请在命令前加上 减号:
多行命令(if-then-else;for 循环等)需要添加“\;”表示 shell 的换行符:
if-then-else 的这种特殊用法也可以写为:
上面的每一点:
下面的 Makefile 演示了运行 make 的输出
mkdir
"mkdir -p"
Change:
to =>
If that particular mkdir does not have -p then:
Makefiles
Keep the
target:
and the comands (mkdir
, etc) on seperate lines.Also, in make, to ignore failed commands, prefix command with minus:
Commands (if-then-else; for loops, etc) with multiple lines require adding `\;' to represent newlines to the shell:
This particular usage of if-then-else can also written as:
The following Makefile that demonstrates each point above
Output from running running make: