2017-03-13 8 views
1

親スコープで使用する便利なマクロを定義するCMakeLists.txtを作成します。私はマクロをうまく使うことができます。しかし、私は${CMAKE_CURRENT_SOURCE_DIR}を使用しました。残念ながら、マクロが定義されているCMakeスクリプトのディレクトリではなく、呼び出されたディレクトリです。私がそれを変える方法はありますか?私が見つけたCURRENT_SOURCE_DIRを使用するsub_directoryにcmakeマクロを定義する方法は?

MWE

cmake_minimum_required(VERSION 3.6) 
project(git_info CXX) 
macro(do_stuff) 
    message("This CMakeLists.txt file is in ${CMAKE_CURRENT_SOURCE_DIR}") 
endmacro() 

一つ醜いの方法は、パスが含まれており、マクロでそれを使用して、親スコープに変数をエクスポートすることでした。しかし、私は可能な限り、マクロ定義をエクスポートして、物事をきれいに保つことを望んでいます。

編集: 少し明確にする。私はトップレベルのCMakeLists.txtと上記のMWE CMakeLists.txtで1つのフォルダ(my_folder)を持つ1つのフォルダを持っています。次のようにトップレベルCMakeLists.txtに見えます:

cmake_minimum_required(VERSION 3.6) 
project(top_project CXX) 
add_subdirectory(my_folder) 
do_stuff() 

答えて

1

あなたが別の変数またはにマクロ外CMAKE_CURRENT_LIST_DIRを転送する必要があります - あなたのケースで - グローバルプロパティ定義されたユーザ:

set_property(GLOBAL PROPERTY DoStuffPath "${CMAKE_CURRENT_LIST_DIR}") 

macro(do_stuff) 
    get_property(_my_marcros_file GLOBAL PROPERTY DoStuffPath) 
    message("This CMakeLists.txt file is in ${_my_marcros_file}") 
endmacro() 

も動作しますマクロはinclude()で追加されたファイルで定義されます。最も外側の親CMakeLists.txtへのパスを取得する

参照

+0

これは、マクロがparent_scopeで呼び出されるので、 '_my_marcros_file'はマクロが定義されている場所から見えません。したがって、印刷されたメッセージは( "このCMakeLists.txtファイルは")です。 – NOhs

+0

質問に明確な説明を追加しました。 – NOhs

+0

しかしそれは逆です。親スコープで子スコープで定義されたマクロを使用したいと思います。これはうまくいきますが、子スコープの変数を親スコープに表示させたくありません。 – NOhs

関連する問題