2014-02-10 47 views
1

我正在第一次使用cmake,並且我正在嘗試做一些簡單的事情。假設項目所需的某些依賴關係安裝在對庫不正常的目錄中,但用戶完全知道它們的位置。例如,我有一個我正在開發的項目,需要SFML,但我總是將所有的API和庫安裝在同一目錄c:/ dev中。這樣我的計算機周圍就沒有大量的圖書館。問題是我想cmake找到該庫,但find_module不會看到那裏,並不會找到它。我的問題是這個。如果有人把他們所有的API和庫放在一個不同的文件夾中,那麼無論如何,當他們通過git或者其他東西拉下我的項目並嘗試構建時,我可以只查詢一次該路徑的用戶?提示輸入和輸出到cmake文件

一步一步我想要這個。運行cmake,cmake會嘗試find_module獲取所需的依賴關係,如果失敗,它會詢問用戶是否知道並且他們鍵入了路徑。如果它仍然無法找到它,它就會失敗,如果它確實存在,它將該路徑存儲在某個文件中,以便後續對cmake的調用不會查詢它,並且我會爲每個依賴項執行此操作。這可能嗎?這在unix系統上從來都不是問題,但是對於Windows而言,這是一個真正的問題,因爲每個庫似乎都想安裝在不同的隨機位置。

回答

1

CMake不提供交互式對話框,所以您不能提示用戶輸入。通過圖形化的前端(ccmakecmake-gui),用戶可以手動將庫路徑輸入到正確的變量中,但這不是很方便,並且已經需要一些CMake知識和正在使用的查找腳本。

我個人發現使用環境變量是Windows上最舒適的解決方案。 CMake提供的大多數查找腳本已經支持這一點。您爲每個庫設置一個環境變量,指向該庫所在的路徑。您只需在每臺機器上執行一次此操作,然後就可以自動運行CMake。它仍然不如Linux上的默認路徑那樣舒適,但是它和Windows上的默認路徑一樣好。

您可以添加一些自定義的message輸出(例如「SFML could not be found - set the SFML_DIR environment variable to point to the correct location」),以使用戶更加明白他們必須做些什麼才能使其正確運行。

+0

我相信這會工作得很好。我不希望用戶必須以任何方式編輯CMakeList.txt,以便最終用戶不會推送可能會破壞它的更改,但如果您有一個位於奇怪位置的圖書館,我可以在某處放置特定說明,只需在cmake-gui中設置緩存的變量即可。我發現他們提供的FindSFML.cmake文件有一個變量,你可以爲這樣的事情設置一個變量SFML_ROOT,它很好地工作。謝謝一堆。 – FatalCatharsis