From fd3677b9606851f5f29bcd663fd37137eb84abd3 Mon Sep 17 00:00:00 2001
From: Antonio Ospite <ospite@studenti.unina.it>
Date: Wed, 28 Mar 2012 10:02:03 +0200
Subject: [PATCH 1/1] am7xxx: control shared library symbols visibility

Export as public symbols only those really needed, without this change
some symbols from serialize.c (get_8, get_le32, put_8, put_le32) were
public too.

Use -fvisibility=hidden so we don't need to explicitly mark symbols as
local.
---
 CMakeLists.txt |  1 +
 src/am7xxx.c   | 34 +++++++++++++++++++++++++---------
 2 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 75b7b7c..fa3f876 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -40,6 +40,7 @@ if (CMAKE_COMPILER_IS_GNUCC)
   endif()
 
   add_flags(CMAKE_C_FLAGS
+    -fvisibility=hidden
     -fno-common
     -Wall
     -Wextra
diff --git a/src/am7xxx.c b/src/am7xxx.c
index 1035e23..8087f89 100644
--- a/src/am7xxx.c
+++ b/src/am7xxx.c
@@ -36,6 +36,20 @@
 #  define  __attribute__(x)  /*NOTHING*/
 #endif
 
+/* Control shared library symbols visibility */
+#if defined _WIN32 || defined __CYGWIN__
+	#define AM7XXX_PUBLIC __declspec(dllexport)
+	#define AM7XXX_LOCAL
+#else
+	#if __GNUC__ >= 4
+		#define AM7XXX_PUBLIC __attribute__ ((visibility ("default")))
+		#define AM7XXX_LOCAL  __attribute__ ((visibility ("hidden")))
+	#else
+		#define AM7XXX_PUBLIC
+		#define AM7XXX_LOCAL
+	#endif
+#endif
+
 static void log_message(am7xxx_context *ctx,
 			int level,
 			const char *function,
@@ -551,7 +565,9 @@ out:
 	return ret;
 }
 
-int am7xxx_init(am7xxx_context **ctx)
+/* Public API */
+
+AM7XXX_PUBLIC int am7xxx_init(am7xxx_context **ctx)
 {
 	int ret = 0;
 
@@ -590,7 +606,7 @@ out:
 	return ret;
 }
 
-void am7xxx_shutdown(am7xxx_context *ctx)
+AM7XXX_PUBLIC void am7xxx_shutdown(am7xxx_context *ctx)
 {
 	am7xxx_device *current;
 
@@ -612,12 +628,12 @@ void am7xxx_shutdown(am7xxx_context *ctx)
 	ctx = NULL;
 }
 
-void am7xxx_set_log_level(am7xxx_context *ctx, am7xxx_log_level log_level)
+AM7XXX_PUBLIC void am7xxx_set_log_level(am7xxx_context *ctx, am7xxx_log_level log_level)
 {
 	ctx->log_level = log_level;
 }
 
-int am7xxx_open_device(am7xxx_context *ctx, am7xxx_device **dev,
+AM7XXX_PUBLIC int am7xxx_open_device(am7xxx_context *ctx, am7xxx_device **dev,
 		       unsigned int device_index)
 {
 	int ret;
@@ -639,7 +655,7 @@ int am7xxx_open_device(am7xxx_context *ctx, am7xxx_device **dev,
 	return ret;
 }
 
-int am7xxx_close_device(am7xxx_device *dev)
+AM7XXX_PUBLIC int am7xxx_close_device(am7xxx_device *dev)
 {
 	if (dev == NULL) {
 		fatal("dev must not be NULL!\n");
@@ -653,7 +669,7 @@ int am7xxx_close_device(am7xxx_device *dev)
 	return 0;
 }
 
-int am7xxx_get_device_info(am7xxx_device *dev,
+AM7XXX_PUBLIC int am7xxx_get_device_info(am7xxx_device *dev,
 			   am7xxx_device_info *device_info)
 {
 	int ret;
@@ -692,7 +708,7 @@ int am7xxx_get_device_info(am7xxx_device *dev,
 	return 0;
 }
 
-int am7xxx_calc_scaled_image_dimensions(am7xxx_device *dev,
+AM7XXX_PUBLIC int am7xxx_calc_scaled_image_dimensions(am7xxx_device *dev,
 					unsigned int upscale,
 					unsigned int original_width,
 					unsigned int original_height,
@@ -754,7 +770,7 @@ int am7xxx_calc_scaled_image_dimensions(am7xxx_device *dev,
 	return 0;
 }
 
-int am7xxx_send_image(am7xxx_device *dev,
+AM7XXX_PUBLIC int am7xxx_send_image(am7xxx_device *dev,
 		      am7xxx_image_format format,
 		      unsigned int width,
 		      unsigned int height,
@@ -790,7 +806,7 @@ int am7xxx_send_image(am7xxx_device *dev,
 	return send_data(dev, image, image_size);
 }
 
-int am7xxx_set_power_mode(am7xxx_device *dev, am7xxx_power_mode mode)
+AM7XXX_PUBLIC int am7xxx_set_power_mode(am7xxx_device *dev, am7xxx_power_mode mode)
 {
 	int ret;
 	struct am7xxx_header h = {
-- 
2.1.4