2016-08-18 14 views
7

カレントディレクトリとしてビルドディレクトリを、絶対パスへの相対パスを変換し、あなたがCMakeの:CMakeのでは

get_filename_component(ABSOLUTE_PATH ${RELATIVE_PATH} ABSOLUTE) 

を使用して、絶対パスに相対パスに変換することができますただし、このような../../other_program/としてパスがソースディレクトリに基づいています(すなわち、CMakeLists.txtファイルがあるディレクトリ)であり、ビルドディレクトリ(すなわち、cmakeが呼び出されるディレクトリ)ではありません。これは、コマンドラインオプションとして相対パスを指定すると混乱を招く可能性があります。

get_filename_componentに、現在のソースディレクトリの代わりに現在のバイナリディレクトリの相対パスを設定する必要があることを伝える方法はありますか?

答えて

7

get_filename_component(<VAR> <FileName> 
         <COMP> [BASE_DIR <BASE_DIR>] 
         [CACHE]) 

セット<VAR><COMP>のいずれかである<FileName>の絶対パスに:

ABSOLUTE =ファイルへのフルパス シンボリックリンクと既存のファイルへ=フルパスを提供<FileName>場合

を解決し、それが所定のベースディレクトリ<BASE_DIR>に対して評価され、相対パスです。ベースディレクトリが指定されていない場合、デフォルトのベースディレクトリはCMAKE_CURRENT_SOURCE_DIRになります。

パスはスラッシュで返され、末尾にスラッシュが付きません。オプションのCACHE引数を指定すると、結果変数がキャッシュに追加されます。

したがって、あなたが使用します。

get_filename_component(buildDirRelFilePath "${myFile}" 
         REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") 

を相対パスにファイルへの絶対パスを変換するには、あなたがfile commandを使用する可能性があります:

file(RELATIVE_PATH <variable> <directory> <file>) 

計算<directory>から<file>への相対パスを入力して<variable>

file(RELATIVE_PATH buildDirRelFilePath "${CMAKE_BINARY_DIR}" "${myFile}") 
+0

はい、この解決策はCMakeのバージョン3.4と高いために理想的です。古いバージョンのCMake(バージョン2.6まで)では、mike.didの解決策がこれを処理する最良の方法です。 –

3

パスが絶対パスであるかどうかは、if(IS_ABSOLUTE path)で確認できます。また、必要なベースディレクトリの前にない場合もあります。例えば、get_filename_component(MEであるハイライト) のドキュメントから

if(NOT IS_ABSOLUTE ${p}) 
    set(p "${CMAKE_CURRENT_BINARY_DIR}/${p}") 
endif() 
3
get_filename_component(MY_RESULT_ABSOLUTE_PATH_VAR 
         "${CMAKE_CURRENT_LIST_DIR}/${MY_RELATIVE_PATH_VAR}" 
         ABSOLUTE) 
+0

この構文は存在しません – korbes

+0

https://cmake.org/cmake/help/v3.0/command/get_filename_component.html https://cmake.org/cmake/help/v3。0 /変数/ CMAKE_CURRENT_LIST_DIR.html ABSOLUTE_PATH - ターゲット変数。 RELATIVE_PATH - パスの一部を持つソース変数 – tvorez

+0

悪いです。私のdownvoteを削除することができますので、変数をクリアするために質問を編集してください。 – korbes