CMake 选项,用于禁用对特定平台的特定文件的编译
CMake Option to Disable Compilation on Specific Files for Specific Platforms
我正在使用CMake来定义我的项目。 我的目标是让特定于平台的文件易于访问,以便在所有平台上进行编辑、搜索、浏览和源代码控制。
我目前在 cmake 描述中分隔了特定于平台的文件。 我的 CMakeLists.txt 文件如下所示:
Foo.hpp
${platform_directory}/Foo.cpp
然后在磁盘上我有这样的东西:
Foo.hpp
win
`- Foo.cpp
osx
`- Foo.cpp
在生成的项目文件中,它看起来像:
Foo.hpp
Foo.cpp (platform-specific version)
这对于编译器来说是完美的,但这意味着开发人员缺乏用于非本机平台特定文件的 IDE 工具。
我正在寻找的是这样的东西(在Xcode中):
Foo.hpp
Foo.cpp (OS X version)
win
`- Foo.cpp (file type set to plain text)
或者在Visual Studio中:
Foo.hpp
Foo.cpp (Windows version)
osx
`- Foo.cpp (build action set to none)
关于如何设置 CMake 这样的东西的任何想法?
一种方法是添加一个没有构建规则的自定义目标,特别是保存不属于给定平台构建的文件; 例如
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()
另一种选择(可能更接近您想要的,但更"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()
Fraser 建议的HEADER_FILE_ONLY技术效果很好,但明确配置哪些文件应该在哪个平台上遵守会变得乏味。
给定一个 CMake 函数,如下所示:
function (DisableCompilingPlatformSpecificSources file_list)
foreach(file ${file_list})
if (
((${file} MATCHES "^(.*)Win32\.cpp") AND NOT WIN32) OR
((${file} MATCHES "^(.*)Unix\.cpp") AND NOT UNIX) OR
((${file} MATCHES "^(.*)Apple\.cpp") AND NOT APPLE)
)
set_source_files_properties(
${file}
PROPERTIES HEADER_FILE_ONLY TRUE
)
endif()
endforeach()
endfunction()
我们可以通过后缀来控制特定于平台的源。 例如:
set(all_sources
Foo.hpp
FooWin32.cpp # windows-specific
FooApple.cpp # apple-specific
)
DisableCompilingPlatformSpecificSources("${all_sources}")
add_executable(foo ${all_sources})
这与 gyp 处理特定于平台的文件的方式非常相似,并且可以轻松扩展以支持所需的其他后缀。
相关文章:
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 如何基于平台在制作文件中制作if语句?
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 组织项目的多平台和易于使用的文件
- 如何打开和读取16位.raw文件Vc++(Wince 平台)
- 程序'main.exe'运行失败:指定的可执行文件不是此操作系统平台的有效应用程序
- 在没有节点GYP的目标平台上编译C/C 文件
- 如何从平台SDK明确包含标头文件
- 如果给定正确的运行时库,x86 可执行文件是否可以在任何 x86 平台上运行
- 如何实现独立于平台的异步文件写入
- C++:如何保存独立于平台的二进制文件
- 在任何平台上执行任何Qt5应用程序的重要dll文件是什么(运行时文件dll)
- VS2010在不同平台上生成的可执行文件是否应该有所不同
- 部署Qt-dll文件-找不到windows插件,尽管平台/qwindows.dll存在,因此存在libEGL和libGL
- VS2013 C++:忽略平台包含文件夹
- Visual Studio 2013 在使用 VS 2010 平台工具集时找不到头文件
- C++标准库在任何时候都包括每个平台的原生头文件吗
- 包括具有一个头文件和独立源文件的特定于平台的库
- 对于多个平台,头文件是相同的还是不同的
- 如何在Windows平台中获取远程Windows服务器的共享文件夹的文件列表