代码之家  ›  专栏  ›  技术社区  ›  Adriaan

完美制作文件

  •  5
  • Adriaan  · 技术社区  · 17 年前

    我想使用 make 将模块化构建与 continuous integration , 自动单元测试 多平台构建 . 类似的设置在爪哇和.NET中很常见,但我很难把它们结合在一起,以实现C++C++。如何实现?

    我的要求:

    • 快速生成;非递归生成(堆栈溢出问题 What is your experience with non-recursive make? )
    • 模块化系统(即,最小依赖性,在子目录中生成包含组件的文件)
    • 多平台(通常是用于单元测试的PC,用于系统集成/发布的嵌入式目标)
    • 完成依赖项检查
    • 能够执行(自动)单元测试(敏捷工程)
    • 接入持续集成系统
    • 易于使用

    我已经开始 non-rec make . 我仍然觉得这是一个很好的开始。

    目前的局限性:

    • 不集成单元测试
    • 基于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
    

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

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

    2 回复  |  直到 14 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    CMake 连同相关的工具ctest和cdash似乎可以满足您的需求。值得一看。

    Bill Hoffman(首席CMAKE开发人员)指 Recursive Make Considered Harmful 纸在 post 在cmake邮件列表中:

    …因为cmake正在为您创建makefile,所以有很多缺点 例如,您不必调试 制作文件,甚至思考它们是如何工作的。还有其他的例子 在那篇文章中,我也为你修正了一些东西。

    也见 this answer 对于“递归交朋友还是交敌人?”在StackOverflow上。

    - Recursive Make - friend or foe?

        2
  •  0
  •   rioki    14 年前

    好的,我要做的是:

    我使用根目录下的一个makefile和通配符模式来收集 全部的 目录中的文件。注意,我假设foo/*.c将组成foo.so。这使得维护makefile最小化,因为只向目录中添加一个文件就会自动将其添加到构建中。

    因为它使您可以使用我假设(我为我的项目这样做)使用的编译器使用gcc(cc)兼容的命令行语法。所以MSC是不正常的;但是不要灰心,我大部分的开发工作(不幸的是)都是在Windows上进行的,并且与MSY混合使用;工作起来很有魅力。生成本机二进制文件,但使用符合POSIX的构建环境构建。

    依赖性检查是以某种标准完成的 -MD 开关。然后我将所有的*.d文件包含到makefile中。我用自动收集的源文件构建模式。

    最后,使用“标准”实现单元测试 check 目标。检查目标与所有目标类似,只是它依赖于单元测试,并在构建完所有内容后执行。我这样做是为了让您可以单独构建项目或构建单元测试(以及项目的其余部分)。当我不开发这个项目时,我只想构建它并完成它。

    下面是一个我如何做到的例子: https://github.com/rioki/c9y/blob/master/Makefile 它也有 install , uninstall dist 目标。

    正如您所看到的,一切都是简单的make,没有递归的make调用,而且都相对简单。我使用了automake和autoconf,我再也不会这样做了;其他构建工具也不存在问题,如果我需要安装foojam或barmake来构建东西,我通常会立即放弃该项目。