xmake v2.2.2、C / C ++にパッケージの依存関係を持たせ、自動的にビルドする

序文

4か月以上後、xmakeはついに新しいバージョンv2.2.2を更新し強力な機能を開始しました。ネイティブにサポートされているリモート依存関係パッケージ管理です。

この機能については、実際に完成するまでの1年近く書きましたが、この機能の開発の進捗状況や歴史については、興味のある学生は関連する問題を参照してください:#69

現在の実装効果は次のとおりですが、セマンティックバージョンの依存関係の説明はまったく同じです。

完全に一貫したクロスプラットフォームビルド動作、ワンクリックxmakeコンパイル:

完全なプロジェクトの説明:

add_requires("tbox 1.6.*", "libpng ~1.16", "zlib")

target("test")
    set_kind("binary")
    add_files("src/*.c") 
    add_packages("tbox", "libpng", "zlib")

この関数の背景を簡単に紹介します。

C / C ++プログラムを作成する場合、各依存ライブラリのビルドシステムが異なり、コードプラットフォームのサポートの違いにより使用できないため、サードパーティの依存ライブラリの使用は常に困難な問題でした。他の高級言語と同じように。便利で使いやすいパッケージ管理サポート。

この問題を解決するためにhomebrewやvcpkgなどのパッケージ管理ツールがありますが、次のようないくつかの制限があります。

  1. homebrewはiphoneos、android、windowsプラットフォームをサポートしていません
  2. vcpkgは、セマンティックバージョン選択、マルチバージョン管理をサポートしていません
  3. また、プロジェクトの管理と建設をサポートしていません

現在のクロスプラットフォームビルドツールには、組み込みのパッケージ管理サポートfind_packageがありません。たとえば、cmakeはシステムパッケージの検索のみを提供します。vcpkgなどのサードパーティのパッケージ管理と組み合わせて使用​​できますが、I個人的にはあまり便利ではないと思います。
これにより、プロジェクトの他のユーザーは、コンパイル時にvcpkgをインストールするか、システムに依存ライブラリをインストールします。PCプラットフォームに適しています。iphoneos、android、およびその他のプラットフォームの依存ライブラリの場合、ユーザーはトスする必要があります。しばらくすると、 。

xmakeのアイデアは次のとおりです:真正的一致维护, 真正的一键编译

  • ビルド動作の一貫性:プロジェクトにライブラリの依存関係があるかツールの依存関係があるかに関係なく、xmakeコンパイルして渡すために必要なコマンドは1つだけです
  • プロジェクトメンテナンスの一貫性:プロジェクトがWindowsまたはLinux、iphone、Androidのどちらで使用されているかに関係なく、必要なのはxmake.luaメンテナンスプロジェクトのみです。

また、cmakeは追加のサードパーティIDEプロジェクトファイルを生成する必要があります。cmakelist.txtが同じであっても、ユーザーが構築と保守のエクスペリエンスの完全な一貫性を保証することは不可能です。結局のところ、それらは依然として次のようなツールによって制限されています。 vc / make。

現在サポートされている機能

  • セマンティックバージョンのサポート。例: "> = 1.1.0 <1.2"、 "〜1.6"、 "1.2.x"、 "1. *"
  • 公式パッケージ倉庫、自作プライベート倉庫、プロジェクトビルトイン倉庫などのマルチウェアハウス管理サポートを提供します。
  • クロスプラットフォームパッケージのコンパイルと統合のサポート(異なるプラットフォームと異なるアーキテクチャのパッケージを同時にインストールして、すぐに使用に切り替えることができます)
  • ソースコードのデバッグを実現するためのデバッグ依存パッケージのサポート

依存パッケージ処理メカニズム

ここでは、依存関係パッケージ全体の処理メカニズムを簡単に紹介します。

  1. 現在のシステムディレクトリおよびサードパーティのパッケージ管理に指定されたパッケージがあるかどうかを優先的に確認します。一致するパッケージがある場合は、ダウンロードしてインストールする必要はありません(もちろん、システムパッケージを使用しないように設定することもできます)。 )
  2. 対応するバージョンに一致するパッケージを取得してから、ダウンロード、コンパイル、およびインストールします(注:システムライブラリ環境に干渉しない特定のxmakeディレクトリにインストールしてください)。
  3. プロジェクトをコンパイルし、最後に有効な依存パッケージを自動的にリンクします

すぐに始めましょう

tboxライブラリに依存する空のプロジェクトを作成します。

$ xmake create -t console_tbox test
$ cd test

コンパイルを実行するだけです。tboxライブラリが現在インストールされていない場合は、自動的にダウンロードされ、インストールされて使用されます。

$ xmake

コンパイルのためにiphoneosプラットフォームに切り替えると、iphoneosバージョンのtboxライブラリがリンク用に再インストールされます。

$ xmake f -p iphoneos
$ xmake

Androidプラットフォームarm64-v8aアーキテクチャのコンパイルに切り替えます。

$ xmake f -p android [--ndk=~/android-ndk-r16b]
$ xmake

セマンティックバージョン設定

xmakeの依存関係パッケージ管理は、セマンティックバージョンの選択を完全にサポートします(例: "〜1.6.1")。セマンティックバージョンの詳細については、http://semver.org/を参照してください。

いくつかのセマンティックバージョンの記述:

add_requires("tbox 1.6.*", "pcre 1.3.x", "libpng ^1.18")
add_requires("libpng ~1.16", "zlib 1.1.2 || >=1.2.11 <1.3.0")

現在、xmakeで使用されているセマンティックバージョンパーサーは、uaelによって提供されsvライブラリです。バージョンの説明の詳細な説明もあります。以下を参照できます。バージョンの説明

もちろん、現在の依存関係パッケージのバージョンに特別な要件がない場合は、次のように直接記述できます。

add_requires("tbox", "libpng", "zlib")

これは、パッケージの最新の既知のバージョン、またはマスターブランチのソースコードからコンパイルされたパッケージを使用します。現在のパッケージにgitリポジトリアドレスがある場合は、特定のブランチバージョンを指定することもできます。

add_requires("tbox master")
add_requires("tbox dev")

追加のパッケージ情報設定

オプションのパッケージ設定

指定された依存パッケージが現在のプラットフォームでサポートされていない場合、またはコンパイルとインストールが失敗した場合、xmakeはエラーをコンパイルします。これは、特定のパッケージに依存して動作する必要がある一部のプロジェクトにとって妥当です。
ただし、一部のパッケージがオプションの依存関係であり、コンパイルして通常どおりに使用できる場合は、オプションのパッケージとして設定できます。

add_requires("tbox", {optional = true})

システムライブラリを無効にする

デフォルト設定では、xmakeは最初にシステムライブラリが存在するかどうかを確認します(バージョン要件が設定されていない場合)。ユーザーがシステムライブラリとサードパーティのパッケージ管理によって提供されるライブラリをまったく使用したくない場合は、あなたが設定することができます:

add_requires("tbox", {system = false})

パッケージのデバッグバージョンを使用する

依存パッケージを同時にデバッグする場合は、パッケージのデバッグバージョンを使用するように設定できます(もちろん、このパッケージがデバッグコンパイルをサポートしていることが前提です)。

add_requires("tbox", {debug = true})

現在のパッケージがデバッグコンパイルをサポートしていない場合は、次のように、ウェアハウス内のコンパイルルールに変更を送信してデバッグをサポートできます。

package("openssl")
    on_install("linux", "macosx", function (package)
        os.vrun("./config %s --prefix=\"%s\"", package:debug() and "--debug" or "", package:installdir())
        os.vrun("make -j4")
        os.vrun("make install")
    end)

追加のコンパイル情報をパッケージに渡します

一部のパッケージには、コンパイル中にさまざまなコンパイルオプションがあり、それらを渡すこともできます。もちろん、パッケージ自体が以下をサポートしている必要があります。

add_requires("tbox", {config = {small=true}})

これ--small=trueをtboxパッケージに渡して、コンパイルおよびインストールされたtboxパッケージがこのオプションで有効になるようにします。

自作のプライベートパッケージ倉庫を使用する

必要なパッケージが公式リポジトリxmake-repoない場合は、提供されたコードをリポジトリに送信してサポートを受けることができます。
ただし、一部のパッケージが個人プロジェクトまたはプライベートプロジェクトにのみ使用される場合は、プライベートウェアハウスリポジトリを作成できます。ウェアハウスの組織構造は、xmake-repoを参照できます。

たとえば、プライベートウェアハウスリポジトリがあります。[email protected]:myrepo/xmake-repo.git

次のコマンドでウェアハウスを追加できます。

$ xmake repo --add myrepo [email protected]:myrepo/xmake-repo.git

または、xmake.luaに直接書き込むこともできます。

add_repositories("my-repo [email protected]:myrepo/xmake-repo.git")

1つまたは2つのプライベートパッケージを追加するだけの場合、現時点でgitリポジトリを作成するのは簡単ではありません。たとえば、パッケージウェアハウスをプロジェクトに直接配置できます。

projectdir
  - myrepo
    - packages
      - t/tbox/xmake.lua
      - z/zlib/xmake.lua
  - src
    - main.c
  - xmake.lua

上記のmyrepoディレクトリは、プロジェクトに組み込まれた独自のプライベートパッケージウェアハウスであり、xmake.luaにウェアハウスの場所を追加します。

add_repositories("my-repo myrepo")

これは、プライベートウェアハウスが組み込まれているベンチボックスプロジェクトを指す場合があります。

ウェアハウスを構築しなくても、プロジェクトxmake.luaでパッケージの説明を直接定義することもできます。これは、次のように1つまたは2つのパッケージに依存する状況で役立ちます。

package("libjpeg")

    set_urls("http://www.ijg.org/files/jpegsrc.$(version).tar.gz")

    add_versions("v9c", "650250979303a649e21f87b5ccd02672af1ea6954b911342ea491f351ceb7122")

    on_install("windows", function (package)
        os.mv("jconfig.vc", "jconfig.h")
        os.vrun("nmake -f makefile.vc")
        os.cp("*.h", package:installdir("include"))
        os.cp("libjpeg.lib", package:installdir("lib"))
    end)

    on_install("macosx", "linux", function (package)
        import("package.tools.autoconf").install(package)
    end)

package_end()

add_requires("libjpeg")

target("test")
    set_kind("binary")
    add_files("src/*.c") 
    add_packages("libjpeg")

パッケージ管理コマンドの使用法

パッケージ管理コマンド$ xmake requireを使用して、パッケージ情報のダウンロード、コンパイル、インストール、アンインストール、取得、および表示を手動で表示できます。

指定されたパッケージをインストールします

$ xmake require tbox

指定されたバージョンのパッケージをインストールします。

$ xmake require tbox "~1.6"

強制的にダウンロードして再インストールし、詳細なインストール情報を表示します。

$ xmake require -f -v tbox "1.5.x"

追加の設定情報を渡します。

$ xmake require --extra="debug=true,config={small=true}" tbox

デバッグパッケージをインストールしsmall=true、コンパイルされた構成情報をパッケージに渡します。

指定されたパッケージをアンインストールします

$ xmake require --uninstall tbox

これにより、パッケージファイルが完全にアンインストールおよび削除されます。

指定されたパッケージを削除します

リンク解除された指定パッケージのみが現在のプロジェクトで検出されませんが、パッケージはローカルに存在し、再インストールするとすぐに完了します。

$ xmake require --unlink tbox

パッケージの詳細を表示

$ xmake require --info tbox

現在の倉庫でパッケージを検索する

$ xmake require --search tbox

これは、あいまい検索とluaパターンマッチング検索をサポートするためのものです。

$ xmake require --search pcr

Pcre、pcre2およびその他のパッケージが同時に検索されます。

現在インストールされているパッケージを一覧表示する

$ xmake require --list

倉庫管理コマンドの使用法

上で簡単に述べたように、プライベートウェアハウスの追加を使用できます(ローカルパスの追加をサポートします)。

$ xmake repo --add myrepo [email protected]:myrepo/xmake-repo.git

インストールされている倉庫を削除することもできます。

$ xmake repo --remove myrepo

または、追加されたすべての倉庫を表示します。

$ xmake repo --list

リモートウェアハウスが更新された場合は、ウェアハウスの更新を手動で実行して、より多くの最新のパッケージを取得できます。

$ xmake repo -u

パッケージを公式倉庫に提出する

現在、この機能は完了したばかりで、公式ウェアハウスには多くのパッケージがありません。一部のパッケージは一部のプラットフォームをサポートしていない可能性がありますが、これは大きな問題ではありません。後でいくつかのバージョンを繰り返した後、拡張を続け、パッケージ倉庫を改善します。

必要なパッケージが現在の公式リポジトリに含まれていない場合は、問題を送信するか、ローカルで調整して公式リポジトリに投稿を送信できます:xmake-repo

貢献の詳細な説明については、CONTRIBUTING.mdを参照してください。

リモート依存関係パッケージの詳細については、公式ドキュメント「リモート依存関係モード」を参照してください。

実際、xmakeのパッケージ管理は3世代を経ており、v1.0とv2.0の最初の2つのバージョンは、ローカルパッケージ管理モードとシステムライブラリ検索モードです。これら2つは、場合によっては非常に便利です。
2つの導入については、ここではあまり説明しません。ドキュメントの説明を読むことができます:依存パッケージ管理

結論

そうは言っても、最後に、新しいバージョンによって提供される他のいくつかの新機能と更新を見てみましょう。

その他の新機能

  • fasmアセンブラのサポートが追加されました
  • has_configget_configおよびis_configインターフェイスを追加してオプションと構成の値をすばやく決定します
  • set_configデフォルト設定を設定するためのインターフェースを追加
  • 追加$xmake --tryしてプロジェクトのビルドを試みます
  • 追加set_enabled(false)して無効なターゲットを表示します
  • #69:リモート依存関係パッケージ管理を追加します。add_requires("tbox ~1.6.1")
  • #216:WindowsMFCコンパイルルールを追加

改善する

  • Qtコンパイル環境の検出を改善し、mingwsdkのサポートを追加します
  • 自動スキャンによって生成されたxmake.luaにデフォルトのデバッグ/リリースルールを追加します
  • #178:mingwプラットフォームでターゲット名を変更する
  • add_files()Windowsで大文字と小文字を区別しないパスパターンマッチングをサポートするため
  • detect.sdks.find_qtQtルートディレクトリの検出を改善します
  • #184lib.detect.find_packagevcpkgのサポートを改善
  • #208:ダイナミックライブラリに対するrpathのサポートを改善

修正されたバグ

  • #177:依存するダイナミックライブラリターゲットを修正しました。ベース名が設定されている場合、リンクが失敗します
  • $xmake f --menu終了の問題とCPUが高すぎる問題を修復します
  • #197:生成されたvs201xプロジェクトファイルが中国語のパスを文字化けさせる問題を修正
  • WDKルールのコンパイルによって生成されたドライバーがWin7で実行されるときのブルースクリーンの問題を修正します
  • #205:vcprojプロジェクトがtargetdirを生成するときにtargetdirとobjectdirのパス設定が一致しない問題を修正

元のソース:http//tboox.org/cn/2018/10/13/xmake-update-v2.2.2-package-deps/

おすすめ

転載: blog.csdn.net/waruqi/article/details/83104603