AC_ARG_WITH
でマクロを使用できますが、内部のコンパイル時の機能configure.ac
に使用する方が適切です。AC_ARG_ENABLE
例configure.ac
:
AC_ARG_ENABLE([comm], [AS_HELP_STRING([--enable-comm[[=tcp]]],
[specify a communications layer (default=tcp)])],
, [enable_comm=yes])
enable_comm=`echo $enable_comm` # strip whitespace.
if test "x$enable_comm" = "xyes" || "x$enable_comm" = "xtcp" ; then
enable_tcp="yes"
elif test "x$enable_comm" = "xnative" ; then
enable_native="yes"
elif test "x$enable_comm" = "xno" ; then
; # ... error message? default to a dummy layer implementation?
else
AC_MSG_ERROR([unknown option: '$enable_comm' for --enable-comm])
fi
AM_CONDITIONAL([ENABLE_COMM_TCP], [test "x$enable_tcp" = "xyes"])
AM_CONDITIONAL([ENABLE_COMM_NATIVE], [test "x$enable_native" = "xyes"])
...
AC_CONFIG_FILES([src/Makefile])
AC_CONFIG_FILES([src/tcp/Makefile src/native/Makefile])
...
AC_OUTPUT
もちろん、ヘルプ文字列に好きなものを入れて、デフォルトを別の方法で設定することもできます。
でsrc/Makefile.am
:
if ENABLE_COMM_TCP
COMM_DIR = tcp
endif
if ENABLE_COMM_NATIVE
COMM_DIR = native
endif
SUBDIRS = . $(COMM_DIR) # or '$(COMM_DIR) .' for depth-first order.
automake の動作方法による制限があります。条件変数を介して設定できるとよいのですCOMM_DIR
が、私の知る限り、これは機能しません。さらに、このアプローチでは、 を使用すると、 と の両方tcp
のnative
フォルダーがディストリビューションに自動的に含まれますmake dist
。いずれかをリストに入れる必要はありEXTRA_DIST
ませんが、オプションの「レイヤー」の数が扱いにくくなる場合は、より良いアプローチになる可能性があります。
私があなたのコメントを正しく理解していれば、簡単な方法はsrc
サブディレクトリのビルドにファイルを含めることですsrc/tcp/Makefile.am
。
lib_LTLIBRARIES = libcomm.la
libcomm_la_SOURCES = driver.h driver.c ../comm.h ../wrapper.c ...
ツリー外のビルドが正しく機能するcomm.h
ように指定する必要があるかどうかは、すぐには思い出せません。、などをその変数に追加する必要がある場合とない場合があります。これは機能するはずですが、物事を進める「正しい」方法ではありません...$(srcdir)/../comm.h
src/Makefile.am
comm.h
wrapper.c
EXTRA_DIST
適切なライブラリは に組み込まれている必要があります。つまり、または のいずれかでsrc
便利なライブラリを使用し、残りについては心配する必要はありません。例:tcp
native
libtool
src/Makefile
lib_LTLIBRARIES = libcomm.la
libcomm_include_HEADERS = comm.h
libcomm_la_SOURCES = comm.h wrapper.c utils.c ...
libcomm_la_LIBADD = ./$(COMM_DIR)/libcomm_layer.la
また、以下を注文する必要があります。SUBDIRS = $(COMM_DIR) .
のsrc/tcp/Makefile.am
AM_CPPFLAGS += -I$(srcdir)/.. # look for core headers in src
noinst_LTLIBRARIES = libcomm_layer.la # not for installation.
libcomm_layer_la_SOURCES = driver.h driver.c ...
# libcomm_layer_la_LDFLAGS = -static # optional... an archive is preferable.
これは、「コア」および「レイヤー」ライブラリがより複雑になるにつれて、より将来性のあるアプローチです-そしてそれらは:)