Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 完美生成文件_Makefile_Build Process_Continuous Integration - Fatal编程技术网

Makefile 完美生成文件

Makefile 完美生成文件,makefile,build-process,continuous-integration,Makefile,Build Process,Continuous Integration,我想使用模块化构建,结合自动单元测试和多平台构建。类似的设置在Java和.NET中很常见,但对于make和C/C++,我很难将它们结合起来。如何实现这一目标 我的要求: 快速构建;非递归make(堆栈溢出问题) 模块化系统(即,最小依赖关系,子目录中包含组件的makefile) 多平台(通常是用于单元测试的PC,用于系统集成/发布的嵌入式目标) 完全依赖性检查 执行(自动)单元测试的能力(敏捷工程) 与持续集成系统挂钩 易于使用 我已经开始了。我仍然觉得这是一个很好的开始 迄今为止的限制:

我想使用模块化构建,结合自动单元测试和多平台构建。类似的设置在Java和.NET中很常见,但对于make和C/C++,我很难将它们结合起来。如何实现这一目标

我的要求:

  • 快速构建;非递归make(堆栈溢出问题)
  • 模块化系统(即,最小依赖关系,子目录中包含组件的makefile)
  • 多平台(通常是用于单元测试的PC,用于系统集成/发布的嵌入式目标)
  • 完全依赖性检查
  • 执行(自动)单元测试的能力(敏捷工程)
  • 与持续集成系统挂钩
  • 易于使用
我已经开始了。我仍然觉得这是一个很好的开始

迄今为止的限制:

  • 没有单元测试的集成
  • 基于windows的ARM编译器与Cygwin路径的不兼容性
  • makefile与Windows\path不兼容
  • 前向依赖关系
我的结构看起来像:

我想让事情保持简单;这里的单元测试(algo1_test.exe)依赖于“算法”组件(ok)和单元测试框架(在构建时可能知道也可能不知道)。但是,将构建规则移动到顶级版本对我没有吸引力,因为这将在整个系统中分发组件的本地知识

至于Cygwin路径:我正在使用相对路径进行构建。这解决了
/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