2017-01-02 5 views
2

私は最近CMakeと一緒にたくさんのプロジェクトをビルドしていて、全体的には素晴らしいと思います。しかし、依存関係のあるプロジェクトを構築する必要があるときはいつでも、すぐに苦痛になります。 cmakeののfind_packageシステムは通常、システムにインストールパッケージを見つけることについてかなり良いですのですべてのプロジェクトでCMake変数を設定する方法はありますか?

システムインストールの依存関係は、罰金です。しかし、ソースから依存関係を構築するときはいつでも、CMakeにパッケージを見つける場所を伝えることはほとんど不可能です。

私はFindFoo.cmakeモジュールで検索を続けています。何が特別なヒント変数であるかを把握し、その変数を私のライブラリの場所に設定します。実際の問題は、これらのヒント変数が常にCMake変数であるため、自分自身でCMakeLists.txtに設定するか、スクリプトファイルでcmakeをラップして、すべての適切なヒント変数を渡していることを確認することですパッケージを探す必要があります。

私は、環境変数を設定しますが、FindFoo.cmakeモジュールのほとんどは、実際にどのような環境変数をチェックしません。

私は私の問題を解決するためPackage Registryを使用してに見えたが、CMakeのはFindFoo.cmakeモジュールを見つけた場合、それもレジストリで探して気にしない、とFindFoo.cmakeモジュールに障害が発生したときにCMakeはただあきらめます。

私が探しているのは、CMakeの "ユーザースコープ"または "システムスコープ"で変数を設定する方法です。ヒント変数をプロジェクトやスクリプトファイルの代わりに1か所に指定するだけです。残念ながら、私はそのような機能を見つけることができないようです。

私は、Windows上だけど、私は将来的にではないかもしれないので、私は、可能な限りソリューションの一般的なとして探しています。

+1

あなたが使用したいすべてのパスを含む環境変数FOOを定義することができますし、この変数を '-DCMAKE_PREFIX_PATH = $ FOO'を介してCMakeに渡します。 – usr1234567

+0

@ usr1234567解決策の検索でCMAKE_PREFIX_PATH変数が何とか見つからなかった。私はそれがまさに私が探しているものかどうかは分かりませんが、それはかなり役に立つと思われます。 – jpfx1342

答えて

2

これはcmake-guiによって実現されます。あなたは、パスを設定し、キャッシュが削除されない限り、それはあなたのプロジェクトのキャッシュに残ります。

コマンドラインでCMakeのを使用している場合は、引数としてパスを与えることができます。

cmake -DCMAKE_PREFIX_PATH=/some/path -DFOO_ROOT=/some/path/to/foo 

他のオプションは、あなたのCMakeLists.txtに含まれる別のファイルにパスを設定することです。ファイルが存在するかどうかを確認し、使用できない場合は警告メッセージを含むテンプレートファイルを生成することができます。このような何か:${PROJECT_SOURCE_DIR}/my-cmake.paths

set(MY_CMAKE_PATHS "${PROJECT_BINARY_DIR}/my-cmake.paths") 

if(EXISTS "${MY_CMAKE_PATHS}") 
    include("${MY_CMAKE_PATHS}") 
else() 
    file(COPY "${PROJECT_SOURCE_DIR}/my-cmake.paths" DESTINATION "${PROJECT_SOURCE_DIR}" 
    message(FATAL_ERROR 
     "CMake paths are not available. " 
     "Please edit the file \"${MY_CMAKE_PATHS}\" with the appropriate values." 
    ) 
endif() 

はそのようなものであること:

set(CMAKE_PREFIX_PATH) # some comment to explain what is expected here 
set(FOO_ROOT)   # some comment... 

それはあなたが満たされたことにしたいすべての変数を使用してファイルを維持するためにあなた次第です、とに適切なコメントでユーザーが使用するのを助けます。

パスファイルは、ここでPROJECT_BINARY_DIRにコピーされていますが、同様にすべてのプロジェクトのための「共通」のパスにそれをコピーして使用することができます。

+0

CMakeCacheを編集したり、コマンドラインで値を指定したりするのは基本的に私が今やっていることですが、すべてのプロジェクトでそれを行うのは面倒でエラーが発生することがあります。残りの答えは 'CMakeLists.txt'を変更する必要があります。これは汚れていると感じていますので、避けようとしています。 しかし、あなたの答えは私に試してみるという本当の良い考えを与えてくれます。ありがとうございます。 :) – jpfx1342

0

wasthehelpfulの答えは、その後、私のプロジェクトにそれをインポートし、my-paths.cmakeファイルを作成言及@。これは、プロジェクトを変更する必要があることを除いて、ほぼ完璧なソリューションです。しかし、cmakeのマニュアルをもう少し読んだ後、私は "initial-cache" .cmakeファイルをあらかじめロードするオプションがあることに気付きました。

だから私はこのようなエントリで満たさ簡単にアクセスできる場所にlocal.cmakeファイル、作成しました:

cmake -C "~/local.cmake" .. 
:私のプロジェクトを設定するには、次に

set(ZLIB_ROOT "`~/builds/zlib-1.2.8" CACHE PATH "") 
set(PNG_ROOT "~/builds/libpng-1.6.27" CACHE PATH "") 
set(OSG_DIR "~/builds/OpenSceneGraph_3.4.0" CACHE PATH "") 

を、私はこのようなcmakeを呼び出します

この解決策では依然としてコマンドライン引数を指定する必要がありますが、それは単一の引数であり、覚えやすいはずです。

(私はビットのために未回答この質問を残すつもりです、場合には、誰かがよりよい解決策を思い付く。)

関連する問題