저는 SunCC로 Solaris에서 작업하고 있습니다. Autoconf의 AC_COMPILE_IFELSE
및 AC_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"
감사합니다 로니 :
그런 다음, 공급 업체처럼 사용할 수 있습니다. 흥미로운 Score-P는'$ compiler --version','$ compiler --qversion' 또는'$ compiler -V'의 문자열 대신 전 처리기 매크로를 사용하기로 결정했습니다. 버전 문자열을 덤프하는 것과 매크로를 덤프하는 것과 같은 양의 작업이있는 것처럼 보입니다 (많은 컴파일러가 다릅니다). 나는 그것에 대해 생각해야 할 것이다. 선처리 매크로가 왜 사용되었는지 알고 싶습니까? – jww구문 분석 - 버전이 더 복잡하고 문자열/키워드가 버전간에 변경 될 수 있다고 생각합니다. 나는 그 결정에 관여하지 않았다. 하지만 컴파일러에는 의미가 있다고 생각합니다. 그것은 신뢰할 수있는 출처입니다. predef.sourceforge.net -> 컴파일러를 참조하십시오. 플랫폼/라이브러리/다른 것들에 대해서는 다른 소스를 사용합니다. 예 :Cray 시스템인지 또는 리눅스 클러스터인지 알 수있는 방법. –
고마워요. Ronny. 전 처리기 매크로가 아닌 컴파일러 문자열을 사용할 것입니다. 우리의 ['GNUmakefile'] (https://github.com/weidai11/cryptopp/blob/master/GNUmakefile)은 두 기술을 모두 사용하지만 전통적으로 컴파일러 버전 문자열에'--version'과 friends를 사용했습니다. – jww