私は現在、ホストOSとしてWindowsとクロスコンパイルするためにSConsをセットアップしています。クロスコンパイラーのカスタムEnvironment
を作成していますが、SConsは、起動するたびにVisual Studioを探すように要求します(インストールされていないため、Visual Studioが見つからないという警告を出力します)。使用しないことがわかっている標準ツールを探すのを防ぐことはできますか?
3 に答える
これを行うには少なくとも2つの方法があります。最初の方法が最も簡単です。次のように、コンパイラーを指定して環境を作成してみてください。
env = Environment(CC = '/path/to/the/compiler')
おそらく、リンカーやその他のツールのパスも追加する必要があります。その後、SConsはそれらを検索するべきではありません。
これを行う別の方法は、 SConsのマニュアルページのCONFIGURATION FILE REFERENCEセクションで説明されているように、関数のtools
引数を使用してクロスコンパイラのツール定義を作成することです。Environment()
さらに、環境を初期化するための特定のツールセットを、オプションのキーワード引数として指定できます。
env = Environment(tools = ['msvc', 'lex'])
非組み込みツールは、toolpath引数を使用して指定できます。
env = Environment(tools = ['default', 'foo'], toolpath = ['tools'])
..。
ツールリストの個々の要素は、それ自体がフォーム(toolname、kw_dict)の2要素リストである場合もあります。SConsは、上記のようにツール名指定ファイルを検索し、ツールの生成関数へのキーワード引数として、辞書である必要があるkw_dictを渡します。生成関数は、引数を使用して、さまざまな方法で環境を設定するか、その他の方法で初期化を変更することにより、ツールの動作を変更できます。
tools / my_tool.py:
def generate(env, **kw):
# Sets MY_TOOL to the value of keyword argument 'arg1' or 1.
env['MY_TOOL'] = kw.get('arg1', '1')
def exists(env):
return 1
SConstruct:
env = Environment(tools = ['default', ('my_tool', {'arg1': 'abc'})],
toolpath=['tools'])
このような警告を抑制できます
env.SetOption('warn', 'no-visual-c-missing')
たとえば、ARM Cortex-Mマイクロコントローラー用にクロスコンパイルするには、これを実行しています
cross = 'arm-none-eabi-'
toolchain = {
'CC': cross + 'gcc',
'CXX': cross + 'g++',
'AR': cross + 'ar',
'AS': cross + 'gcc',
'OBJCOPY': cross + 'objcopy',
'SIZE': cross + 'size',
'PROGSUFFIX': '.elf',
}
env = Environment(tools=('gcc', 'g++', 'gnulink', 'ar', 'as'), ENV=os.environ)
env.SetOption('warn', 'no-visual-c-missing')
env.Replace(**toolchain)
を定義する代わりに、 DefaultEnvironmentを再定義することを検討してくださいEnvironment
。
プログラムやライブラリなど、これまでに紹介したすべてのBuilder関数は、実際には、SConsがデフォルトで構成する、またはシステム上で認識して検出したさまざまなコンパイラやその他のツールの設定を含むデフォルトの構築環境を使用します。 。デフォルトの構築環境の目標は、構成の変更を最小限に抑えて、すぐに利用できるツールを使用してソフトウェアを構築するために、多くの構成を「正しく機能」させることです。
このように、SConsは一般的な使用法に基づいて予測を行い、それらをプロジェクトに適用しようとはしません。例えば:
PATH = {'PATH' : ['C:/cygwin/bin']}
env = Environment(ENV=PATH)
env.Program('helloworld.c++')
は、最も可能性の高いケースであると考えられるものに基づいて仮定を行い、PATHで検出されたものに頼る前に、VisualStudioを検出しようとします。
PATH = {'PATH' : ['C:/cygwin/bin']}
env = DefaultEnvironment(ENV=PATH)
env.Program('helloworld.c++')
そのような仮定は行わず、 Visual Studioを探すことなく、PATHで見つかったものに直接移動します。