2012-09-24 4 views
2

AC_CHECK_HEADERS가 m4_foreach_w에서 호출 될 때 autoheader (2.65)는 위조 템플릿을 생성하는 것으로 보입니다. 예를 들어 :config.h.in에 불필요한 출력 억제

/* Define to 1 if you have the <hdr> header file.*/ 
#undef HAVE_HDR 

그 가짜 템플릿을 피하기 위해 어떤 방법이 있나요 :

m4_foreach_w([hdr],[[foo.h] [bar.h]], 
    [AC_DEFINE([HAVE_]m4_translit(m4_toupper(hdr),[/.],[__]),[1], 
     [Define to 1 if ]hdr[ is available])] 
    [AC_CHECK_HEADERS([hdr])] 
) 

config.h.in 템플릿을 가지고 (AC_CONFIG_HEADERS([config.h])은 가정) 원인은? m4_foreach_w은 매크로 내에서 호출되며 실제 텍스트는 m4_foreach_w([hdr],[$1],이며 m4 인용 부호가 있는지 궁금해합니다. 그러나 문제는 더 근본적인 것으로 의심됩니다. 말하자면, 나는 항상 내가 m4를 잘못 인용했다고 가정한다 - 그러나 그것은 여기서 문제가되지 않는다. 오히려 autoheaderm4_foreach_w을 준수하지 않고 텍스트를 스캔합니다. 템플릿이 문제를 일으키는 것 같지는 않지만 최종적으로는 이상하게 보입니다 config.h.

답변

3

autoheaderconfigure.ac을 "검사하지 않습니다. 대신, 추적 모드에서 AC_DEFINE_TRACE_LITERAL (간접적으로는 AC_DEFINE이라고 함) 및 AH_OUTPUT (AC_CHECK_HEADERS에 의해 호출 됨)으로 낮은 수준의 호출을 포착하기 위해 추적 모드에서 configure.ac부터 m4까지 실행합니다. 모든 것이 m4을 통과하기 때문에 autoheaderm4_foreach을 무시하지 않습니다. 그러나 그들은 매크로에 의해 실제로 받아 들여지는 방식으로 논증을 본다.

당신은 당신의 configure.acAC_DEFINEAC_CHECK_HEADERS에 대한 호출을 추적하여 코드에서 문제를 볼 수 있습니다

 
% cat configure.ac 
AC_INIT(somelib.so, 1.0, [email protected]) 
m4_foreach_w([hdr],[[foo.h] [bar.h]], [ 
    AC_DEFINE([HAVE_]m4_translit(m4_toupper(hdr),[/.],[__]),[1], 
     [Define to 1 if ]hdr[ is available]) 
    AC_CHECK_HEADERS([hdr]) 
]) 
AC_CONFIG_HEADERS([config.h]) 
AC_OUTPUT 
% autoconf -t AC_DEFINE -t AC_CHECK_HEADERS 
configure.ac:3:AC_DEFINE:HAVE_FOO_H:1:Define to 1 if foo.h is available 
configure.ac:3:AC_CHECK_HEADERS:hdr 
configure.ac:3:AC_DEFINE:STDC_HEADERS:1:Define to 1 if you have the ANSI C header files. 
configure.ac:3:AC_CHECK_HEADERS:sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h inttypes.h stdint.h unistd.h:::$ac_includes_default 
configure.ac:3:AC_DEFINE:HAVE_BAR_H:1:Define to 1 if bar.h is available 
configure.ac:3:AC_CHECK_HEADERS:hdr 

그래서 우리는 AC_CHECK_HEADERS가 인수로 hdr으로 두 번 호출되는 것을 알 수있다. AC_DEFINE 호출 중에 hdr이 올바르게 확장되었습니다. hdr이 (가) AC_CHECK_HEADERS 전화를 한 번 더 인용하여 확장되지 못하기 때문입니다.

내가 이런 식으로 해결할 것 :

m4_foreach_w([hdr],[[foo.h] [bar.h]], [ 
    AC_DEFINE([HAVE_]m4_translit(m4_toupper(hdr),[/.],[__]),[1], 
     [Define to 1 if ]hdr[ is available]) 
    AC_CHECK_HEADERS(hdr) 
]) 

을 (.하지만 여전히 이름이 foo.h 및 bar.h 어떤 매크로를 실행하지 않습니다 가정한다)