2017-11-04 25 views
1

저는 SunCC로 Solaris에서 작업하고 있습니다. Autoconf의 AC_COMPILE_IFELSEAC_LINK_IFELSE은 컴파일러 기능을 잘못 감지합니다. 컴파일러가 illegal option과 같은 메시지를 사용하여이를 거부하더라도 Autoconf는보고 기능을 사용할 수 있습니다.Autoconf에서 컴파일러 이름이나 공급 업체를 찾는 방법은 무엇입니까?

$ echo 'int main(int argc, char* argv[]) {}' > test.C 
$ /opt/solarisstudio12.4/bin/CC test.C 
$ /opt/solarisstudio12.4/bin/CC -msse4.2 -msha test.C 
CC: Warning: Option -msse4.2 passed to ld, if ld is invoked, ignored otherwise 
CC: Warning: Option -msha passed to ld, if ld is invoked, ignored otherwise 
ld: fatal: option '-h a' is incompatible with building a dynamic executable 
$ /opt/solarisstudio12.4/bin/CC -xarch=sha test.C 
CC: Warning: illegal use of -xarch option, illegal value ignored: sha 

나는 잘못된 탐지를 해결하려고 노력하고 싶지만 컴파일러가이를 알아야 할 필요가있다. Autoconf에는 canonicalized names for CPU, Vendor and OS을 제공하는 매크로가 있지만 컴파일러 나 해당 공급 업체가 포함되어 있지 않은 것으로 보입니다.

Autoconf에서 컴파일러 이름이나 공급 업체를 어떻게 감지합니까?


다음을 추가하는 것은 컴파일러를 식별하지 않기 때문에별로 도움이되지 않습니다. 그런 다음

AC_MSG_NOTICE(["Build: $build"]) 
AC_MSG_NOTICE(["Compiler: $compiler"]) 

:

CXX=/opt/solarisstudio12.4/bin/CC ./configure 
... 

configure: "Build: i386-pc-solaris2.11" 
configure: "Compiler: /opt/solarisstudio12.4/bin/CC" 

답변

2

나는이 작업을 수행하는 표준 방법이라고 생각하지 않습니다.

predef.sourceforge.net에 따라 컴파일러 매크로가 있는지, 그리고 cc --version과 같은 소스, cc의 명령 이름, 운영 체제 이름 등을 수동으로 확인합니다.

e.e. 프로그램을 컴파일하고 정의를 확인하십시오. 존재하지 않는 경우/프로그램에서 오류가 발생했습니다 -> SunCC가 아닙니다.

지저분 해 보입니다 만 여기 Score-P 소스 (vendor/common/build-config/m4/ax_compiler_vendor.m4)의 예제가 있습니다. 아마 당신은 그것에서 영감을 수행 할 수 있습니다 @Ronny가 언급 한 바와 같이

AC_DEFUN([AX_COMPILER_VENDOR], 
[AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, 
    dnl Please add if possible support to ax_compiler_version.m4 
    [# note: don't check for gcc first since some other compilers define __GNUC__ 
    vendors="intel:  __ICC,__ECC,__INTEL_COMPILER 
      ibm:  __xlc__,__xlC__,__IBMC__,__IBMCPP__ 
      pathscale: __PATHCC__,__PATHSCALE__ 
      clang:  __clang__ 
      cray:  _CRAYC 
      fujitsu: __FUJITSU 
      gnu:  __GNUC__ 
      sun:  __SUNPRO_C,__SUNPRO_CC 
      hp:  __HP_cc,__HP_aCC 
      dec:  __DECC,__DECCXX,__DECC_VER,__DECCXX_VER 
      borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ 
      comeau: __COMO__ 
      kai:  __KCC 
      lcc:  __LCC__ 
      sgi:  __sgi,sgi 
      microsoft: _MSC_VER 
      metrowerks: __MWERKS__ 
      watcom: __WATCOMC__ 
      portland: __PGI 
      tcc:  __TINYC__ 
      unknown: UNKNOWN" 
    for ventest in $vendors; do 
    case $ventest in 
     *:) vendor=$ventest; continue ;; 
     *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; 
    esac 
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[ 
     #if !($vencpp) 
     thisisanerror; 
     #endif 
    ])], [break]) 
    done 
    ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1` 
]) 
]) 
+0

감사합니다 로니 :

## Determine the compiler's vendor. COMPILER_VERSION='"$CXX" --version 2>/dev/null' ## IBM xlC test if COMPILER_VERSION is empty if test x"$COMPILER_VERSION" = "x"; then COMPILER_VERSION='"$CXX" -qversion 2>/dev/null' fi ## SunCC test if COMPILER_VERSION is empty if test x"$COMPILER_VERSION" = "x"; then COMPILER_VERSION='"$CXX" -V 2>&1' fi 

그런 다음, 공급 업체처럼 사용할 수 있습니다. 흥미로운 Score-P는'$ compiler --version','$ compiler --qversion' 또는'$ compiler -V'의 문자열 대신 전 처리기 매크로를 사용하기로 결정했습니다. 버전 문자열을 덤프하는 것과 매크로를 덤프하는 것과 같은 양의 작업이있는 것처럼 보입니다 (많은 컴파일러가 다릅니다). 나는 그것에 대해 생각해야 할 것이다. 선처리 매크로가 왜 사용되었는지 알고 싶습니까? – jww

+0

구문 분석 - 버전이 더 복잡하고 문자열/키워드가 버전간에 변경 될 수 있다고 생각합니다. 나는 그 결정에 관여하지 않았다. 하지만 컴파일러에는 의미가 있다고 생각합니다. 그것은 신뢰할 수있는 출처입니다. predef.sourceforge.net -> 컴파일러를 참조하십시오. 플랫폼/라이브러리/다른 것들에 대해서는 다른 소스를 사용합니다. 예 :Cray 시스템인지 또는 리눅스 클러스터인지 알 수있는 방법. –

+0

고마워요. Ronny. 전 처리기 매크로가 아닌 컴파일러 문자열을 사용할 것입니다. 우리의 ['GNUmakefile'] (https://github.com/weidai11/cryptopp/blob/master/GNUmakefile)은 두 기술을 모두 사용하지만 전통적으로 컴파일러 버전 문자열에'--version'과 friends를 사용했습니다. – jww

1

, 컴파일러 공급 업체를 결정하는 표준 방법이있을 나타나지 않습니다. 잘못 감지하는 동안 Autoconf 버그를 해결하는 것과 같은 작업을 구성하는 동안 공급 업체를 찾는 것이 중요합니다. CC: Warning: illegal use of -xarch option, illegal value ignored: sha.

@Ronny는 전처리 매크로를 사용하여이를 수행하는 방법을 보여 줬습니다. 우리는 컴파일러가 GCC로 가장하는 방식 때문에이를 피했습니다. Clang과 Intel의 컴파일러는 모두 __GNUC__을 정의하고 있으며 다른 컴파일러도 그렇게합니다.

여기 configure.ac의 버전 문자열을 수행하는 방법은 다음과 같습니다

IS_SUN_COMPILER=`echo $COMPILER_VERSION | $EGREP -i -c -E 'Sun C\+\+'` 
echo "IS_SUN_COMPILER: $IS_SUN_COMPILER" 
... 

## This block handles SunCC. 
if test "$IS_SUN_COMPILER" -ne "0"; then  
    ...  
fi 
+0

네, 여러 매크로를 정의하는 것이 옳습니다. 여러 소스를 확인하는 것이 좋습니다. 나는 변화를 좋아하기 때문에 특별히 반전을 좋아하지 않는다. 예를 들어 컴파일러의 버전 번호가 더 복잡해진다. –