4

autotools プロジェクトがあります。ユーザーがビルド中にそのように構成した場合、プロジェクトからいくつかのファイルを除外したいと考えています。たとえば、ビルドが --no-gui で構成されている場合、GUI に関連するファイルはビルドに含まれません。

  1. autoconfのそのようなフラグの標準マクロは何ですか? --disable-gui? のように設定できるもの

  2. この構成オプションとautomake入力ファイル間のリンクを確立する方法は?

Calcote の入門書 Autotools があります。関連するマクロを教えていただければ、本やネットで調べることができます。

ありがとうございました、

エラン。

4

1 に答える 1

14

autoconf のマニュアルによると、これを行う正しい方法は への--enable-FEATURE引数を使用することconfigureです。これは、マクロを使用して行われAC_ARG_ENABLEます。への 4 つの引数AC_ARG_ENABLEは、順番にFEATURE、、、、です。だからで:HELP-STRINGACTION-IF-GIVENACTION-IF-NOT-GIVENconfigure.ac

AC_ARG_ENABLE([gui],
  [AS_HELP_STRING([--disable-gui], [Enable GUI support @<:@check@:>@])],
  [:],
  [enable_gui=check])

AS_HELP_STRINGはヘルプ文字列を適切にラップし、 および はおよび@<:@の出力に展開さ@:>@れる四角形です。空の ,を指定しましたが、 or ( のエイリアス) が渡されたかどうかに応じて、orに設定されます。[]./configure --helpACTION-IF-GIVENconfigureenable_guiyesno--enable-gui--disable-gui--enable-gui=no

したがって、シェル変数は、またはの$enable_guiいずれかになります。これは、チェックだけに基づいてオプションのサポートを構築するのは不適切な形式と見なされているため、配布パッケージを作成する貧弱なパッケージャーの利益のためです。automagic dependenciesに関する gentoo の記事を参照してください。ただし、パッケージ作成者は、必要な機能を黙って含めないよりも、ビルドが失敗することを好むでしょう。yesnocheck

ここで、$enable_guiyesまたはcheckの場合、依存関係をチェックし、機能を手動で有効にした場合は失敗します。あなたの GUI が依存しているライブラリがわからないのでpkg-configgtk+-2.0. PKG_CHECK_MODULES(パッケージによって提供される)への 4 つの引数pkg-configは、順に、VARIABLEMODULESACTION-IF-FOUNDおよびACTION-IF-NOT-FOUND:

AS_IF([test "$enable_gui" != "no"],
  [PKG_CHECK_MODULES([GTK],
    [gtk+-2.0],
    [enable_gui=yes],
    [AS_IF([test "$enable_gui" = "yes"],
      [AC_MSG_ERROR([gtk+-2.0 required, but not found.])],
      [enable_gui=no])])])

AS_IF通常のシェル式を記述する代わりにif使用する理由はautoconf、囲まれたマクロが必要とする可能性のあるものをすべて展開するためです (ここではPKG_CHECK_MODULES内部的に のようなマクロに依存しますPKG_PROG_PKG_CONFIG)。のようなことを行うことで、これがすべてのケースで正しいことをテストできます./configure --enable-gui PKG_CONFIG=/bin/false

enable_gui=checkいずれにせよ、現在は またはのいずれenable_gui=yesかに解決されていますenable_gui=no。これを に渡す必要がありautomakeます。使用するマクロはAM_CONDITIONALです。その引数は、順番にCONDITIONAL(で使用される名前Makefile.am) とCONDITION(を設定するシェル テストCONDITIONAL) です。

AM_CONDITIONAL([ENABLE_GUI], [test "$enable_gui" = "yes"])

次に、 に移りMakefile.amます。いくつかのオプションのソースを持つ単純なプログラムを想定します。

# You probably have something real for these.
AM_CFLAGS =
LDADD =

bin_PROGRAMS = elanprog
elanprog_SOURCES = elanprog.c elanfile.c

if ENABLE_GUI
AM_CFLAGS += $(GTK_CFLAGS)
LDADD += $(GTK_LIBS)
elanprog_SOURCES += elangui.c
endif
于 2012-08-10T13:40:36.800 に答える