2010-07-09 91 views
16

問題:CMake能否生成不以任何方式使用CMake的構建腳本?如果不是,那麼如何去拼湊一個CMake生成的automake腳本來不對CMake進行任何檢查?CMake可以生成*不*使用cmake的構建腳本嗎?

我是CMake的忠實粉絲,我支持在當前工作環境中向我們過渡的想法。有一件事可以緩解從我們當前的構建系統到CMake的轉換,如果我能證明CMake可以生成自己不需要cmake的automake文件。顯然,我絕對不想這樣做,每天使用,但有能力輕鬆創建我們可以從源代碼構建的代碼分支,而不需要cmake,這將幫助我做出很大的貢獻案件。

+0

我覺得很奇怪,這裏的答案是「不」。我剛開始接觸cmake,我開始理解如何使用它(而不是試圖迫使它做一些它不是專門設計的),比如使用out-of-source構建等。但是我知道cmake與cpack捆綁在一起,它可以在Linux和類似系統上生成tarball。如果tarball需要cmake來構建,我不相信它是一個tarball。 – Steve314 2010-07-15 04:04:12

+0

我會仔細看看CPack;) – Voltaire 2010-07-15 20:43:47

+3

CPack生成的壓縮包通常不是用於構建的源代碼壓縮包,而是用於運行系統的二進制壓縮包。 – JesperE 2010-07-15 21:33:37

回答

5

不,CMake不能這樣做。它也沒有什麼意義,因爲在構建時沒有任何CMake支持,當CMakeLists.txt文件發生更改時,將無法自行檢查或更新makefiles/project-files。

如果您要從Visual Studio移動到CMake,您可能需要查看vcproj2cmake

+1

這實際上是一個「期望的」後果 - 我有興趣生成一個「準備分發」類型的構建的自動工具,其中make可用於構建沒有任何類型的cmake依賴項目的項目 - 此時,它可以如果更改沒有反映回CMake。 – Voltaire 2010-07-15 20:43:23

+5

這是一個CMake沒有解決的用例。 – JesperE 2010-07-15 21:34:34

2

作爲一個採取了大量複雜軟件並且最近取消了其現有構建系統的人,在其位置安裝了新的構建系統。我可以告訴你這並不容易,但是如果可以避免的話,我絕對不希望將shell腳本作爲構建過程的一部分。無論如何,越來越多的系統會發現自己擁有CMake,因爲像LLVM和KDE這樣的大型軟件包開始使用它 - 這是一個真正加入大型項目的領域。

關於CMake的好處之一是它可以更快地構建事物。假設必須通過fork外殼實例來解釋腳本,纔會減慢構建過程。

3

CMake生成的文件依賴於cmake的各種命令,如創建/刪除/等等......不僅僅是爲了重新生成makefiles,所以刪除cmake不會起作用。

+2

+1 CMake也可用作腳本語言(請參閱CMake手冊頁中的選項「-P」),許多項目使用CMake作爲shell腳本的替代品,用於諸如複製文件或調用幫助程序等。這些項目將在構建時需要CMake,而不僅僅是生成makefile。 – sleske 2012-05-16 08:05:58

-1

'原子解決方案'呢?

EX-自動生成的CMakeLists.txt了 「QT MOC」 文件,然後生成項目,取決於所產生的

# inside project level CMakeLists.txt 
# run shell script to create the "moc_GUICreator.cpp" auto-generated source file 
if(UNIX) 
execute_process(COMMAND "sh" ${CMAKE_CURRENT_SOURCE_DIR}/scripts/generate_moc.sh WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts) 
endif(UNIX) 

.cpp文件凡.SH文件包含:

# generate_moc.sh 
echo "generating moc file: moc ../include/GUICreator.h -o ../src/moc_GUICreator.cpp " 
moc ../include/GUICreator.h -o ../src/moc_GUICreator.cpp 

等效的Windows批處理文件, 「moc_creator_win.bat」:

moc "GUICreator.h" -o "moc_GUICreator.cpp" 

沒有嘗試過該L在Windows AST位,但它還是極爲類似應工作,只是在對的CMakeLists.txt如果(UNIX)塊之後:

if(WIN32) 
execute_process(COMMAND "cmd" ${CMAKE_CURRENT_SOURCE_DIR}/scripts/moc_creator_win.bat WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts) 
endif(WIN32) 

所以,基本上,如果你很聰明,你可以做任何你從想要腳本和使用CMake變量作爲參數,我不知道你是否可以要求更多...

的一點是要避免「不可移植的構建類型」,除非你真的需要它攻入一個專門的編譯器,或者不喜歡使用Qt Designer來放置小部件;-)

+0

我不確定這與原始問題有關。 – 2010-09-28 13:19:48

+0

您可以按照預期使用CMake,或者在光譜的另一端使用,只是將其包裝在任意腳本週圍。沒有什麼能阻止你分析cmake變量並生成你想要的任何makefile文件...... – 2010-10-03 20:24:32

4

的能力要做到這一點取決於你的操作系統,我假定Unix/Makefile或Winderz/MSVC。如果你使用的是MSVC,應該在你的cmake腳本開始時聲明CMAKE_SUPPRESS_REGENERATION選項來消除cmake依賴。

SET(CMAKE_SUPPRESS_REGENERATION TRUE) 

在基於Unix的系統,但是,Makefile文件tied明確地CMake的構建文件(CMakeFiles等)。我懷疑這種依賴性可能會被Makefile指令中的策略性評論繞過,儘管我不能說它們可能是什麼。