4

SCons に必要な git リポジトリをチェックアウトさせようとしています (そして、できればそのリポジトリを最新の状態に保ちます)。問題は、ビルドで使用するために git リポジトリに含まれるファイルを指定する必要があることです。そうすると、SCons はクローンを作成する前にリポジトリを作成します。

たとえば、GStreamer のクローンを作成し、create-uninstalled-setup.shスクリプトを使用するとします (これは私が実際に行っていることではありませんが、同じ問題が発生するはるかに単純で高速なスクリプトです)。

Command(['gstreamer/.git', 'gstreamer/scripts/create-uninstalled-setup.sh'],
    None, 'git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer')
Command('~/gst/git', 'gstreamer/scripts/create-uninstalled-setup.sh',
    'gstreamer/scripts/create-uninstalled-setup.sh')

ただし、SCons は gstreamer のクローンを作成する前に gstreamer/scripts を作成するため、失敗します。

$ scons scons: SConscript ファイルを読み込んで
います ...
scons: SConscript ファイルを読み終えました。
scons: ターゲットをビルドしています ...
git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer
致命的: 宛先パス 'gstreamer' は既に存在し、空のディレクトリではありません。
scons: *** [gstreamer/.git] エラー 128
scons: エラーのためビルドが終了しました。
$ ls gstreamer/
スクリプト

最初のコマンドに「gstreamer」フォルダーを作成するように指示すると、依存関係サイクルが作成されます。

Command(['gstreamer', 'gstreamer/scripts/create-uninstalled-setup.sh'],
    None, 'git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer')
Command('~/gst/git', 'gstreamer/scripts/create-uninstalled-setup.sh',
    'gstreamer/scripts/create-uninstalled-setup.sh')

$ scons scons: SConscript ファイルを読み込んで
います ...
scons: SConscript ファイルを読み終えました。
scons: ターゲットを構築しています ...
scons: ターゲットを構築しました。

scons: *** 依存関係サイクルが見つかりました:
gstreamer/scripts -> gstreamer/scripts/create-uninstalled-setup.sh -> gstreamer/scripts
gstreamer/scripts/create-uninstalled-setup.sh -> gstreamer/scripts - > gstreamer/scripts> /create-uninstalled-setup.sh

ファイル「/usr/lib/scons/SCons/Taskmaster.py」、1019 行目、クリーンアップ中

「create-uninstalled-setup.sh」を作成することを最初のコマンドに伝えないと、存在しないため混乱します。

Command(['gstreamer'],
    None, 'git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer')
Command('~/gst/git', 'gstreamer/scripts/create-uninstalled-setup.sh',
    'gstreamer/scripts/create-uninstalled-setup.sh')

$ scons scons: SConscript ファイルを読み込んで
います ...
scons: SConscript ファイルを読み終えました。
scons: ターゲットをビルドしています ...
scons: *** [~/gst/git] ソース `gstreamer/scripts/create-uninstalled-setup.sh' が見つかりません。ターゲット `~/gst/git' で必要です。
scons: エラーのためビルドが終了しました。

回避策として、クローンを作成する前にフォルダーを作成できrm -rfますが、それは明らかに理想的ではありません。

Command(['gstreamer/.git', 'gstreamer/scripts/create-uninstalled-setup.sh'], None,
    'rm -rf gstreamer && git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer')
Command('~/gst/git', 'gstreamer/scripts/create-uninstalled-setup.sh',
    'gstreamer/scripts/create-uninstalled-setup.sh')

これを処理するより良い方法はありますか?

4

2 に答える 2

3

ディレクトリが実際に空であることを伝える方法はなくgit(空のサブディレクトリがあっても)、サブディレクトリを自動作成しないように指示する方法がわからないため、独自の依存関係チェックを作成して関数SConsで呼び出すことができますこれは、次のように、組み込みの依存関係チェックが実行される前に実行されます。git cloneSCons Execute()SCons

import os.path

setup_file = 'gstreamer/scripts/create-uninstalled-setup.sh'
if not os.path.exists(setup_file)
    Execute('git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer')

Command('~/gst/git', setup_file, setup_file)
于 2013-08-04T19:35:32.587 に答える
-1

何が起こり、問題と思われるのは、ターゲットを構築する準備中に、ディレクトリが存在しない場合、それまでのすべてのディレクトリが作成されることです。これは、ディレクトリを作成するだけでデフォルトで行われるディレクトリノードを構築することによって行われるようです。

つまり、最初の試行では、gstreamerディレクトリを作成するだけでディレクトリが作成されます。2 回目の試行が失敗した理由は、私にはよくわかりません。3 つ目は、構築するルールがないためですgstreamer/scripts/create-uninstalled-setup.sh

gstreamer解決策は、ディレクトリを構築するルールを定義することです。

Command(Dir("gstreamer"), [], "git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer")

次に作成するルールgstreamer/scripts/create-uninstalled-setup.sh。理想的には上記のルールに含めたいのですが、うまくいかないようです。ただし、gstreamerディレクトリが上記のルールによって作成されているときに作成されるため、ダミーのルールのみが必要です (依存関係はなく、それ以上のアクションはありません。ビルドの準備が機能します)。

Command("gstreamer/scripts/create-uninstalled-setup.sh", [], [])

このアプローチの欠点は、git で見つかったすべてのソースがsconsこれらについて明示的に伝える必要があることです。少なくとも、これを自動的に行う方法は見つかりませんでした。これが問題である場合は、SConstructファイルが読み取られているときに git のクローンを作成する必要があります (つまりExecute、Brady の回答のように関数を使用します)。

于 2015-11-09T08:53:15.620 に答える