2017-10-21 10 views
1

パッケージ/ lib _SOURCESまたはパッケージ/ libフラグ(CFLAGS、LDFLAGS、LDADDなど)を条件付きで設定するときは、条件付きでパッケージのフラグに追加する方が良いでしょう例えば:ソース/フラグ/ libsのAutomake条件付き追加または変数割り当て

bin_PPROGRAMS = mypkg 
mypkg_SOURCES = mypkg.c 
if OS1 
mypkg_SOURCES += os1.c 
else 
if OS2 
mypkg_SOURCES += os2.c 
endif 
endif 

または条件変数を割り当てて、パッケージの旗(人口またはnullかどうか)、などにそれら全てを連結するために:私はそれを両方の方法を見てきましたし、私が見ることができる

if OS1 
os1_src = os1.c 
else 
if OS2 
os2_src = os2.c 
endif 
endif 

bin_PROGRAMS = mypkg 
mypkg_SOURCES = mypkg.c $(os1_src) $(os2_src) 

それぞれに利点。前者では、パッケージにこれらのフラグを追加する実際の最終的な動作は条件付きではっきりしており、指定されたビルドで実際には何も意味しない変数でラインを混雑させていません。後者では、パッケージに実際に含まれているものが1行に集約されており、見えない別のアペンドメントはどこかではありませんが、その不透明な変数名で何が起こっているのかは分かりません。

別のオプションは、オプション2のようにすることですが、configureスクリプト(AC_SUBSTでconfigure.ac)で変数を割り当てることです。しかし、私は設定スクリプトを純粋に利用可能な機能を検出し、Makefileで使うものを選んでいます。

そのうちの1人は、技術的な面倒な、あるいは厄介な副作用がありますか?

答えて

1

あなたが観察した違いは主に主観的なものであり、主にここで話題にはならないスタイルの問題です。しかし、あなたの実際の質問はかなり客観的です。

技術的な不利な点や厄介な副作用はありますか?

いいえ、いずれも私が認識していません。どちらの方法も、少なくとも孤立してもうまく動作します。より大きなコンテキストは、複数のターゲットと組み合わせて変数を再利用するなど、第2のアプローチのバリエーションを好む理由を提供するかもしれない。ただし、プリプロセッサやリンクオプションの場合は、ソースファイルの選択よりもそうである可能性があります。


個人的に、私はあなたが少し異なる提示してきた特定のケース構造になります。

if OS1 
os_src = os1.c 
else 
if OS2 
os_src = os2.c 
endif 
endif 

bin_PROGRAMS = mypkg 
mypkg_SOURCES = mypkg.c $(os_src) 

確かに、これはスタイルの問題があるが、それはあなたに価値が何のためにそれを取ります。ここで、変数の使用法は、条件の構造に一致します。OS1OS2の代替変数です。したがって、これらの変数の間で変数は1つだけの値を制御します。したがって、その変数の意味は、その値が設定されているポイントと使用されているポイントの両方で、より明確になります。

複数の変数は、複数の異なる無関係の条件に対してより意味があります。

+0

これは完璧な答えです、ありがとうございます。それは良い洞察でもあります。多くのオプションの1つによって代替的に提供される資産があれば、それらを単一の変数で表現します。 –

1

私はいくつかのより多くの典型的なパターンを追加します:OS1 OS1 = yesの OS2 =なし endifの 場合OS2 OS1 =なし OS2 = yesの endifの場合

os1_src = os1.c 
os2_src = os2.c 
if OS1 
    myos = os1 
endif 
if OS2 
    myos = os12 
endif 

mypkg_SOURCES = mypkg.c $($(myos)_src) 

別の $(os1)src = os1.c $(os2)src = os2.c

mypkg_SOURCES = mypkg.c $(yessrc) 

os-またはprocessor-またはconfiguratipn固有のビルドフラグを提供するのに同じ方法を使用できます。多くの場合、複数のモジュールに共通の設定がありますが、他のフラグはモジュール固有です。

各アプローチは誤用され、厄介な結果につながる可能性があります。

主なリスクは、あるモジュールのフラグや設定が正しくリセットされず、別のモジュールの設定が誤って「スピル」することです。しかしまた、いくつかのモジュールはいくつかの共通のフラグを見逃す可能性があります。

これらのリスクを軽減するには、ビルドに多数のモジュールが含まれていても同じ手法を採用してください。

関連する問題