2011-10-24 8 views
3

私が取り組んでいるマルチプラットフォーム/ osプロジェクトでは、プラットフォーム固有のコードを共通の実装を持つ共通のディレクトリでサブディレクトリに単純化しようとしています。私はautotoolsでプロトタイプの実装をしていますが、可能であればcmakeの実装に移行したいと考えています。私の現在のポイントは、複数のOSをサポートする方法です。私の現在のファイルシステムの構造は、次のようになります。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標準に書かれたスタブまたは共通の実装です。カスタム実装を必要とするプラットフォームは、共通のものをオーバーライドすることができますが、オプションです。 autotoolsので

、私はソースツリー階層を設定するには、この使用してVPATHを達成することができていますので、私は設定:

[email protected]@/src/@[email protected];@[email protected]/src/common 

これはautotoolsのは、その後、SRC/@ target_platform @最初でソースファイルを探します見つからなければ、src/commonから取得してください。

これを行うにはどのような方法がありますか?

更新: 私が苦しんでいるすべての魂を助けるために、これは私が当面していたものです。私はそれが最良の解決策であるかどうかはわかりませんが、十分にうまくいきます。

FILE(GLOBのcommon_files "SRC /共通/ .C") FILE(GLOBのplatform_files「SRC/$ {OS}/.C)次に

は、汚れたN^2アルゴリズムを行います「スクリプト」cmakeの内の任意のもっと良い方法がわからない。オーバーライドするが、それは十分に高速ですので、ファイルの数が、低いですし。DIAGメッセージは、もちろん、オプションです。

# 
# 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

可能な方法の1つです変数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

ありがとうSergey。それが私の最終的な解決策の基礎ですが、オーバーライドは処理されません。現在使用しているソリューションを反映するように投稿を更新しました。 –

関連する問題