]> granicus.if.org Git - libevent/commitdiff
Cleanup __func__ detection
authorAzat Khuzhin <a3at.mail@gmail.com>
Tue, 19 Jun 2018 07:15:08 +0000 (10:15 +0300)
committerAzat Khuzhin <azat@libevent.org>
Sat, 2 Feb 2019 12:17:58 +0000 (15:17 +0300)
First of all __func__ is not a macro, it is char[] array, so the code
that we had before in cmake, was incorrect, i.e.:
  #if defined (__func__)
  #define EVENT____func__ __func__
  #elif defined(__FUNCTION__)
  #define EVENT____func__  __FUNCTION__
  #else
  #define EVENT____func__ __FILE__
  #endif

So just detect do we have __func__/__FUNCTION__ in configure/cmake
before build and define EVENT__HAVE___func__/EVENT__HAVE___FUNCTION__
to use the later to choose which should be used as a __func__ (if it is
not presented).

Closes: #644
(cherry picked from commit e85818d24850540d220e6d7bc0a30653ba2135f2)

CMakeLists.txt
WIN32-Code/nmake/event2/event-config.h
configure.ac
event-config.h.cmake
event_rpcgen.py
util-internal.h

index c45e61e4491abdc8290cf74cb61bf090c575b8ca..e163160212261b4af0334b24beb7556376344b8f 100644 (file)
@@ -412,7 +412,7 @@ endif()
 check_function_keywords("inline" "__inline" "__inline__")
 
 if (HAVE_INLINE)
-    set (EVENT__inline inline)
+    set(EVENT__inline inline)
 elseif (HAVE___INLINE)
     set(EVENT__inline __inline)
 elseif(HAVE___INLINE__)
@@ -421,6 +421,10 @@ else()
     set(EVENT__inline)
 endif()
 
+# __func__/__FUNCTION__ is not a macros in general
+CHECK_SYMBOL_EXISTS("__func__"     "" EVENT__HAVE___func__)
+CHECK_SYMBOL_EXISTS("__FUNCTION__" "" EVENT__HAVE___FUNCTION__)
+
 CHECK_SYMBOL_EXISTS(TAILQ_FOREACH sys/queue.h EVENT__HAVE_TAILQFOREACH)
 CHECK_CONST_EXISTS(CTL_KERN sys/sysctl.h EVENT__HAVE_DECL_CTL_KERN)
 CHECK_CONST_EXISTS(KERN_ARND sys/sysctl.h EVENT__HAVE_DECL_KERN_ARND)
index af809398ae5ec72fe7a0d9caa710987e6a3be18c..6080f5ae30072414e62050c5292967ffc97d70a5 100644 (file)
 /* Version number of package */
 #define EVENT__VERSION "2.1.8-stable"
 
-/* Define to appropriate substitue if compiler doesnt have __func__ */
-#define EVENT____func__ __FUNCTION__
-
 /* Define to `__inline__' or `__inline' if that's what the C compiler
    calls it, or to nothing if 'inline' is not supported under any name.  */
 #define EVENT__inline __inline
index d28c591860b58f5e58a0456d95aae6e881d210bf..fe4b73253ede0efe4f339f6b714e19d0309aaa3e 100644 (file)
@@ -739,21 +739,23 @@ AC_TRY_COMPILE([
        [Define to unsigned int if you dont have it])]
 )
 
+# __func__/__FUNCTION__ is not a macros in general
 AC_MSG_CHECKING([whether our compiler supports __func__])
 AC_TRY_COMPILE([],
- [ const char *cp = __func__; ],
- AC_MSG_RESULT([yes]),
- AC_MSG_RESULT([no])
- AC_MSG_CHECKING([whether our compiler supports __FUNCTION__])
- AC_TRY_COMPILE([],
-   [ const char *cp = __FUNCTION__; ],
-   AC_MSG_RESULT([yes])
-   AC_DEFINE(__func__, __FUNCTION__,
-         [Define to appropriate substitue if compiler doesnt have __func__]),
-   AC_MSG_RESULT([no])
-   AC_DEFINE(__func__, __FILE__,
-         [Define to appropriate substitue if compiler doesnt have __func__])))
-
+  [ const char *cp = __func__; ],
+  [ AC_DEFINE(HAVE___func__, 1, [Define to 1 if compiler have __func__])
+    AC_MSG_RESULT([yes])
+  ],
+  AC_MSG_RESULT([no])
+)
+AC_MSG_CHECKING([whether our compiler supports __FUNCTION__])
+AC_TRY_COMPILE([],
+  [ const char *cp = __FUNCTION__; ],
+  [ AC_DEFINE(HAVE___FUNCTION__, 1, [Define to 1 if compiler have __FUNCTION__])
+    AC_MSG_RESULT([yes])
+  ],
+  AC_MSG_RESULT([no])
+)
 
 # check if we can compile with pthreads
 have_pthreads=no
index 6cfbb953b558adb0518febbb49fbc6fd3cba1109..3f8a9b59273fd56e87e8d3f83e7dda93e9989c4f 100644 (file)
 /* The size of 'void *', as computer by sizeof */
 #define EVENT__SIZEOF_VOID_P @EVENT__SIZEOF_VOID_P@
 
-/* set an alias for whatever __func__ __FUNCTION__ is, what sillyness */
-#if defined (__func__)
-#define EVENT____func__ __func__
-#elif defined(__FUNCTION__)
-#define EVENT____func__  __FUNCTION__
-#else
-#define EVENT____func__ __FILE__
-#endif
-
-
 /* Define to `__inline__' or `__inline' if that's what the C compiler
    calls it, or to nothing if 'inline' is not supported under any name.  */
 #ifndef __cplusplus
 #define EVENT__inline @EVENT__inline@
 #endif
 
+#cmakedefine EVENT__HAVE___func__ 1
+#cmakedefine EVENT__HAVE___FUNCTION__ 1
+
 /* Define to `unsigned' if <sys/types.h> does not define. */
 #define EVENT__size_t @EVENT__size_t@
 
index 2004090a52d0ad78b2cb70bd96d9077a816e38bb..0911ca253c5d8eb81ef8283addcc5dfcc10d74e5 100755 (executable)
@@ -1582,8 +1582,14 @@ class CCodeGenerator:
                  '#include <event2/event.h>\n'
                  '#include <event2/buffer.h>\n'
                  '#include <event2/tag.h>\n\n'
-                 '#if defined(EVENT____func__) && !defined(__func__)\n'
-                 '#define __func__ EVENT____func__\n'
+                 '#if defined(EVENT__HAVE___func__)\n'
+                 '# ifndef __func__\n'
+                 '#  define __func__ __func__\n'
+                 '# endif\n'
+                 '#elif defined(EVENT__HAVE___FUNCTION__)\n'
+                 '# define __func__ __FUNCTION__\n'
+                 '#else\n'
+                 '# define __func__ __FILE__\n'
                  '#endif\n\n'
                  )
 
index 507dceb7427780a3e6fbbf233aacd97fc1a570f2..fe416409f06e897e958bd3e0e7a39d61f1511cde 100644 (file)
@@ -68,8 +68,16 @@ extern "C" {
 #ifdef EVENT__inline
 #define inline EVENT__inline
 #endif
-#if defined(EVENT____func__) && !defined(__func__)
-#define __func__ EVENT____func__
+
+/* Define to appropriate substitute if compiler doesnt have __func__ */
+#if defined(EVENT__HAVE___func__)
+# ifndef __func__
+#  define __func__ __func__
+# endif
+#elif defined(EVENT__HAVE___FUNCTION__)
+# define __func__ __FUNCTION__
+#else
+# define __func__ __FILE__
 #endif
 
 /* A good no-op to use in macro definitions. */