1

VxWorks 用のクロスコンパイル ツールチェーン ファイルを作成しています。cmake は不明なシステムであるため、プラットフォーム ファイル ( にあるもの../Modules/Platform) も書き込みます。

ツールチェーンファイルの他に、これまでに次のプラットフォーム ファイルを作成しました。

  • VxWorks.cmake (VxWorks OS 設定)
  • VxWorks-gcc.cmake (WindRiver (Gnu) コンパイラの設定)
  • VxWorks-gcc- [CPU] .cmake (CPU 固有の設定、ツールチェーン ファイルで指定されているプロセッサ)

現時点では、すべてが私のファイルで正常に動作しています。

ただし、デフォルトのプラットフォーム ファイルの一部には、次のようなインクルード ガード /インクルード ブロッカーが含まれています。

if(__WINDOWS_GNU)
  return()
endif()
set(__WINDOWS_GNU 1)

(から: Modules/Platform/Windows-GNU.cmake)

だから私は疑問に思っています:私もそのようなガードを挿入する必要がありますか? そして、いつそれらを挿入するのが良い考えですか?

4

2 に答える 2

1

CMake モジュールは相互にインクルードできるため、ひし形の問題が発生する可能性があります。運が良ければ、いくつかの変数を設定するために二重の作業が必要になりますが、複雑なものが必要になると、事態はさらに悪化する可能性があります。

例:

FindB.cmake

find_package(A)

FindA.cmake

find_package(B)

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})

find_package(A) # include FindA.cmake, which include FindB.cmake
    # which include FindA.cmake ....

cmakeを実行します。

-- The C compiler identification is Clang 4.2.0
-- The CXX compiler identification is Clang 4.2.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
Segmentation fault: 11

モジュールの先頭でガードを使用するだけです(衝突を防ぐために変数にパスを記述させます)

FindB.cmake

if(FIND_B_CMAKE)
  return()
endif()
set(FIND_B_CMAKE 1)

find_package(A)
于 2013-07-10T04:16:30.807 に答える