|
|
dnl Copyright (C) 1993-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program.
dnl From Bruno Haible, Marcus Daniels.
AC_PREREQ(2.13)
AC_DEFUN([CL_GLOBAL_CONSTRUCTORS], [AC_REQUIRE([CL_AS_UNDERSCORE])dnl if test -n "$GCC"; then AC_CACHE_CHECK(for the global constructors function prefix, cl_cv_cplusplus_ctorprefix, [ cat > conftest.cc << EOF struct foo { foo (); }; foo foobar; EOF # look for the assembly language name in the .s file AC_TRY_COMMAND(${CXX-g++} $CXXFLAGS -S conftest.cc) >/dev/null 2>&1 if grep '_GLOBAL_\$I\$foobar' conftest.s >/dev/null ; then cl_cv_cplusplus_ctorprefix='_GLOBAL_$I$' else if grep '_GLOBAL_\.I\.foobar' conftest.s >/dev/null ; then cl_cv_cplusplus_ctorprefix='_GLOBAL_.I.' else if grep '_GLOBAL__I_foobar' conftest.s >/dev/null ; then cl_cv_cplusplus_ctorprefix='_GLOBAL__I_' else cl_cv_cplusplus_ctorprefix=unknown fi fi fi rm -f conftest* ]) if test "$cl_cv_cplusplus_ctorprefix" '!=' unknown; then ac_value='"'"$cl_cv_cplusplus_ctorprefix"'"' AC_DEFINE_UNQUOTED(CL_GLOBAL_CONSTRUCTOR_PREFIX,$ac_value) AC_CACHE_CHECK(for the global destructors function prefix, cl_cv_cplusplus_dtorprefix, [ cat > conftest.cc << EOF struct foo { foo (); ~ foo (); }; foo foobar; EOF # look for the assembly language name in the .s file AC_TRY_COMMAND(${CXX-g++} $CXXFLAGS -S conftest.cc) >/dev/null 2>&1 if grep '_GLOBAL_\$D\$foobar' conftest.s >/dev/null ; then cl_cv_cplusplus_dtorprefix='_GLOBAL_$D$' else if grep '_GLOBAL_\.D\.foobar' conftest.s >/dev/null ; then cl_cv_cplusplus_dtorprefix='_GLOBAL_.D.' else if grep '_GLOBAL__D_foobar' conftest.s >/dev/null ; then cl_cv_cplusplus_dtorprefix='_GLOBAL__D_' else cl_cv_cplusplus_dtorprefix=none fi fi fi rm -f conftest* ]) if test "$cl_cv_cplusplus_dtorprefix" '!=' none; then ac_value='"'"$cl_cv_cplusplus_ctorprefix"'"' AC_DEFINE_UNQUOTED(CL_GLOBAL_DESTRUCTOR_PREFIX,$ac_value) fi dnl Check whether the global constructors/destructors functions are file-scope dnl only by default. This is the case in egcs-1.1.2 or newer. AC_CACHE_CHECK(whether the global constructors function need to be exported, cl_cv_cplusplus_ctorexport, [ cat > conftest1.cc << EOF struct foo { foo (); }; foo foobar; EOF cat > conftest2.cc << EOF #include "confdefs.h" #ifdef ASM_UNDERSCORE #define ASM_UNDERSCORE_PREFIX "_" #else #define ASM_UNDERSCORE_PREFIX "" #endif struct foo { foo (); }; foo::foo () {} extern "C" void ctor (void) __asm__ (ASM_UNDERSCORE_PREFIX CL_GLOBAL_CONSTRUCTOR_PREFIX "foobar"); int main() { ctor(); return 0; } EOF if AC_TRY_COMMAND(${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest1.cc conftest2.cc $LIBS 1>&5) >/dev/null 2>&1 && test -s conftest${ac_exeext}; then cl_cv_cplusplus_ctorexport=no else cl_cv_cplusplus_ctorexport=yes fi rm -f conftest* ]) if test "$cl_cv_cplusplus_ctorexport" = yes; then AC_DEFINE(CL_NEED_GLOBALIZE_CTORDTOR) fi dnl Test what suffix to give the global ctors inside shared object files. if test "$enable_shared" = yes; then AC_CACHE_CHECK([for the global constructor function suffix in shared objects], cl_cv_cplusplus_ctorsuffix_pic, [ cat > conftest.cc << EOF extern "C" void func () {} static struct S { inline S () {} } S; EOF AC_TRY_COMMAND(${CXX-g++} $CXXFLAGS ${lt_prog_compiler_pic_CXX-"-fPIC"} -S conftest.cc) >/dev/null 2>&1 if grep "${cl_cv_cplusplus_ctorprefix}conftest\.cc" conftest.s >/dev/null; then cl_cv_cplusplus_ctorsuffix_pic='#module ".cc"' else cl_cv_cplusplus_ctorsuffix_pic='"cl_module__" #module "__firstglobalfun"' fi rm -f conftest* ]) AC_DEFINE_UNQUOTED([CL_GLOBAL_CONSTRUCTOR_SUFFIX_PIC(module)], [$cl_cv_cplusplus_ctorsuffix_pic]) fi dnl Test what suffix to give the global ctors inside static object files. if test "$enable_static" = yes; then AC_CACHE_CHECK([for the global constructor function suffix in static objects], cl_cv_cplusplus_ctorsuffix_nopic, [ cat > conftest.cc << EOF extern "C" void func () {} static struct S { inline S () {} } S; EOF AC_TRY_COMMAND(${CXX-g++} $CXXFLAGS -S conftest.cc) >/dev/null 2>&1 if grep "${cl_cv_cplusplus_ctorprefix}conftest\.cc" conftest.s >/dev/null; then cl_cv_cplusplus_ctorsuffix_nopic='#module ".cc"' else cl_cv_cplusplus_ctorsuffix_nopic='"cl_module__" #module "__firstglobalfun"' fi rm -f conftest* ]) AC_DEFINE_UNQUOTED([CL_GLOBAL_CONSTRUCTOR_SUFFIX_NOPIC(module)], [$cl_cv_cplusplus_ctorsuffix_nopic]) fi fi fi ])
|