ctest 似乎没有使用 CMAKE_TOOLCHAIN_FILE 中的设置

ctest doesn't seem to use the settings in CMAKE_TOOLCHAIN_FILE

使我的应用程序在 Linux 上运行后,我正在尝试为 Windows 和 MacOSX 交叉编译它。我已经在使用 CMake。

我首先创建了一个工具链文件。这行得通。我的 linux 程序是用 mingw 编译的,最后我收到一个 .exe。

# build linux
$ cmake -Bbuild-linux
$ cmake --build build-linux

# build windows
$ cmake -Bbuild-windows -DCMAKE_TOOLCHAIN_FILE=`pwd`/cmake/x86_64-w64-mingw32.cmake
$ cmake --build build-windows

接下来会发生什么,是我 运行 ctest 来执行单元测试。在 Linux 中,这工作正常。但是当我使用交叉编译的东西执行此操作时,它找不到 .exe 文件。

# run tests linux
(cd build-linux; ctest)

# run tests windows
(cd build-windows; ctest)

没问题,我想 -- 我会根据环境附加 .exe 后缀 -- 使用 if(WIN32)

# CMakeLists.txt

if(WIN32)
    SET(EXE_SUFFIX, ".exe")
endif()

ADD_TEST(NAME test_myapp
    COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bin/myapp${EXE_SUFFIX} ${CMAKE_CURRENT_SOURCE_DIR}/test_myapp.txt
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    )

但是 WIN32 由于某种原因不可用,并且它从不附加后缀。为什么 WIN32 不可用?是 ctest 不知道工具链文件中的设置的问题吗?难道它没有意识到声明了WIN32吗?

我可以在我的 CMakeLists.txt 文件中的其他地方使用 if(WIN32) 只要 cmake.exe 正在处理这些行,而不是 ctest.exe.

综上所述,ctest 运行s时没有设置WIN32

有没有不用ctest就可以执行单元测试的方法?如果不能相信它能正确地做到这一点,也许我不再使用它了。

这一行完全不正确:

SET(EXE_SUFFIX, ".exe")

您设置了变量 EXE_SUFFIX,,而不是 EXE_SUFFIX。当您稍后展开 ${EXE_SUFFIX} 时,它返回为空,因此从程序其余部分的角度来看,整个 if (WIN32) 块是一个 no-op。