CMake 找不到源文件,但文件未在 CMakeLists.txt 中指定,在 TFS 构建定义中

CMake cannot find source file, but file was not specified in CMakeLists.txt, in TFS build definition

我正在将一个大型项目移植到 linux。我写了所有 CMakeLists.txt 文件,所有内容都在我的机器上编译。

无论出于何种原因,我们仍在使用 TFS。旧版本,不带 TFS git。

我在自己的分支机构工作,但该分支机构没有 linux 的构建定义。在签入之前,我想确保所有内容也在服务器上编译。所以我需要将我的分支合并到另一个分支,并将该搁置集提交给构建作业。

在我的机器上一切都编译得很好。但是当我 运行 在服务器中构建时,将搁置集应用于具有 linux 构建定义的分支,我从构建中得到一个错误,说

CMake Error at 
/myproject/subproject/CMakeLists.txt:165 (add_library):
  Cannot find source file:

/myproject/subproject/IInternalTransactionManager.h

  Tried extensions .c .C .c++ .cc .cpp .cxx .cu .m .M .mm .h .hh .h++ .hm
  .hpp .hxx .in .txx

的确,那个文件不存在。 Cmake 抱怨文件不在源目录中,这是真的,因为它在另一个目录中。但事实是我也不是要它!我的 CMakeFiles.txt 文件不包含该文件。该文件是一个 header,在几个文件中使用,仅包含 类 定义(无实现),并且 myHeader.h 所在的目录已在 include_directories 中定义.我的 CMakeLists.txt 看起来像这样:

set(PROJECT_NAME project)
project(${PROJECT_NAME})
include_directories(
  ../_include
)

set(source_files
  main.cpp
  file_that_includes_myHeader.cpp
)

add_library( ${PROJECT_NAME} STATIC ${source_files} )

我的文件结构是这样的:

/myproject/subproject/main.cpp
/myproject/subproject/file_that_includes_myHeader.cpp
/myproject/subproject/CMakeLists.txt
/myproject/_include/myHeader.h

那么,如果 CMakeLists.txt 文件中没有包含这样的文件,为什么 cmake 会抱怨丢失的文件?为什么这只会发生在 TFS 中?我的猜测是应用shelvetset的时候出了点问题,与我的代码无关,但我无法证明。

我比较了搁置集应用后的代码,在那个版本中 CMakeLists.txt 没有提到 myHeader.h

或者,有一些关于在 CMakeLists.txt 文件中包含 header 的规则,我不知道。

所以,在调试了太多之后,我联系了负责构建过程的团队。事实证明,TFS 构建定义中的构建过程绝对不是我所期望的。当然,这没有记录在案。

我们的开发主要集中在 windows(到目前为止)。 linux 构建在构建之前有一个步骤:启动一个脚本来解析每个 Visual Studio 项目文件,获取包含的文件,并将 CMakeLists.txt 文件中的源文件替换为已解析的文件来自VS。对与错,就是这样。

我可以在我的本地机器上构建 linux 版本,因为一切都已正确完成。 windows 构建也有效,即使 VS 项目文件有时包含一些不在源目录中但在某些 header 目录中的文件,并且以某种方式编译。我猜是因为该目录是在 include 目录中定义的。但是当 CMakeLists.txt 文件更新时,cmake 抱怨(这是正确的)找不到文件。

因此,如果有人遇到类似问题,请联系您的开发团队或负责此类事情的任何人。