web-dev-qa-db-ja.com

ビルドシステムを作成する正しい方法は何ですか?

私は学生で、構築プロセスにあまり経験がありません。ここ数日、CMakeやその他のシステムジェネレーターのビルドについて読んだことがありますが、それ以外はこの世界については何も知りません。

プロジェクトでサードパーティのライブラリを使用したかったので、このトピックについて何かを学ぶ必要があることに気付きました。特に、電報データベースライブラリ( https://github.com/tdlib/td )を試したかったので、インストール手順(Windowsを使用していて、c ++で記述しています)を実行した後、次に何をすべきかを正確に知らずにフォルダを取得しました。 Cmakeについて少し学んだ後、私はなんとかしてlib、include、binフォルダーを取得し、プロジェクトにコピーしてすべてをビルドしました。

これは外部ライブラリをプロジェクトに統合するための標準的なプロセスですか?本当にすべてのサードパーティライブラリを個別にインストールしてから、それらを単一のプロジェクトに統合する必要がありますか?

私が考えることができる他の解決策は、プロジェクトに外部ライブラリのソースコードを含め、すべてのライブラリのCMakeLists.txtファイルに到達することを処理する最上位のCMakeLists.txtファイルを用意することです。この問題は、たとえば、一部のサードパーティライブラリがソースコードを提供していないことです。

一方、最初の解決策は少し見苦しいです:外部ライブラリ(たとえば電報データベースライブラリ)が他の外部ライブラリ(この場合はzlib、openssl ...)に依存している場合はどうなりますか? CMakeLists.txtファイルがない場合、特定のライブラリを別の特定のライブラリにリンクする必要があることを事前に知るにはどうすればよいですか?

すべての依存関係を処理するスクリプトを手動で記述せずにビルドシステムを管理する別の方法/別のツールはありますか?

5

免責事項:私はCMakeについてほとんど何も知りません。したがって、私の答えは、CMakeではなく、一般的なビルドシステムについてです。

ビルドの目標は、ソースコードを取得して、展開または出荷できる状態の何かを作成することです。これは2つのことを意味します。

  • マシンには理想的には前提条件はないはずです。つまり、新しくインストールしたOSでビルドを実行できるはずです。

  • 以前のバージョンのシステムをいつでも再構築できるはずです。

つまり、依存関係に関しては、

  • 依存関係はどこかから自動的に取得され、インストールされます。ソースは事実上何でもかまいません。たとえば、Pythonは pypi パッケージインデックスを使用し、.NETは NuGet を使用しますが、Node.jsは npm を使用します、ただしGitHubから直接パッケージをインストールすることもできます。apt-getおよびyumは、パッケージ管理の他の2つの優れた例です。アプリケーションをインストールすると、その依存関係が自動的にインストールされます。ほとんどの場合、個人(または企業)プロジェクトを依存関係として使用するために、独自のインデックスを持つことができます。

  • パッケージインデックスは、最新のものだけでなく、公開されているすべてのバージョンへのアクセスを提供する必要があります。

これは理論的にはすべて問題ありませんが、実際に適切に行うことは非常に困難です。

  • 依存関係はどこで停止しますか?オペレーティングシステム自体は依存関係ですか?設定はどうですか? API秘密鍵? API自体?ビルドで実行できないこと(たとえば、ハードウェアを変更すること)や実行が予期されていないこと(オペレーティングシステムが再インストールされてすべてのデータが消去されて満足できない場合)はたくさんあります。 )

  • 古いバージョンのライブラリの一部を削除するために、使用するライブラリの作成者が必要になる場合があります。多くの場合、作成者は公開されたライブラリの知的財産を保持しており、ユーザーの許可なしにライブラリ全体を削除できます。

本当にすべてのサードパーティライブラリを個別にインストールしてから、それらを単一のプロジェクトに統合する必要がありますか?

いいえ、必要ありません。 CMakeの場合、 find_package を使用する必要があるようです。 pypiやnpmと同様のパッケージインデックスに関しては、状況はさらに複雑になります。私がそれを正しく理解していれば、インターネットから依存関係を取得するのはCMakeの仕事ではありません。むしろ、C++パッケージマネージャーを使用する必要があります。 それらの大きな選択肢 があります。

CMakeとGitを使用したC++の簡単な依存関係管理 も関連している可能性があり、記事の冒頭にあるredditのスクリーンショットは非常にわかりやすいようです。

これの問題は、たとえば、一部のサードパーティライブラリがソースコードを提供しないことです。

ヘッダーファイルとシステムと互換性のあるバイナリのみを提供する場合は、それで十分です。そうは言っても、ソースコードと依存関係のCMakeLists.txtがあると、作業がはるかに簡単になります。

CMakeLists.txtファイルがない場合、特定のライブラリを別の特定のライブラリにリンクする必要があることを事前に知るにはどうすればよいですか?

Apt-get、pypi、npm、またはNuGetパッケージの問題は、すべてのパッケージに依存関係のリストを同梱することで解決されます。したがって、依存関係を使用する独自のアプリをビルドすると、ビルドプロセスは、依存関係の依存関係など、すべての依存関係ツリーを調べます。

私が理解しているように、C++ライブラリはapt-get/yumパッケージとして出荷するか、独自のCMakeLists.txtファイルを提供する必要があります。どちらも行わない場合は、ライブラリが十分に成熟していないことを示している可能性があります。

3