如何使用nmake为C ++项目组织项目树?

时间:2008-11-05 18:56:59

标签: build-automation project-organization nmake

组织项目文件似乎有两个主要约定,然后是许多变体。

约定1:高级类型目录,项目子目录

例如,wxWidgets项目使用此样式:

/solution
   /bin
      /prj1
      /prj2
   /include
      /prj1
      /prj2
   /lib
      /prj1
      /prj2
   /src
      /prj1
      /prj2
   /test
      /prj1
      /prj2

优点:

  • 如果存在项目依赖项,则可以从单个文件管理它们
  • 平面构建文件结构

缺点:

  • 由于test有自己的头文件和cpp文件,因此当您为EXE文件而不是库生成单元测试应用程序时,他们需要包含您正在测试的应用程序中的object files。这需要您创建推理规则并扩展所有源文件的相对路径。
  • 重用其他解决方案中的任何项目需要您从树结构中提取适当的文件并修改任何构建脚本

约定2:高级项目目录,键入子目录

例如,Wireshark项目使用此样式

/solution
   /prj1
      /bin
      /include
      /lib
      /src
      /test
   /prj2
      /bin
      /include
      /lib
      /src
      /test

优点:

  • 项目本身在其文件夹中是自包含的,使其更易于移动和重复使用
  • 允许在构建工具中使用更短的推理规则
  • 促进分层构建脚本

缺点:

  • 如果项目之间存在依赖关系,则需要在项目目录上方添加一层构建脚本来管理构建顺序

我们目前正在使用我们项目的惯例1,到目前为止它已经运作得相当好。现在,我正在使用nmake添加单元测试(通过CxxTest)并促进向持续集成的迁移,约定1在创建正确的nmake文件时引起了一些严重的麻烦。

我的主要要求/目标是:

  • 降低维护整个解决方案的构建脚本的工作量。

  • 在其他项目的解决方案中解除项目及其构建步骤。

  • 通过使用构建脚本进行签出以促进每次提交的媒体生成(显然也利用其他工具,如CruiseControl),促进持续集成。

  • 为开发人员添加或删除其他项目或源文件尽可能简单且最不容易出错。

所以我问:

  • 还有其他优点和缺点 这些方法中的任何一种?
  • 是否有一个明确的agrument只赞成一个 这些惯例?

2 个答案:

答案 0 :(得分:4)

[部分回答。]

在“第2号公约:高级项目目录,键入子目录”中,您的单个目标是

  

如果之间存在依赖关系   项目,你需要一个额外的层   项目上方的构建脚本   用于管理构建顺序的目录

在许多项目中,这也可以被视为专业人士。

如果你有很多重复的一般定义,那么人们可能想要一个构建脚本的包含文件,其中解决方案范围的常量和参数可以定义。因此,即使没有(直接)依赖关系,“构建脚本的附加层”也会经常发生。

这是一个专业人士,因为在建筑方面还有更多模块化方法的空间。另一方面,如果要在另一个不相关的解决方案中重用项目,则需要编写不同的定义文件。 (另一方面,如果整个解决方案只有一个构建文件,就像在第1条中那样,你需要一个不同的构建脚本。)至于你的维护需求,那个(IMO)非常依赖项目。

我的感觉倾向于第2号公约,但它远非明显的胜利。事实上,你在第一届会议上的经历可能是最好的职业选手:拥有某个组织经验的团队是一项宝贵的资产。

答案 1 :(得分:1)

考虑使用NTFS junction points,这样您就可以同时拥有这两个组织。快速定义:“联结点是Microsoft的符号链接实现,但它仅适用于目录。”

将“惯例2”用于“真实”布局,因为它使项目易于移动。然后制作一个会议1视图:

mkdir /solution/test
linkd /solution/test/prj1 /solution/prj1/test
linkd /solution/test/prj2 /solution/prj2/test

现在你有......

/solution
  /test
    /prj1
    /prj2 

......这是理想的结果。

如果你觉得它有用,你可以为/ src或其他目录做同样的事情。受益于Convention 1视图的测试脚本位于/ solution / test中。