1

基本的に AC_CHECK_SIZEOF(type) を呼び出し、次に AC_SUBST を使用してその変数を置換用に定義する m4 マクロを作成しようとしています。したがって、次の入力が与えられます:

AX_CHECK_SIZEOF_AND_SUBST(int, 4)

@SIZEOF_INT@のすべてのオカレンスを 4 に置き換えたい

これは私がこれまでに思いついたものですが、明らかに機能しません:

AC_DEFUN([AX_CHECK_SIZEOF_AND_SUBST], [
    AC_CHECK_SIZEOF($1, $2)
    NAME=$(echo -n "SIZEOF_$1" | tr "a-z" "A-Z" | tr '*' 'P' | tr -c 'A-Z0-9' '_')
    echo "NAME=$NAME"
    AC_SUBST($NAME, $$NAME)
])
4

1 に答える 1

1

あなたがやろうとしていることの問題はAC_CHECK_SIZEOF、実際には という名前の変数を定義していないことSIZEOF_INTです。2.68 では、必要な変数ac_cv_sizeof_intの名前は になっていますが、それ以降のバージョンでは名前が変更される可能性があるため、これを使用しないでください。値は confdefs.h にも書き込まれるため、取得する別の方法は次のとおりです。

AC_PROG_AWK
AC_CHECK_SIZEOF([int])
SIZEOF_INT=$($AWK '/SIZEOF_INT/{print $3}' confdefs.h)
AC_SUBST([SIZEOF_INT])

(confdefs.h の読み取りも文書化されていない動作であり、autoconf の将来のバージョンで変更される可能性がありますが、おそらく $ac_cv_sizeof_int を見るよりも安定しています。おそらく、安定性も劣ります。;) YMMV)

マクロを定義するには (命名規則に関する私のコメントに注意してください)、次のようにします。

AC_DEFUN([wrp_CHECK_SIZEOF_AND_SUBST], [
    AC_REQUIRE([AC_PROG_AWK])
    AC_CHECK_SIZEOF([$1])
    m4_toupper(SIZEOF_$1)=$($AWK '
        /SIZEOF_[]m4_toupper($1)/{print $[]3}' confdefs.h)
    AC_SUBST(m4_toupper(SIZEOF_$1))
])

上記のバージョンは を処理しませんint *が、簡単にするために、より一般的なバージョンに置き換えるのではなく、そのままにしておきます。

AC_DEFUN([wrp_CHECK_SIZEOF_AND_SUBST], [
    AC_REQUIRE([AC_PROG_AWK])
    AC_CHECK_SIZEOF([$1])
    m4_pushdef([name],SIZEOF_[]m4_toupper(m4_translit($1,[ *],[_p])))
    name=$($AWK '/name/{print $[]3}' confdefs.h)
    AC_SUBST(name)
    m4_popdef([name])
])

注:$()移植可能な構成スクリプトでは表記を避けるべきであり、バッククォートに置き換える必要があると思います。ただし、バッククォートは恐ろしいものです。

于 2012-06-02T12:38:15.360 に答える