在我正在开发的多平台/ os项目中,我正在努力将特定于平台的代码简化为子目录,其中包含一个通用实现的通用目录。我在autotools中有一个原型实现,但是如果可能的话,我想移动到cmake实现。我目前的关键点是如何支持多种操作系统。我目前的文件系统结构如下所示:在cmake中处理特定于os /平台的代码
/* A common header file for all platforms that presents an interface */
include/my_socket_utils.h
include/my_time_utils.h
/* Platform specific source files */
src/common/my_socket_utils.cpp
src/linux/my_socket_utils.cpp
src/vxworks/my_socket_utils.cpp
src/qnx/my_socket_utils.cpp
src/common/my_time_utils.cpp
src/vxworks/my_time_utils.cpp
这个想法是有一个通用接口和一个“通用”实现。这个实现或者是一个存根,或者是一个写入posix标准的通用实现,允许它在大多数平台上工作。那些需要自定义实现的平台可能会覆盖常见的平台,但它是可选的。
利用自动工具,我能够做到这一点使用VPATH设置一个源代码树的层次结构,所以我设置:
[email protected]@/src/@[email protected];@[email protected]/src/common
这使得自动工具寻找在SRC/@ TARGET_PLATFORM @第一源文件,然后,如果找不到,请从src/common中抓取它。
什么是cmake的方式来做到这一点?
更新: 为了帮助那些需要的人,这是我最终做的。我不确定这是最好的解决方案,但它工作得很好。
FILE(GLOB common_files “SRC /普通/ .C”) FILE(GLOB platform_files“SRC/$ {OS}/.C)
然后,执行脏N^2算法覆盖。不知道如何做任何更好地cmake的“剧本”,但文件的数量是低的,所以它是足够快。在诊断消息,当然,可选的。
#
# For each common file, check to see if a platform file exists to override it.
#
foreach(fqfn ${common_files})
set(platform_override FALSE)
get_filename_component(filename ${fqfn} NAME)
#
# If filename exists in platform, override it with the platform,
# otherwise fall back to the common implementation. Oh for a real
# language.
#
foreach(platform_fqfn ${platform_files})
get_filename_component(platform_filename ${platform_fqfn} NAME)
message("pf=${platform_filename} cf=${filename}")
if(filename STREQUAL platform_filename)
message("filename == platform_filename")
list(APPEND proj_files ${platform_fqfn})
set(platform_override TRUE)
endif(filename STREQUAL platform_filename)
endforeach(platform_fqfn ${platform_files})
if(NOT ${platform_override})
list(APPEND proj_files ${fqfn})
message("Appended ${fqfn}")
endif(NOT ${platform_override})
endforeach(fqfn ${common_files})
message("proj_files=${proj_files}")
add_executable (cc_dfi_main ${proj_files})
谢谢谢尔盖。这是我最终解决方案的基础,但不处理重写。我更新了我的帖子以反映我目前使用的解决方案。 –