构建obj和exe文件的最佳dir结构是什么?

时间:2012-01-20 14:57:47

标签: c++ version-control mercurial build makefile

我一直在制作一个makefile。它支持通过使用includes来轻松创建exe,lib和dll类型的项目。

现在我已经开始再次使用mercurial了,我注意到一切都很好并且干净直到我做了一个构建。您看到我的目标文件进入每个子项目的源目录下的子目录。我将lib,exe和dll文件构建到主工作目录下的目录中。这意味着无论何时我hg status,它都会用'?'列出这些临时二进制文件,这是我不想要的视觉混乱。 (这不是mercurial的错,当然我也不会那么天真地检查它们到repo或类似的东西。)我只想要hg状态来发现我可能忘记正确添加的文件,而不是这些临时构建的文件。

目前的目录结构如下:

projroot
-- subproj1 (for source files)
-- subproj1/intr  (for object files, release build)
-- subproj2 (for source files)
-- subproj2/intr  (for object files, release build)
-- bin (for exes and dlls)
-- lib (for libraries that I build)

所以我正在考虑重构makefile以保持在工作目录之外构建的文件(objs libs dlls和exes)。大多数人都将所有二进制文件保存在一个比projroot高一级的目录中,以避免SCM看到它们吗?必须有一些最好的做法。我正在使用的似乎很好但是我认为它有点过时了,当然我已经看到了ant为Java src和类创建一个完全独立的树的方式。

这个结构怎么样?

projroot (contains common makefile includes and repo in here)
-- subproj1 (for source files)
-- subproj2 (for source files)
build
-- subproj1/intr (.o / .obj files in release build)
-- subproj1/intd
-- subproj2/intr
-- subproj2/intd
-- lib (all built libs)
-- bin (all built exes and DLLs)

构建目录在工作目录之外,因此我们将使用的任何SCM都会忽略它。

您的答案必须考虑到projroot中常见的makefile源代码以及有多个项目的事实,每个项目都有自己的内置二进制文件集合,您可能需要单独分发。

3 个答案:

答案 0 :(得分:6)

我个人更喜欢这样的目录结构,因为我不喜欢任何源子文件夹被编译的中间文件污染。干净只是删除输出文件夹

projroot
-- subproj1 (for source files)
-- subproj2 (for source files)
-- output/bin (for exes and dlls)
-- output/lib (for libraries that I build)
-- output/subproj1/ ( for *.o files )
-- output/subproj2/ ( for *.o files )

这有一个额外的好处,我可以设置整个输出文件夹被源控件管理忽略,我不必检查SCM软件,看看生成了什么文件和什么是版本控制。

答案 1 :(得分:3)

由于您已经有Makefile大修答案,我将提交一个善变的答案。

你可以简单地教Mercurial忽略一些文件,你可以通过模式轻松地做到这一点:

// .hgignore file
syntax: glob

# Object Files
**/intr/

# Libraries
lib/

# Binaries
bin/

我们喜欢快速而肮脏。

另一方面,我发现重新安排Makefile以使污染的目录比将所有生成的文件分散到风中更好。

答案 2 :(得分:2)

你能否设置.hgignore file以隐藏hg status的二进制文件?这似乎比重新安排整个项目树要简单得多。

  

Mercurial将在您的根目录中查找名为 .hgignore 的文件   包含一组glob模式和常规的存储库   要在文件路径中忽略的表达式。