1

現在、通信用の通信ライブラリを使用しているプロジェクトがあります。ライブラリは一般的ではありません。一部のマシンでのみ実行されます。プロジェクトを移植して、通信に他のライブラリを使用できるようにしたいと考えています。そのために、さまざまな実装を持つ抽象レイヤーを定義しました。これらの実装はいくつかのファイルで構成されているため、それらを別のフォルダーにグループ化したいと考えています。

たとえば、tcp を使用する実装と、通信にシステム ネイティブ ライブラリを使用する別の実装があるとします。私のフォルダーにはフォルダーtcpとフォルダーがあります。autotools で、configure 時に選択された 1 つの実装を使用するようにします。nativesrc--with-comm=XXX

これを実現するために Makefile.am を構成するにはどうすればよいですか? 私はこれを読みました:autotoolsの異なるファイルの異なる実装ですが、異なる実装には異なるファイルのみを使用しますが、フォルダーを使用したいです。

4

1 に答える 1

2

AC_ARG_WITHでマクロを使用できますが、内部のコンパイル時の機能configure.acに使用する方が適切です。AC_ARG_ENABLEconfigure.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が、私の知る限り、これは機能しません。さらに、このアプローチでは、 を使用すると、 と の両方tcpnativeフォルダーがディストリビューションに自動的に含まれます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.hsrc/Makefile.amcomm.hwrapper.cEXTRA_DIST


適切なライブラリは に組み込まれている必要があります。つまり、または のいずれかでsrc便利なライブラリを使用し、残りについては心配する必要はありません。例:tcpnativelibtoolsrc/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.

これは、「コア」および「レイヤー」ライブラリがより複雑になるにつれて、より将来性のあるアプローチです-そしてそれらは:)

于 2013-06-27T17:03:17.290 に答える