configure.acで利用できるオプションまとめ

色々configure.acをいじったので、こちらのオプションについてまとめてみました。
中々癖のあるconfigureなので、既存OSSを見ていると非常に参考になります。

今回は個人的に見慣れている[lighttpd](https://github.com/lighttpd/lighttpd1.4)を参考にしました。
他にも何か面白いものがあったら追記してきます。

##**通常Make系**

通常のMakefileで使用するようなビルドオプション関連

###**gccオプション**

通常のMakefileと同様のgcc compile option時に利用されるオプションです。

**一般的なライブラリの追加**

```shell:configure.ac
AC_CHECK_LIB([rt], [main])
```

**既存のビルドオプション更新 (LIBSやCFLAGS, CPPFLAGS等が該当します)**

```shell:configure.ac
CPPFLAGS="${CPPFLAGS} -D_REENTRANT"
```

こんな追加方法もあるようです。(未確認)

```shell:configure.ac
AS_VAR_APPEND([CFLAGS], [" -Werror"])
```

**新しいビルドオプションの追加**

```shell:configure.ac
GCOV_OPT="-fprofile-arcs -ftest-coverage"
AC_SUBST([GCOV_OPT])
#=>各Makefile.am内で、GCOV_OPTが定義された変数として使用できます。
```

##**define**

```shell:configure.ac
AC_DEFINE([HAVE_SENDFILE_BROKEN], [1], [broken sendfile])
```

ちなみにここで定義されるdefineは、config.hの中に含まれる模様。

###**defineでprefix等の文字列を利用したい**

configure.ac内にconfigureの処理を書くと、そのまま反映されます。
その際、一度`AC_DEFINE`でdummyの定義する必要があります。

```shell:configure.ac
#add CommandServicePath
AC_DEFINE([CGI_COMMAND_SERVICE_PATH], ["dummy"], ["Define CGI CommandService path"])
case ${prefix} in
  NONE) $as_echo "#define CGI_COMMAND_SERVICE_PATH \"${ac_default_prefix}/sbin\"" >>confdefs.h;;
  *) $as_echo "#define CGI_COMMAND_SERVICE_PATH \"${prefix}/sbin\"" >>confdefs.h;;
esac
```


##**configure独自機能系**

configureやMakefile.amといったconfigure機能の中で使える設定関連

##**Makefile.am設定**

**Makefile.am向けdefine**

Makefile.am自体の切り替えに使える面白いやつ。

```shell:configure.ac
#AM_CONDITIONAL([渡すMakefile.am利用define], [条件分])

AM_CONDITIONAL([USE_BUILDER], [test "$enable_builder" = yes])
```

例えば上記を色々書いておいて、Makefile.amをこのようにくくってあげると、フォルダ内のモジュールごとビルドをスキップ出来ます。

```Makefile.am
SUBDIRS=design_pattern_util

if USE_BUILDER
SUBDIRS+= builder
endif
```

##**configureオプション追加**

**有効無効切り替え: enable**

- `--enable-XXX` => enableval=yes
- `--disable-XXX` => enableval=no
とyes/noのケースが変わります。

```````````````````````shell:configure.ac
#AC_ARG_ENABLEの引数は4つ。option, help, スクリプト, 初期値
#AC_HELP_STRINGはヘルプを綺麗に出力するためのコマンドです。
AC_ARG_ENABLE(threadsafe,
  [AC_HELP_STRING([--enable-threadsafe],[説明分を追加])],,
[\
#enablevalはyes or no. --disable-threadsafeでno側のケースになる。
case "${enableval}" in
 yes) enable_threadsafe=yes ;;
 no)  enable_threadsafe=no;;
esac],
enable_threadsafe=no)

#例えば上記の結果でdefine値を切り替え、コンパイルスイッチにすることが出来ます。
if test x"${enable_threadsafe}" = x"yes"; then
  AC_DEFINE(THREAD_SAFE, 1, [Define to 1 if you want to ensure thread safe])
else
echo "libnotify is disabled"
fi
```````````````````````````````````

**有効無効切り替え: with**
- `--with-XXX` => withval=yes
- `--without-XXX` => withval=no
とyes/noのケースが変わります。
enableとの違い？ないけど--with-http2とか--with-h265とか、withの方がなんかわかりやすい/かっこいいです。

```shell:configure.ac
AC_ARG_WITH([builder],
  [AC_HELP_STRING([--without-builder],
    [exclude builder pattern library]
  )],
  [with_builder=$withval],
  [with_builder=yes]
)
#AM_CONDITIONALと組み合わせて丸ごと無効化みたいな使い方も便利です。
AM_CONDITIONAL([USE_BUILDER], [test "$with_builder" = yes])
```

##**configureログ系**

```shell:configure.ac

#エラーにならないログが出せます。
AC_MSG_NOTICE([----------------------------------------])
#こっちはエラーログ。configureもエラーになります。
AC_MSG_ERROR([bad value ${enableval} for --enable-ipv6])

```

##参考

[lighttpd](https://github.com/lighttpd/lighttpd1.4)
最新コードのconfigure.acの内容