如何防止“目录已存在错误” 使用 mkdir 时在 makefile 中
我需要在我的 makefile 中生成一个目录,并且我不想一遍又一遍地收到“目录已存在错误”,即使我可以轻松忽略它。
我主要使用 mingw/msys,但也希望能在其他 shell/系统上工作。
我尝试过,但没有成功,有什么想法吗?
ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif
I need to generate a directory in my makefile and I would like to not get the "directory already exists error" over and over even though I can easily ignore it.
I mainly use mingw/msys but would like something that works across other shells/systems too.
I tried this but it didn't work, any ideas?
ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
查看官方 make 文档,这是一个很好的方法:
您应该在这里看到 | 的用法 管道运算符,仅定义订单先决条件。
这意味着
$(OBJDIR)
目标应该存在(而不是更新)才能构建当前目标。请注意,我使用了
mkdir -p
。 与文档示例相比,添加了-p
标志。请参阅其他答案以了解另一种选择。
Looking at the official make documentation, here is a good way to do it:
You should see here the usage of the | pipe operator, defining an order only prerequisite.
Meaning that the
$(OBJDIR)
target should be existent (instead of more recent) in order to build the current target.Note that I used
mkdir -p
. The-p
flag was added compared to the example of the docs.See other answers for another alternative.
这是我在 GNU make 中使用的用于创建编译器输出目录的技巧。 首先定义此规则:
然后使进入该目录的所有文件依赖于该目录中的 .d 文件:
注意 $< 的使用 而不是$^。
最后防止自动删除 .d 文件:
跳过 .d 文件并直接依赖于目录是行不通的,因为每次在该目录中写入文件时都会更新目录修改时间,这将强制在每次调用 make。
Here is a trick I use with GNU make for creating compiler-output directories. First define this rule:
Then make all files that go into the directory dependent on the .d file in that directory:
Note use of $< instead of $^.
Finally prevent the .d files from being removed automatically:
Skipping the .d file, and depending directly on the directory, will not work, as the directory modification time is updated every time a file is written in that directory, which would force rebuild at every invocation of make.
您可以使用测试命令:
You can use the test command:
在 UNIX 上只需使用以下命令:
mkdir 的 -p 选项可防止在目录存在时出现错误消息。
On UNIX Just use this:
The -p option to mkdir prevents the error message if the directory exists.
这也适用于多个目录,例如。
添加
$(OBJDIR)
作为第一个目标效果很好。Which also works for multiple directories, e.g..
Adding
$(OBJDIR)
as the first target works well.在 Windows 上
在 Unix 上 | Linux
On Windows
On Unix | Linux
在你的 makefile 中:
Inside your makefile:
如果目录已经存在对您来说不是问题,您可以重定向该命令的 stderr,从而消除错误消息:
If having the directory already exist is not a problem for you, you could just redirect stderr for that command, getting rid of the error message:
比 Lars 的答案简单一点:
通用规则:
没有需要清理或制作的触摸文件。PRECIOUS :-)
如果您想看到另一个通用的 gmake 技巧,或者如果您对非递归 make 感兴趣,只需最少的时间脚手架,您可能需要查看 另外两个便宜的 gmake 技巧 以及该博客中其他与 make 相关的帖子。
A little simpler than Lars' answer:
and generic rule:
No touch-files to clean up or make .PRECIOUS :-)
If you want to see another little generic gmake trick, or if you're interested in non-recursive make with minimal scaffolding, you might care to check out Two more cheap gmake tricks and the other make-related posts in that blog.
如果您明确忽略返回代码并转储错误流,那么您的 make 将忽略发生的错误:
这不应导致并行 make 中的竞争危险 - 但我还没有测试它来确定。
If you explicitly ignore the return code and dump the error stream then your make will ignore the error if it occurs:
This should not cause a race hazard in a parallel make - but I haven't tested it to be sure.
它运行在 mingw32/msys/cygwin/linux 下
It works under mingw32/msys/cygwin/linux