使用 CMake 和 Clion 构建 C 项目

Structuring C Project with CMake and Clion

我在 clion 中有以下项目结构:

├── CMakeLists.txt
├── src
│   ├── func1.c
│   ├── func1.h
│   └── main.c
└── test
    └── unit
        └── test_func1.c

其中 CMakeLists.txt:

    cmake_minimum_required(VERSION 3.5)
    project(untitled)

    set(CMAKE_C_STANDARD 11)
    find_library(CMOCKA_LIBRARY libcmocka.so)

    # application binary
    set(SOURCE_FILES src/main.c src/func1.c src/func1.h)
    add_executable(untitled ${SOURCE_FILES})

    # test binary
    include_directories("${CMAKE_SOURCE_DIR}/src")
    set(TEST_SOURCE_FILES src/func1.c src/func1.h test/unit/test_func1.c)
    add_executable(unit_tests ${TEST_SOURCE_FILES})
    target_link_libraries(unit_tests ${CMOCKA_LIBRARY})

main.c:

#include <stdio.h>
#include "func1.h"

int main() {
  printf("Hello, World!\n");
  print_hello();
  return 0;
}   

test_func1.c:

    #include <stdlib.h>
    #include <stdarg.h>
    #include <stddef.h>
    #include <setjmp.h>
    #include <cmocka.h>
    #include "func1.h"

    static void test_func1(void **state){
      int ret = print_hello();
      assert_true(ret == 0);

    }

    int main(int argc, char **argv){

      const UnitTest tests[] = {
          unit_test(test_func1),
      };

      return run_tests(tests);
    }

func1.c:

    #include <stdio.h>
    #include "func1.h"

    int print_hello(){
      printf("hello");
      return 0;
    }

func1.h:

    #ifndef UNTITLED_FUNC1_H
    #define UNTITLED_FUNC1_H

    int print_hello();

    #endif //UNTITLED_FUNC1_H

当我从 clion 中构建应用程序时,它只构建未命名的 应用程序二进制文件,它不构建测试二进制文件。为了建造 测试,我必须创建一个构建目录并调用 cmake 并手动制作。

我愿意:

  1. 让 clion 在 "build"
  2. 上构建应用程序二进制文件和测试二进制文件
  3. 仅在测试通过时构建应用程序二进制文件
  4. 在这种情况下,管理单元测试的更好方法是什么

Have clion build both the application binary and test binary on "build"

在 CLion 主菜单的右上角 window 您可以从下拉菜单中 select 当前配置。这应该包括您的主要和测试可执行目标,以及一个名为 Build All.

的特殊配置

将此更改为 全部构建 它将一次构建所有目标。请注意,您不能'运行' Build All 配置,除非您还明确告诉 CLion 您希望它用于哪个可执行文件 运行 这里.

Only build application binary if tests pass

这是不可能的。建筑就是建筑,运行ning 测试就是 运行ning 测试。建筑严格在 运行ning 之前。因此,运行 的结果不会影响构建,除非您创建一些(非常)精细的样板结构。

What would be a better way of managing unit tests in this case

目前,对于 CMake 和 CLion,您的单元测试与任何其他单元测试一样都是可执行文件。您可以使用 CTest 将它们注册为适当的测试,这为您提供了来自 IDE 的一些不错的额外支持。看看 CMake 中的 enable_testing and add_test 命令。