2016-07-25 7 views
0

内のすべてのオブジェクトの依存関係を追加します。SConsは私はこの<code>SConstruct</code>ファイル持っているライブラリ

lib=Library("foo", "foo.c", CPPFLAGS="-include foo.h") 

ための-includeを、私はいつでもfoo.h変更を再コンパイルする必要があります。 SConsはこれを自動的に把握しません。

私はdependecyを追加しようとしました - Depends(lib, "foo.h") - しかし、それは無用な再リンクを引き起こすだけです。

foo.hが変更された場合、foo.cを再コンパイルする方法を教えてください。

私が本当に必要とするのは、foo.hが変更されたときだけでなく、ヘッダーに変更が含まれているときにも再コンパイルすることです。しかし、foo.hの変更を検出するだけで十分です。簡単に取得するヘッダによって拡張することができ

# Construct special environment 
env = Environment() 
env.Append(CPPFLAGS = ['-include', 'foo.h']) 

# Compile objects separately 
objs = env.Object(Glob('*.c')) 

# Add explicit dependencies 
add_deps = ['foo.h'] 
for o in objs: 
    env.Depends(o, add_deps) 

# Create final library 
env.Library('myfoo', objs) 

*.oは、ビルドの説明に直接どこにも記載されていない拡張機能、およびadd_deps:この最初のショットとして

+0

あなたは 'Depends(" foo.o "、" foo.h ")'の明示的な依存関係を望まないでしょうか?さらに、これは、すべてのオブジェクトファイルに 'foo.h'を自動的に追加するより一般的な問題のほんのおもちゃの例に過ぎないと私は推測しています。実際のアプリケーションでライブラリごとに1つのファイルしかないことは間違いないでしょうか? – dirkbaechle

+0

@dirkbaechle、あなたの提案はうまくいきますが、堅牢ではないと思います( 'foo.c'は' foo.o'にコンパイルされると仮定しています)。はい、非常に簡単な例ですが、私は多くの情報源を持っています。 – ugoren

+0

ところで、私はWindowsでプログラムしなければならなかった昔、「強制的なインクルード」や「プリコンパイルされたヘッダー」などのようなものを試してみました...怠け者にしようとする人もいるかもしれません。 ;)これらの特別なインクルードヘッダー設定は、SConsを破るだけでなく、ParasoftのInsure ++のような他のツールもそれらを理解していないことに注意してください。ですから、長期的には何度も何度も問題に遭遇するでしょうし、各ソースファイルに "foo.h"を追加する面倒な作業をするだけの価値があるかもしれません。*あなたは*おそらく? – dirkbaechle

答えて

1

は、私が思い付くことができる最高です「foo.h」に含まれています。

関連する問題