From a54989c2295ddd7f37abb94a9ac10ec9b4f8c43d Mon Sep 17 00:00:00 2001 From: Chun-wei Fan Date: Fri, 20 Oct 2023 10:46:42 +0800 Subject: [PATCH] as-macros-private.h: Define macros for visibility for clang-cl On clang-cl (i.e. Visual Studio-like meaning _MSC_VER is defined) builds, symbols in shared builds have visibility to be hidden by default, and decorating symbols with GCC's default visibility is not enough to export the symbol. Some private symbols must still be exported from the appstream DLL for the tools and tests, so define versions of the visibility macros that are suitable for use for clang-cl, and add another (private) macro that is used to export symbols that do not fall into sections where we explicitly want visibility to be hidden. Consequently, use the macros in as-desktop-entry.h so that we don't fall into the situation where clang-cl complains as we are attempting to do a __declspec(dllexport) in a hidden visibility section. --- src/as-desktop-entry.h | 6 ++---- src/as-macros-private.h | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/as-desktop-entry.h b/src/as-desktop-entry.h index a9e7f142b..1a59e4ced 100644 --- a/src/as-desktop-entry.h +++ b/src/as-desktop-entry.h @@ -27,8 +27,7 @@ #include "as-metadata.h" #include "as-utils-private.h" -G_BEGIN_DECLS -#pragma GCC visibility push(hidden) +AS_BEGIN_PRIVATE_DECLS typedef GPtrArray *(*AsTranslateDesktopTextFn) (const GKeyFile *de, const gchar *text, @@ -54,7 +53,6 @@ gboolean as_desktop_entry_parse_file (AsComponent *cpt, gpointer user_data, GError **error); -#pragma GCC visibility pop -G_END_DECLS +AS_END_PRIVATE_DECLS #endif /* __AS_DESKTOP_ENTRY_H */ diff --git a/src/as-macros-private.h b/src/as-macros-private.h index d7d4bddaa..ada678cca 100644 --- a/src/as-macros-private.h +++ b/src/as-macros-private.h @@ -26,6 +26,22 @@ #include "as-macros.h" G_BEGIN_DECLS + +#ifdef _MSC_VER + +#define AS_BEGIN_PRIVATE_DECLS G_BEGIN_DECLS +#define AS_END_PRIVATE_DECLS G_END_DECLS + +#ifdef AS_STATIC +# define AS_INTERNAL_VISIBLE +#else +# define AS_INTERNAL_VISIBLE __declspec(dllexport) +#endif + +#define AS_INTERNAL_API AS_INTERNAL_VISIBLE + +#else + #pragma GCC visibility push(hidden) #define AS_BEGIN_PRIVATE_DECLS \ @@ -35,6 +51,9 @@ G_BEGIN_DECLS #define AS_END_PRIVATE_DECLS _Pragma ("GCC visibility pop") G_END_DECLS #define AS_INTERNAL_VISIBLE __attribute__((visibility("default"))) +#define AS_INTERNAL_API + +#endif /** * as_str_equal0: @@ -107,7 +126,10 @@ G_BEGIN_DECLS } \ G_STMT_END +#ifndef _MSC_VER #pragma GCC visibility pop +#endif + G_END_DECLS #endif /* __AS_MACROS_PRIVATE_H */