5

私たちの研究グループのプログラムの一部には、ctemplateライブラリによって提供される補助機能があります。configure古いクラスターでは、コンパイルのためにソフトウェアをビルドできないため、この機能を分離し、 などのフラグを介して含めるかどうかを制御したいと考えてい--disable-ctemplateます。

C++ で記述されたこのソフトウェアは、Autotools ビルド システムを使用しますが、どちらも私はあまり経験がありません。私の理解では、このタスクを達成するには、次のことを行う必要があります。

  1. AC_ARG_ENABLEで新しいエントリを作成して、configure スクリプトに新しいフラグを追加しますconfigure.ac

  2. ライブラリを使用するコードと、そのコードを呼び出すすべてのコードの周りに、いくつかの#ifdef(または場合によって#ifndefは) ステートメントを追加します。ctemplate

最初のステップは次のようになると思います。

AC_ARG_ENABLE(ctemplate,
[  --disable-ctemplate    Disable HTML output],
[case "${enableval}" in
  yes) ctemplate=false ;;
  no)  ctemplate=true ;;
  *) AC_MSG_ERROR(bad value ${enableval} for --disable-ctemplate) ;;
esac],[ctemplate=true])
AM_CONDITIONAL(NOCTEMPLATE, test x$ctemplate = xfalse)

--enable-FLAGの代わりに使用した例からこの例を適応させたので、ロジックが正しいかどうかはわかりません--disable-FLAG

2 番目のステップでは、次のようなプリプロセッサ フラグでセクションをラップします。

#ifndef NOCTEMPLATE
void Class::MethodUsingCtemplate(...)
{
    ...
}
#endif

私がやった場合、これはすべてを正しく「配線」しconfigure --disable-ctemplateますか?

ctemplateまた、これにより、プログラムがコンパイルのためにライブラリに入らないことが保証されますか? そうでない場合、これはすべて無駄です。ctemplateライブラリと依存コンポーネントのコンパイルを防止できることが不可欠です。

私は C++ と Autotools の両方に慣れていないことを繰り返します。この問題を解決するために、私は非常に素朴な最初のアプローチを取りました。この分野の経験がある場合は、修正と説明を提供していただければ幸いです。

4

2 に答える 2

6

ドキュメント、チュートリアル、ヘルプ スレッド、メーリング リストなどを読んだ後にまとめたソリューションを次に示します。機能するまで単純に試してみると、なぜ機能するのかを説明できました。

configure.ac、次のコード行を配置しました

# This adds the option of compiling without using the ctemplate library,
# which has proved troublesome for compilation on some platforms
AC_ARG_ENABLE(ctemplate,
  [ --disable-ctemplate   Disable compilation with ctemplate and HTML output],
  [case "${enableval}" in
     yes | no ) WITH_CTEMPLATE="${enableval}" ;;
     *) AC_MSG_ERROR(bad value ${enableval} for --disable-ctemplate) ;;
   esac],
  [WITH_CTEMPLATE="yes"]
)

dnl Make sure we register this option with Automake, so we know whether to
dnl descend into ctemplate for more configuration or not
AM_CONDITIONAL([WITH_CTEMPLATE], [test "x$WITH_CTEMPLATE" = "xyes"])

# Define CTEMPLATE in config.h if we're going to compile against it
if test "x$WITH_CTEMPLATE" = "xyes"; then
    AC_DEFINE([CTEMPLATE], [], ["build using ctemplate library"])
    AC_MSG_NOTICE([ctemplate will be used, HTML output enabled])
else
    AC_MSG_NOTICE([ctemplate will not be used, HTML output disabled])
fi

次のステップではMakefile.am、最上位の を次のように変更しました。

if WITH_CTEMPLATE
  MAYBE_CTEMPLATE = ctemplate
endif

SUBDIRS = boost libgsl $(MAYBE_CTEMPLATE) libutil ...

下位レベルMakefile.amで、追加しました

if WITH_CTEMPLATE
    # some change to the configuration
else
    # some other change to the configuration
endif

最後に、主要な C++ ヘッダー ファイル (コードの他の部分に含まれる) の 1 つに次のものが含まれていることを確認する必要がありました。

#ifdef HAVE_CONFIG_H
#    include "config.h"
#endif

config.hには、 で作成した新しい定義AC_DEFINEが含まれているため、このファイルは、このルートで作成されたマクロ定義が定義されている (または未定義である) かどうかをチェックする部分に含める必要があります。

これには多くの時間がかかり、私の側の欲求不満を押しのけました。この説明をここに文書化することで、他の誰かを同じ運命から救うことができることを願っています.

于 2009-08-23T23:18:55.970 に答える
1

ビルドが ctemplate サブディレクトリでコンパイルを試行しないようにするには、次のようにします。

CTEMPLATE の場合
サブディレクトリ += ctemplate
終了

Makefile.am で

于 2009-08-18T19:00:30.607 に答える