File 如何检查目录是否不存在';不存在于制造和创造之中

File 如何检查目录是否不存在';不存在于制造和创造之中,file,compilation,makefile,File,Compilation,Makefile,在我的项目目录中,我有一些子目录:code/、export/、docs/和object/。make只需从代码目录编译所有文件,并将.o文件放入对象目录 问题是,我告诉git忽略所有的.o文件,因为我不想上传它们,所以它也不会跟踪对象目录。实际上我对此没有意见,我不想将对象/也上传到我的GitHub帐户,但是对于当前的解决方案(在对象/目录中是一个简单的空文本文件),目录确实会被上传,并且需要在构建之前存在(生成文件只是假设它在那里) 这看起来并不是最好的解决方案,那么有没有办法在生成文件之前检查

在我的项目目录中,我有一些子目录:
code/
export/
docs/
object/
make
只需从代码目录编译所有文件,并将.o文件放入对象目录

问题是,我告诉git忽略所有的.o文件,因为我不想上传它们,所以它也不会跟踪对象目录。实际上我对此没有意见,我不想将
对象/
也上传到我的GitHub帐户,但是对于当前的解决方案(在
对象/
目录中是一个简单的空文本文件),目录确实会被上传,并且需要在构建之前存在(生成文件只是假设它在那里)


这看起来并不是最好的解决方案,那么有没有办法在生成文件之前检查目录是否不存在,如果存在,就创建它?这将允许在调用make命令并随后创建时,对象目录不存在。

只需为其设置一个目标:

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

object:
    mkdir $@
object/%.o:code/%.cc对象
编译$<。。。
对象:
mkdir$@

如果要防止出现名为“object”的文件,您必须更加小心,但这是基本思想。

在目标中插入mkdir命令

object/%.o : code/%.cc
    @mkdir -p object
    compile $< somehow...
object/%.o:code/%.cc
@mkdir-p对象
编译$<。。。

如果目录已经存在,'-p'不会导致错误。

唯一正确的方法是使用仅订购的先决条件,请参阅:。请注意代码段中的|

如果不使用order only先决条件,则该目录中的每次修改(例如处理或创建文件)都将触发再次依赖于目录创建目标的规则

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

object:
    mkdir -p $@
object/%.o:code/%.cc | object
编译$<。。。
对象:
mkdir-p$@

通常最好使用仅限订单的先决条件(即使用
code/%.cc | object
),这样
object
就不会影响
$^
@Idelic:night技巧,我不知道
$^
不包括仅限订单的preq。谢谢例如,我不能有一个名为“debug”的目标和一个名为“debug”的文件夹。这并不能像预期的那样工作,因为对象目录的时间戳将在添加任何对象时发生更改。看到另一个答案了吗?很好!这样,它就可以在还不存在的情况下创建,而不是在每次执行规则时(对于每个对象文件)都尝试创建,但效果不太理想:每次都派生一个shell进程,而不是在需要时。