2017-08-01 29 views
3

由於cmake的3.9以下generator expression已被引入:

$<TARGET_BUNDLE_DIR:tgt> 

對於該文檔指出:

完整路徑束目錄(my.app,my.framework或my.bundle),其中tgt是目標的名稱。

如果使用cmake < 3.9,如何獲得相同的結果(路徑到捆綁目錄)?


我試過如下:

include(BundleUtilities) 
get_dotapp_dir($<TARGET_FILE:my_target> DOTAPP_DIR) 

遺憾的是它不工作。爲get_dotapp_dir文檔說:

返回最近的父目錄的名稱以給定的完整路徑的可執行文件」的.app」結束。如果沒有這樣的父目錄,那麼只需返回包含可執行文件的目錄。

而且包含可執行迪爾正是我得到了它,即使父母.app目錄確實存在。

回答

3

不幸的是,$<TARGET_FILE:my_target>是一個生成器表達式。根據文檔,它在構建時進行評估(不在CMake生成時間)。請參閱相關文檔(重點是礦):構建系統生成期間

發生器表達式進行求值以 特定於每個構建配置產生的信息。

發生器表達式允許在許多目標屬性(如LINK_LIBRARIES,INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS等)的上下文中使用。當使用 命令來填充這些屬性時,也可以使用它們,例如 target_link_libraries(),target_include_directories(), target_compile_definitions()等。

換句話說,您不能使用$<TARGET_FILE:my_target>作爲get_dotapp_dir的參數。您必須傳遞一個包含可執行文件完整路徑的變量。

由於CMake 3,生成的目標的完整路徑是不可能檢索沒有這個生成器表達式。有關更多信息,請參閱CMP0026

所以只要您將此策略設置爲其默認值,您將無法計算可執行文件或父包的完整路徑。

You are not the first試圖解決這個問題。但根據「做什麼用這束路徑」,您可以嘗試以下解決方案:

  1. 設置CMP0026到OLD和使用位置屬性來獲取你的可執行文件的路徑,給予這個路徑get_dotapp_dir檢索相應的捆綁路徑。此解決方案絕對不是便攜式的,可能在將來停止工作,並且不建議...
  2. 如果您需要從自定義命令或自定義目標(在構建時)訪問您的包路徑,則可以使用腳本(python,php,bash,perl等)來計算從路徑到可執行文件的路徑。

目前,我們使用這樣的事情在一些項目:

add_custom_command(TARGET MyTarget POST_BUILD 
    COMMAND ${PYTHON_EXECUTABLE} -u MakeRelease.py $<TARGET_FILE:MyTarget> 
) 

不幸的是,檢索在此刻配置時束路徑沒有乾淨​​的方式...

+0

所以,當目標是捆綁包時,LOCATION綁定到'.app'目錄?我沒有真正嘗試它,因爲我猜想它返回了包內可執行文件的路徑。 – skypjack

+0

如果您的目標將屬性BUNDLE設置爲「true」,則可執行文件將以如下路徑構建:「 /MyTarget.app/Contents/MyTarget」 – Antwane

+0

當調用add_executable時,目標被標記爲「MACOSX_BUNDLE」 。我知道它在哪裏構建,我要問的是,如果這個目標的'LOCATION'屬性包含可執行文件的路徑或包的路徑,'$ '包含一個可執行文件。 – skypjack

相關問題