簡體   English   中英

"如何生成 CMakeLists.txt?"

[英]How to generate CMakeLists.txt?

我需要一些關於如何為 CMake 自動生成 CMakeLists.txt 文件的指針/建議。 有誰知道任何現有的發電機? 我檢查了CMake Wiki中列出的那些,但不幸的是它們不適合我。

我已經有一個基本的 Python 腳本,它遍歷我的項目的目錄結構並生成所需的文件,但它現在真的很“愚蠢”。 我想對其進行擴充以考慮到例如我正在構建的不同平台、我正在使用的編譯器\\交叉編譯器或我可能擁有的不同版本的庫依賴項。 我在 CMake 方面沒有太多\\專家經驗,我可以根據我的工作或已經工作的生成器提供一個示例,這可能會有很大幫助。

我認為您不需要使用自動腳本來生成CMakeLists.Txt,因為在您理解了基本過程之后編寫一個非常簡單的任務。 是的,我同意理解編寫CMake Wiki中給出的程序也很困難,因為它太詳細了。

這里顯示了一個顯示如何編寫CMakeLists.txt的基本示例,我認為這對每個人都有用,即使是第一次編寫CMakeLists.txt的人也是如此。

好吧,我也沒有很多Cmake的經驗,但要執行跨平台需要編寫和修改很多文件,包括CMakeLists.txt文件,我建議你使用這個名為ProjectGenerator Tool的新工具,非常酷,它可以完成所需的所有額外工作,並且可以輕松地為第三方源生成此類文件。 在使用之前,請仔細閱讀README。

鏈接: http//www.ogre3d.org/forums/viewtopic.php? f = 1& t = 54842

我認為你這樣做是顛倒的。

使用CMake時,您應該自己編寫CMakeLists.txt。 通常,您不需要處理不同的編譯器,因為CMake了解它們。 但是,如果必須,您可以在CMakeFiles中添加代碼,以根據您使用的工具執行不同的操作。

CLion是一個完全基於CMake項目文件的集成開發環境。

從源使用導入項目時,它能夠自己生成CMakeLists.txt文件

但是,您很可能需要在項目增長時手動編輯此文件並添加外部依賴項。

不確定這是否是原始海報所面臨的問題,但正如我在上面看到的“只寫CMakefile.txt”答案時,讓我簡要解釋為什么生成CMakefiles可能有意義:

a)我有另一個我非常滿意的構建系統

(其中包括大型多平台構建的大型互連共享和靜態庫,程序,腳本語言擴展和工具,具有各種內部和外部依賴關系,怪癖和變體)

b)即使我要替換它,我也不會考慮cmake。

我看了一下CMakefiles,我對語法不滿意,對語義不滿意。

c)CLion僅使用CMakefiles和Cmakefiles(看起來有點有趣)

所以,給CLion一個機會(我喜歡PyCharm,所以它很有吸引力),但是為了繼續使用我的構建系統,我很樂意使用一些工具來讓我實現make generate_cmake並且根據它動態生成所有必需的CMake文件。從我的構建系統中提取的當前信息。 我很樂意為工具/腳本提供我的應用程序所包含的源和頭文件的信息,它應該構建哪些庫和程序,-I,-L,-D等應該為哪個組件設置等等。等等

好吧,當然,如果JetBrains允許提供一些直接的協議來為IDE提供所需的信息(比如說,允許我提供自己的命令來編譯,運行和發出任何元數據,我當然會更高興)需要 - 我想他們主要需要incdirs並定義實現快速代碼分析,libpaths為調試器設置LD_LIBRARY_PATH),而不需要引用cmake。 協議的CMakefiles有點復雜。

也許這可能會有所幫助:

https://conan.io/

作者已經發表了一些關於cmake的演講,以及如何使用cmake創建模塊化項目到CPPCon。 據我所知,這個工具需要cmake,所以我想在集成新包或創建新包時生成它。 最近我讀到了一些關於如何使用YAML文件編寫C / C ++項目的更高級別描述的內容,但不確定它是否是conan的一部分(我讀到的是來自conan的作者)。 我從來沒有使用過,這對我來說是懸而未決的,所以,如果您使用它並滿足您的需求,請評論您對它的看法以及它如何適合您的情況。

我正在維護一個擁有1000多個模塊(共享,靜態庫,程序)的C ++軟件環境,並使用超過20個第三方(boost,openCV,Qt,Qwt ......)。 這個軟件環境包含許多程序(約50個),每個程序都會收集一些庫,程序和第三方。 我使用CMake生成makefile,這真的很棒。

但是,如果您按照建議編寫CMakeLists.txt (將模塊聲明為庫/程序,導入源文件,添加依賴項......)。 我同意celavek:維護那些CMakeLists.txt文件是一個真正的痛苦:

  • 向模塊添加新文件時,需要更新其CMakeLists.txt
  • 升級第三方時,需要使用它更新所有模塊的CMakeLists.txt
  • 當您添加新的依賴項(庫A現在需要庫B )時,您可能需要使用A更新所有程序的CMakeLists.txt
  • 如果要更改新的全局設置(編譯器設置,預定義變量,使用的C ++標准),則需要更新所有CMakeLists.txt

然后,我看到兩個策略來解決這些問題,可能是OP提到的問題。

1-讓CMakeLists.txt編寫得很好並且足夠聰明,不要讓凍結的行為自動更新 這就是我們在軟件環境中的作用。 每個模塊都有一個標准化的文件組織(源代碼位於src文件夾中,包括在inc文件夾中......)並且有簡單的文本文件來指定它們的依賴關系(我們定義了關鍵字,比如QT表示模塊需要與Qt鏈接) 。 然后,我們的CMakeLists.txt是一個雙行文件,只需調用我們編寫的cmake宏來自動設置模塊。 作為MCVE,它將是:

的CMakeLists.txt:

include( utl.cmake )
add_module( "mylib", lib )

utl.cmake:

macro( add_module name what )
    file(GLOB_RECURSE source_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
    if ( what STREQUEL "lib" )
        add_library( ${name} SHARED ${source_files} )
    elseif ( what STREQUEL "prg" )
        add_executable( ${name} ${source_files} )
    endif()
    # TODO: Parse the simple texts files to add target_link_libraries accordingly
endmacro()

然后,對於上面暴露的所有情況,你只需要更新utl.cmake,而不是你擁有的數千個CMakeLists.txt ......

老實說,我們對這種方法非常滿意,系統變得非常容易維護,我們可以輕松添加新的依賴項,升級第三方,更改一些構建/依賴策略......

但是,仍然有很多CMake腳本需要編寫。 CMake腳本語言很糟糕......這個工具非常強大,對,但是腳本的變量范圍,緩存,痛苦而且沒有很好記錄的語法(只是為了檢查列表是否為空,你必須要求它的大小並存儲這個在一個變量!),它不是面向對象的事實...使維護成為一個真正的痛苦。

所以,我現在確信真正好的方法可能是:

2-完全從Python等更強大的語言生成CMakeLists.txt Python腳本會做類似於我們的utl.cmake所做的事情,相反它會生成一個CMakeLists.txt准備傳遞CMake工具(使用HelloWorld中提出的格式,沒有變量,沒有函數....它只會調用標准CMake功能)。

我懷疑這種通用工具是否存在,因為很難生成讓每個人都開心的CMakeLists.txt文件,你必須自己編寫。 請注意, gen-cmake會這樣做 (生成一個CMakeLists.txt),但是它以非常原始的方式顯然只支持Linux,但它可能是一個很好的起點。

這可能是我們軟件環境的v2 ......總有一天。

我一直在尋找這樣的生成器,但最后我決定自己編寫(部分原因是我想了解 CMake 的工作原理):

https://github.com/Aenteas/cmake-generator

它有幾個附加功能,例如創建 python 包裝器 (SWIG)。

編寫適合每個人的生成器是不可能的,但我希望它能給你一個想法,以防你想制作你的定制版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM