Makefile 完美生成文件
我想使用模块化构建,结合自动单元测试和多平台构建。类似的设置在Java和.NET中很常见,但对于make和C/C++,我很难将它们结合起来。如何实现这一目标 我的要求:Makefile 完美生成文件,makefile,build-process,continuous-integration,Makefile,Build Process,Continuous Integration,我想使用模块化构建,结合自动单元测试和多平台构建。类似的设置在Java和.NET中很常见,但对于make和C/C++,我很难将它们结合起来。如何实现这一目标 我的要求: 快速构建;非递归make(堆栈溢出问题) 模块化系统(即,最小依赖关系,子目录中包含组件的makefile) 多平台(通常是用于单元测试的PC,用于系统集成/发布的嵌入式目标) 完全依赖性检查 执行(自动)单元测试的能力(敏捷工程) 与持续集成系统挂钩 易于使用 我已经开始了。我仍然觉得这是一个很好的开始 迄今为止的限制:
- 快速构建;非递归make(堆栈溢出问题)
- 模块化系统(即,最小依赖关系,子目录中包含组件的makefile)
- 多平台(通常是用于单元测试的PC,用于系统集成/发布的嵌入式目标)
- 完全依赖性检查
- 执行(自动)单元测试的能力(敏捷工程)
- 与持续集成系统挂钩
- 易于使用
- 没有单元测试的集成
- 基于windows的ARM编译器与Cygwin路径的不兼容性
- makefile与Windows\path不兼容
- 前向依赖关系
/cygdrive/c
问题(因为编译器通常可以处理/path),而不引入c:(这会造成不喜欢)。还有其他想法吗?以及相关工具CTest和CDash似乎可以满足您的需求。值得一看
Bill Hoffman(首席CMake开发人员)在CMake邮件列表中引用了一篇文章:
。。。由于cmake正在为您创建makefiles,因此存在许多缺点
避免使用递归make,例如,您不必调试
makefiles甚至可以考虑它们是如何工作的。还有其他例子
在那篇论文中,cmake也为你解决了很多问题
另请参见stackoverflow上的“递归交友还是敌人?”
-
好的,下面是我要做的:
我在根目录中使用一个Makefile和通配符模式来收集目录中的所有文件。注意,例如,我假设foo/*.c将构成foo.so。这使得对Makefile的维护变得非常简单,因为只要将文件添加到目录中,就会自动将其添加到构建中
因为它是让您使用的,所以我假设(我在我的项目中这样做)使用的编译器使用的是与gcc(cc)兼容的命令行语法。所以MSC是不正常的;但别灰心,我的大部分开发(不幸的是)都是在Windows上进行的,并将MinGW与MSys一起使用;工作起来很有魅力。生成本机二进制文件,但使用符合Posix的构建环境构建
依赖项检查是使用标准的-MD
开关完成的。然后,我将所有*.d文件都包含到Makefile中。我用自动收集的源文件构建模式
最后,使用“标准”check
目标实现单元测试。check目标与all目标类似,只是它依赖于单元测试,并在构建完所有内容后执行。我这样做是为了您可以单独构建项目或构建单元测试(以及项目的其余部分)。当我不开发项目时,我只想构建它并完成它
以下是我如何做到这一点的示例:
它还有安装
、卸载
和距离
目标
正如您所看到的,一切都是简单的make,没有递归的make调用,而且都相对简单。我使用了automake和autoconf,我再也不会这样做了;另外,其他构建工具也是不可能的,如果我需要安装foojam或barmake来构建某些东西,我通常会立即放弃该项目 请注意,您可以在Windows中使用
/
作为路径分隔符,这通常很好。几乎每一个使用路径的API函数都会透明地将它们转换为“无论如何”。但是,导致问题的是驱动器号。Make不能处理:well(因为它定义了一个目标)。windows应用程序无法识别/cygdrive/c/。如果我将/cygdrive/c翻译成c:,那么编译器生成的依赖文件不会被makefile识别。谢谢;我将进一步研究这个组合+感谢你的努力。这不是我想要的答案,但我还是接受了,因为避免这个问题可能比在make文件中解决它要好。
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