完美的makefile

Adr*_*aan 5 continuous-integration build-process makefile

我想使用make来结合模块化构建与持续集成,自动单元测试多平台构建.类似的设置在Java和.NET中很常见,但是我很难将它们整合到make和C/C++中.如何实现?

我的要求:

  • 快速建设; 非递归make(Stack Overflow问题)你对非递归make的体验是什么?)
  • 模块化系统(即最小依赖项,带有组件的子目录中的makefile)
  • 多平台(通常用于单元测试的PC,用于系统集成/发布的嵌入式目标)
  • 完全依赖性检查
  • 执行(自动)单元测试的能力(敏捷工程)
  • 挂钩到持续集成系统
  • 使用方便

我从非制作开始.我仍然觉得这是一个很好的起点.

到目前为止的限制:

  • 没有集成单元测试
  • 基于Windows的ARM编译器与Cygwin路径的不兼容性
  • makefile与Windows\path不兼容
  • 前向依赖

我的结构看起来像:

    project_root
       /algorithm
                 /src
                     /algo1.c
                     /algo2.c
                 /unit_test
                     /algo1_test.c
                     /algo2_test.c
                 /out
                     algo1_test.exe
                     algo1_test.xml
                     algo2_test.exe
                     algo2_test.xml
             headers.h
       /embunit
       /harnass
   makefile
   Rules.top
Run Code Online (Sandbox Code Playgroud)

我想保持简单; 这里的单元测试(algo1_test.exe)依赖于'algorithm'组件(ok)和单元测试框架(在构建它时可能知道也可能不知道).但是,将构建规则移到顶部make对我没有吸引力,因为这会在整个系统中分发组件的本地知识.

至于Cygwin路径:我正在使用相对路径进行构建.这解决了/cygdrive/c问题(因为编译器通常可以处理/路径)而不会引入C :(这使得不喜欢).还有其他想法吗?

Che*_*evy 3

CMake与相关工具 CTest 和 CDash 似乎可以满足您的要求。值得一看。

Bill Hoffman(首席 CMake 开发人员)在CMake 邮件列表中的一篇文章中提到了Recursive Make Been Harmful论文:

...由于 cmake 正在为您创建 makefile,因此可以避免递归 make 的许多缺点,例如您不必调试 makefile,甚至不必考虑它们是如何工作的。该论文中还有 cmake 为您修复的其他示例。

另请参阅“Recursive Make - 朋友还是敌人?”的答案 这里在 stackoverflow 上。

- 递归结交——朋友还是敌人?