gpt4 book ai didi

cmake - 在 cmake 中处理操作系统/平台特定代码

转载 作者:行者123 更新时间:2023-12-01 16:57:39 25 4
gpt4 key购买 nike

在我正在从事的多平台/操作系统项目中,我努力将特定于平台的代码简化到子目录中,并使用一个包含公共(public)实现的公共(public)目录。我在 autotools 中有一个原型(prototype)实现,但如果可能的话想转向 cmake 实现。我目前的症结是如何支持多个操作系统。我当前的文件系统结构如下所示:

/* 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

这个想法是有一个通用接口(interface)和一个“通用”实现。该实现可以是 stub ,也可以是按照 posix 标准编写的通用实现,使其适用于大多数平台。那些需要自定义实现的平台可以覆盖常见的实现,但它是可选的。

通过自动工具,我可以使用 VPATH 设置源树层次结构来实现此目的,因此我设置:

VPATH=@srcdir@/src/@target_platform@;@srcdir@/src/common

这使得自动工具首先在 src/@target_platform@ 中查找源文件,如果没有找到,则从 src/common 中获取它。

cmake 的方法是什么?

更新:为了帮助所有那些有需要的迷失灵魂,这就是我目前所做的。我不确定这是最好的解决方案,但它效果很好。

FILE(GLOB common_files "src/common/.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})

最佳答案

一种可能的方法是定义变量TARGET_BUILD_PLATFORM并将其设置为您想要构建的确切平台(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})

关于cmake - 在 cmake 中处理操作系统/平台特定代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7880161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com