2012年10月9日火曜日

make 3.80 と make 3.81 の違い

経験的に以下のような書き方ができることは知っていたけど、
これが許されるのはGNU make version 3.81以降のようだ。


ifeq ($(FOO),a)
  $(warning FOO is a)
else ifeq ($(FOO),b)
  $(warning FOO is b)
else ifeq ($(FOO),c)
  $(warning FOO is c)
else ifeq ($(FOO),d)
  $(warning FOO is d)
endif



make version 3.80 の場合、上記は以下のようにエラーになってしまう。

Makefile:5: FOO is a
Makefile:6: `else' 疑似命令の後ろに無関係な文字列があります
Makefile:8: `else' 疑似命令の後ろに無関係な文字列があります
Makefile:8: *** 一つの条件部につき一つしか `else' を使えません。中止。




ポータビリティのことを考えるなら、以下のように書いた方がよさそうだ。

ifeq ($(FOO),a)
  $(warning FOO is a)
else
  ifeq ($(FOO),b)
    $(warning FOO is b)
  else
    ifeq ($(FOO),c)
      $(warning FOO is c)
    else
      ifeq ($(FOO),d)
        $(warning FOO is d)
      endif
    endif
  endif
endif

しかしこれだと、インデントがないと、わけがわからなくなるな。
ネストが深くなると大変そうだ。


case文みたく、重なりがないことが明らかな場合は以下のようにする方が見やすそうだ。


ifeq ($(FOO),a)
  $(warning FOO is a)
endif
ifeq ($(FOO),b)
  $(warning FOO is b)
endif
ifeq ($(FOO),c)
  $(warning FOO is c)
endif
ifeq ($(FOO),d)
  $(warning FOO is d)
endif

0 件のコメント:

コメントを投稿