禁用编译特定平台的特定文件的 CMake 选项

Kev*_*vin 4 c++ cross-platform cmake

我正在使用 CMake 来定义我的项目。我的目标是让特定于平台的文件易于访问,以便在所有平台上进行编辑、搜索、浏览和源代码控制。

我目前在 cmake 描述中分离了特定于平台的文件。我的 CMakeLists.txt 文件如下所示:

 Foo.hpp
 ${platform_directory}/Foo.cpp
Run Code Online (Sandbox Code Playgroud)

然后在磁盘上我有这样的东西:

 Foo.hpp
 win
  `- Foo.cpp 
 osx
  `- Foo.cpp 
Run Code Online (Sandbox Code Playgroud)

生成的项目文件中的内容如下:

 Foo.hpp
 Foo.cpp (platform-specific version)
Run Code Online (Sandbox Code Playgroud)

这对于编译器来说是完美的,但这意味着开发人员缺乏用于非本地平台特定文件的 IDE 工具。

我正在寻找的是这样的(在 Xcode 中):

 Foo.hpp
 Foo.cpp (OS X version)
 win
  `- Foo.cpp (file type set to plain text)
Run Code Online (Sandbox Code Playgroud)

或者在 Visual Studio 中:

 Foo.hpp
 Foo.cpp (Windows version)
 osx
  `- Foo.cpp (build action set to none)
Run Code Online (Sandbox Code Playgroud)

关于如何设置 CMake 的任何想法?

Fra*_*ser 5

一种方法是添加一个没有构建规则的自定义目标,特别是保存不属于给定平台构建的文件;例如

if(WIN32)
  add_library(Foo Foo.hpp win/Foo.cpp)
  add_custom_target(NonWindows SOURCES osx/Foo.cpp)
  source_group("osx" osx/Foo.cpp)
else(APPLE)
  add_library(Foo Foo.hpp osx/Foo.cpp)
  add_custom_target(NonApple SOURCES win/Foo.cpp)
  source_group("win" win/Foo.cpp)
endif()
Run Code Online (Sandbox Code Playgroud)

另一种选择(可能更接近您想要的,但更“hacky”)是将所有文件添加到目标,但将构建不需要的文件标记为HEADER_FILE_ONLY

add_library(Foo Foo.hpp win/Foo.cpp osx/Foo.cpp)
if(WIN32)
  set_source_files_properties(osx/Foo.cpp PROPERTIES HEADER_FILE_ONLY TRUE)
  source_group("osx" osx/Foo.cpp)
else(APPLE)
  set_source_files_properties(win/Foo.cpp PROPERTIES HEADER_FILE_ONLY TRUE)
  source_group("win" win/Foo.cpp)
endif()
Run Code Online (Sandbox Code Playgroud)