2012-03-01 9 views
1

私はu-bootのmakefileの一部としてシェルスクリプトに出くわしました。それが何 とどのようにそれが次のシェルスクリプトは何ですか

cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \ 
     > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;) 

を評価され、コードがifコマンドを実行します

PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,\ 
      $(call cc-option,-malignment-traps,)) 

答えて

3

と呼ばれています。 ifは引数を1つとります:実行するコマンド($(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1)。

コマンドが成功すると、thenの部分が実行されます(echo "$(1)")。コマンドが失敗すると、elseの部分が実行されます(echo "$(2)")。

コンパイラは、サポートしていないオプション($1-mshort-load-bytes)で起動します。

$2は空ですので、結果はオプション(コンパイラがサポートしている場合)または空の文字列のいずれかになります。

+0

+1ですが、 "if"はコマンドではありません。それはシェル文法のキーワードです。 –

+0

@WilliamPursell:まあ、ほとんどのシェルでは "if"はシェル組み込みコマンドです。 BASHのマニュアルには、 "複合コマンド"の下の "if"がリストされています。 –

+0

"if"のセマンティクスは実際に複合コマンドを形成するためのキーワードとしてそのセクションで記述されています。これはコマンドではありません。 –