如何检查make中是否存在目录并创建它

cor*_*zza 13 makefile compilation file

在我的项目的目录,我有一些子目录:code/,export/,docs/object/.什么make是简单地编译代码目录中的所有文件,并将.o文件放入对象目录中.

问题是,我告诉git忽略所有.o文件,因为我不希望它们被上传,所以它也不跟踪对象目录.我真的很好,我不想object/上传到我的GitHub帐户,但是使用当前的解决方案(这是object/dir中的一个简单的空文本文件),该目录确实上传并且需要存在在构建之前(makefile只是假定它在那里).

这似乎不是最好的解决方案,所以有没有办法在make文件中构建之前检查目录是否不存在,如果是这样的话就创建它?这将允许在调用make命令时不存在对象目录,并在之后创建.

Bet*_*eta 16

只要有一个目标:

object/%.o: code/%.cc object
    compile $< somehow...

object:
    mkdir $@
Run Code Online (Sandbox Code Playgroud)

如果你想要防止一个名为"对象"的文件的可能性,你必须要小心一点,但这是基本的想法.

  • 通常最好使用仅限订单的先决条件(即使用`code /%.cc | object`),这样`object`不会影响`$ ^`. (10认同)

woe*_*aul 16

唯一正确的方法是使用仅订购先决条件,请参阅:https://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html.注意| 在片段中.

如果您不使用仅订购先决条件,则该目录中的每个修改(例如,复制或创建文件)都将触发再次依赖于目录创建目标的规则!

object/%.o: code/%.cc | object
    compile $< somehow...

object:
    mkdir -p $@
Run Code Online (Sandbox Code Playgroud)

  • 好点子!这样,如果它尚不存在,就会创建它,而不是每次执行规则时都尝试创建(对于每个目标文件) (2认同)

Mik*_*e F 13

在目标中插入mkdir命令.

object/%.o : code/%.cc
    @mkdir -p object
    compile $< somehow...
Run Code Online (Sandbox Code Playgroud)

如果目录已存在,则"-p"不会导致错误.