2011-10-24 29 views
3

在我正在开发的多平台/ 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}) 

回答

2

一种可能的方式是定义变量TARGET_BUILD_PLATFORM并将其设置为想要建立的确切平台d(linux/qnx/vxworks)。

set(PROJECT_NAME some_name_for_project) 
project(${PROJECT_NAME} CXX) 

file(GLOB COMMON_SRC ${PROJECT_SOURCE_DIR}/common/*.cpp) 
file(GLOB PLATFORM_SRC ${PROJECT_SOURCE_DIR}/${TARGET_BUILD_PLATFORM}/*.cpp) 

set(SRC_FILES ${COMMON_SRC} ${PLATFORM_SRC}) 

add_executable(${PROJECT_NAME} ${SRC_FILES}) 
+0

谢谢谢尔盖。这是我最终解决方案的基础,但不处理重写。我更新了我的帖子以反映我目前使用的解决方案。 –

相关问题