CMake / CTest源文件将不会编译

时间:2018-09-18 23:47:40

标签: c++ cmake ctest

我试图找出一种使用CMake / CTest编写测试的方法,该方法将尝试编译不应编译的文件,并导致CTest成功进行测试。一个示例是测试源文件,该文件尝试使用它没有访问权限的私有方法。天真的方法是对COMMAND进行硬编码以使用类似gcc failing_source_file.cpp | if [[ $? != 0 ]]; then false; else true; fi的名称,但这将无法使用正确的编译器,并且在Windows上也将无法使用。

  • 是否有一种简单的方法可以断言文件无法编译?
  • 是否可以使用EXCLUDE_FROM_ALL并通过CTest递归调用CMake(似乎很慢)?
  • 另一种选择是将CMAKE_EXPORT_COMPILE_COMMANDS与某种grep / sed / sh组合一起使用,但是又如何以与平台无关的方式反转退出代码?
  • 这是完全徒劳的努力吗?

Get full C++ compiler command line在这方面可能很有用,但这似乎只是获得标志,而不是实际的编译器命令。


这是一个例子

#
# CMakeLists.txt
#

cmake_minimum_required(VERSION 3.8)

project(test_does_not_compile)

add_library(the_library INTERFACE)
target_include_directories(the_library INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

enable_testing()

add_executable(test_compiles test_compiles.cpp)
target_link_libraries(test_compiles the_library)

add_test(NAME test_compiles
     COMMAND test_compiles)

# I'd like to be able to use the would-be compile command, to assert that the test does not compile
# add_executable(test_does_not_compile test_does_not_compile.cpp)
# target_link_libraries(test_does_not_compile the_library)
# add_test(NAME test_does_not_compile
#          COMMAND test_does_not_compile)

来源很简单。

//
// the_library.hpp
//
#pragma once
#include <iostream>

class TheLibrary {
   private:
    void private_method() { std::cout << "called me private!\n"; };

   public:
    void public_method() { std::cout << "called me public!\n"; };
};

一个没有问题的测试文件,它使用public方法。

//
// test_compiles.cpp
//
#include "the_library.hpp"

int main(int argc, char* argv[]) {
    TheLibrary a_library;
    a_library.public_method();
    return 0;
}

由于使用私有方法,因此无法编译的测试文件。

//
// test_does_not_compile.cpp
//
#include "the_library.hpp"

int main(int argc, char* argv[]) {
    TheLibrary a_library;
    a_library.private_method();
    return 0;
}

0 个答案:

没有答案