web-dev-qa-db-ja.com

CMakeLists.txtを生成する方法は?

CMakeのCMakeLists.txtファイルを自動的に生成する方法についてのポインター/アドバイスが必要です。誰もが既存の発電機を知っていますか? CMake Wiki にリストされているものをチェックしましたが、残念ながらそれらは私には適していません。

私はすでにプロジェクトのディレクトリ構造を横断し、必要なファイルを生成する基本的なPythonスクリプトを持っていますが、今は本当に「ダム」です。私が構築しているプラ​​ットフォーム、使用しているコンパイラ\クロスコンパイラ、または依存している可能性のあるライブラリの異なるバージョン.CMakeの経験はあまりありません。動作中のジェネレーターは非常に役立ちます。

47
celavek

基本的な手順を理解した後、CMakeLists.Txtを生成するのは非常に簡単なタスクなので、CMakeLists.Txtを生成するために自動スクリプトを使用する必要はないと考えています。ええ、CMake Wikiで説明されている手順を理解することも、詳細すぎるため理解が難しいことに同意します。

書く方法を示す非常に基本的な例CMakeLists.txtが示されています here 、これは誰にとっても役立つと思いますが、 CMakeLists.txtを初めて作成する人でも。

24
Preeti Kaur

まあ私はCmakeで多くの経験を持っていませんが、クロスプラットフォームを実行するには、CMakeLists.txtファイルを含む多くのファイルを作成して変更する必要があります.ProjectGeneratorツールと呼ばれるこの新しいツールを使用することをお勧めしますかなりクールで、必要な追加作業がすべて実行され、簡単な方法でサードパーティのソース用のそのようなファイルを生成できます。使用する前にREADME=を注意深く読んでください。

リンク: http://www.ogre3d.org/forums/viewtopic.php?f=1&t=54842

11
wOlVeRiNe

あなたはこれを逆さまにしていると思います。

CMakeを使用する場合、CMakeLists.txtを自分で作成する必要があります。通常、CMakeはそれらについての知識を持っているため、さまざまなコンパイラを処理する必要はありません。ただし、必要な場合は、CMakeFilesにコードを追加して、使用しているツールに応じて異なる処理を実行できます。

10
Lindydancer

CLion は、CMakeプロジェクトファイルに完全に基づいた統合開発環境です。

ソースからimportプロジェクトを使用する場合、CMakeLists.txtファイルを生成することができます

ただし、プロジェクトが成長するにつれて、外部依存関係を追加するために、このファイルを手動で編集する必要がある可能性が非常に高くなります。

5
nicolas-f

たぶんこれは役に立つかもしれません:

https://conan.io/

著者はcmakeについてのスピーチと、Cmakeを使用してCPPConにモジュラープロジェクトを作成する方法について説明しました。私の知る限り、このツールにはcmakeが必要です。そのため、新しいパッケージを統合するか、新しいパッケージを作成するときに、このツールを生成すると思います。最近、YAMLファイルを使用してC/C++プロジェクトのより高いレベルの説明を記述する方法について読みましたが、それがコナンの一部であるかどうかはわかりません(私が読んだのはコナンの著者からでした)。私は一度も使用したことはありません。それは私にとって保留中のものです。したがって、使用してニーズに合っている場合は、それについての意見やシナリオに合った意見をコメントしてください。

私は1000以上のモジュール(共有、静的ライブラリ、プログラム)を持ち、20以上のサードパーティ(boost、openCV、Qt、Qwt ...)を使用するC++ソフトウェア環境を維持しています。このソフトウェア環境は多くのプログラム(〜50)をホストし、それぞれがいくつかのライブラリ、プログラム、およびサードパーティを取得します。私はCMakeを使用してメイクファイルを生成しますが、これは本当に素晴らしいことです。

ただし、CMakeLists.txtを推奨どおりに記述した場合(モジュールをライブラリ/プログラムとして宣言し、ソースファイルをインポートし、依存関係を追加します...)。私はcelavekに同意します。これらのCMakeLists.txtファイルを維持するのは本当に大変です

  • モジュールに新しいファイルを追加するとき、CMakeLists.txtを更新する必要があります
  • サードパーティをアップグレードするとき、それを使用するすべてのモジュールのCMakeLists.txtを更新する必要があります
  • 新しい依存関係を追加する場合(ライブラリAにはライブラリBが必要になりました)、Aを使用してすべてのプログラムのCMakeLists.txtを更新する必要がある場合があります
  • 新しいグローバル設定(コンパイラー設定、事前定義変数、C++標準使用)を変更する場合は、CMakeLists.txtをすべて更新する必要があります

次に、これらの問題を解決するための2つの戦略と、OPが言及した戦略を考えます。

1- CMakeLists.txtを適切に作成し、凍結された動作をその場で更新しないように十分にスマートにしてください。それがソフトウェア環境にあるものです。各モジュールには標準化されたファイル構成があり(ソースはsrcフォルダーにあり、インクルードはincフォルダーにあります...)、依存関係を指定する単純なテキストファイルがあります(定義したキーワードはQTは、モジュールがQtとリンクする必要があると言います。次に、CMakeLists.txtは2行のファイルであり、モジュールを自動的にセットアップするために作成した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()

次に、上記のすべての状況で、数千のCMakeLists.txtではなく、utl.cmakeを更新するだけです...

正直なところ、このアプローチには非常に満足しています。システムのメンテナンスが非常に簡単になり、新しい依存関係を簡単に追加したり、サードパーティをアップグレードしたり、ビルド/依存関係の戦略を変更したりできます...

ただし、多くのCMakeスクリプトを作成する必要があります。そしてCMakeスクリプト言語は...ツールの非常に強力で正しいが、スクリプトの変数スコープ、キャッシュ、苦痛であまり文書化されていない構文(リストが空かどうかを確認するために、それを尋ねる必要がある)これを変数にサイズ設定して保存してください!)、それがオブジェクト指向ではないという事実...それを維持するのは本当に苦痛です。

だから、私は今、本当の良いアプローチは次のものであると確信しています:

2- Pythonのようなより強力な言語からCMakeLists.txtを完全に生成します。 Pythonスクリプトは、utl.cmakeが行うことと同様のことを行い、代わりにCMakeLists.txtを渡す準備ができたCMakeツールを生成します(HelloWorldで提案された形式で、変数、関数なし...標準のCMake関数のみを呼び出します)。

誰もが幸せになるCMakeLists.txtファイルを作成するのは難しいので、そのような一般的なツールが存在することを疑います。自分で作成する必要があります。 gen-cmake はそれを行います(CMakeLists.txtを生成します)が、非常に原始的な方法で、明らかにLinuxのみをサポートしていることに注意してください。

これは、私たちのソフトウェア環境のv2である可能性があります...ある日。

0
jpo38

これが元のポスターが直面している問題であるかどうかはわかりませんが、上記の「ちょうどCMakefile.txtを書いてください」という回答がたくさんあるので、CMakefileの生成が理にかなっている理由を簡単に説明しましょう。

a)別のビルドシステムがあり、かなり満足しています

(また、相互接続された共有および静的ライブラリ、プログラム、スクリプト言語拡張機能、およびツールのさまざまな内部および外部の依存関係、癖およびバリアントの大きなコレクションの大規模なマルチプラットフォームビルドをカバーします)

b)たとえそれを交換したとしても、私はcmakeを考慮しません。

CMakefilesを見てみましたが、構文に満足しておらず、セマンティクスにも満足していません。

c)CLionはCMakefilesとCmakefilesのみを使用します(ややおもしろそうです)

だから、CLionにチャンスを与えるために(私はPyCharmが大好きなので、魅力的です)、ビルドシステムを使い続けるには、喜んでmake generate_cmakeを実装し、必要に応じてすべての必要なCMakefileを生成できるツールを使用しますビルドシステムから抽出された現在の情報。アプリがどのソースとヘッダーを構成するか、どのライブラリとプログラムを構築するか、どの-I、-L、-Dなどをどのコンポーネントなどに設定するかについての情報をツール/スクリプトに喜んで提供できます等.

もちろん、もしJetBrainsがIDEに必要な情報を提供する直接的なプロトコルを提供できるなら、私はもっと幸せになるでしょう(たとえば、私自身のコマンドを提供することができますコンパイル、実行、および実際に必要なメタデータの発行-主にincdirと定義を必要とし、オンザフライコード分析、およびlibpathsを使用してLD_LIBRARY_PATHをデバッガーに設定します)。cmakeを参照しません。やや複雑。

0
Mekk