19

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

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

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

4

3 回答 3

28

唯一正确的方法是使用order-only-prerequisites,请参阅:https ://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html 。注意| 在片段中。

如果您不使用 order-only-prerequisites,那么该目录中的每个修改(例如处理或创建文件)都会再次触发依赖于目录创建目标的规则!

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

object:
    mkdir -p $@
于 2016-07-22T12:00:10.770 回答
22

只要有一个目标:

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

object:
    mkdir $@

如果您想防范名为“object”的文件的可能性,您必须更加小心,但这是基本思想。

于 2012-09-26T17:46:14.940 回答
17

在目标中插入 mkdir 命令。

object/%.o : code/%.cc
    @mkdir -p object
    compile $< somehow...

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

于 2015-07-08T16:45:45.940 回答