2012-06-01 101 views
1

我想創建一個基本上調用AC_CHECK_SIZEOF(類型)的m4宏,然後使用AC_SUBST來定義該變量進行替換。 所以給定輸入的:AC_SUBST與動態變量名

AX_CHECK_SIZEOF_AND_SUBST(int, 4)

我想要的@[email protected]所有出現與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) 
]) 
+0

請閱讀http://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Macro-Names.html的第3段。雖然我相信「AX_」不會與任何保留的名稱空間發生衝突,但建議避免使用該名稱。 –

+0

@WilliamPursell我根據ac-archive.sourceforge.net/doc/contribute.html的建議得到了AX_前綴(請參見最後一段) – Naddiseo

回答

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可能,不太穩定,太;)情況因人而異)

要定義的宏(請注意我的關於命名約定註釋),你可以這樣做:

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 *,但爲了簡單起見,我w虐待它保留下來,而不是更一般的版本來替換它:

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]) 
]) 

注:我相信$()符號應在便攜的配置腳本來避免,並應與反引號替換。但是,我發現反襯可怕。