From 1af41b3ba733938541d7cc92ae56dd883638e32f Mon Sep 17 00:00:00 2001
From: "palmer@eniac54.lindenlab.com" <palmer@eniac54.lindenlab.com>
Date: Thu, 30 Jul 2009 18:52:34 -0700
Subject: [PATCH] Fixes to build on linux for DEV-35401.

Moves libllcommon.so to a staging dir for unit tests to work
and gets rid of LL_COMMON_API in forward declarations
---
 indra/cmake/LLAddBuildTest.cmake |  2 +-
 indra/cmake/Linking.cmake        |  1 +
 indra/llcommon/CMakeLists.txt    | 15 +++++++++++++++
 indra/llcommon/llapp.h           |  2 +-
 indra/llcommon/llapr.h           |  4 ++--
 indra/llcommon/llerror.h         |  2 +-
 indra/llcommon/llevent.h         | 10 +++++-----
 indra/llcommon/llevents.h        |  2 +-
 indra/llcommon/lllog.h           |  2 +-
 indra/llcommon/llmetrics.h       |  2 +-
 indra/llcommon/llpreprocessor.h  |  4 +++-
 indra/llcommon/llrun.h           |  2 +-
 indra/llcommon/llsdutil.h        |  2 +-
 indra/llcommon/llstat.h          |  2 +-
 indra/llcommon/llstring.h        |  8 ++++----
 indra/llcommon/llthread.h        |  6 +++---
 indra/llcommon/lluri.h           |  6 +++---
 indra/llcommon/metaclass.h       |  6 +++---
 indra/llcommon/metaproperty.h    |  4 ++--
 indra/llcommon/reflective.h      |  2 +-
 20 files changed, 51 insertions(+), 33 deletions(-)

diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
index aa77bbac65d..013cc5109f3 100644
--- a/indra/cmake/LLAddBuildTest.cmake
+++ b/indra/cmake/LLAddBuildTest.cmake
@@ -123,7 +123,7 @@ MACRO(LL_ADD_PROJECT_UNIT_TESTS project sources)
     IF(WINDOWS)
       set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
     ELSE(WINDOWS)
-      set(LD_LIBRARY_PATH ${ARCH_PREBUILT_DIRS}:/usr/lib)
+      set(LD_LIBRARY_PATH ${ARCH_PREBUILT_DIRS}:${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}:/usr/lib)
     ENDIF(WINDOWS)
 
     IF(LL_TEST_VERBOSE)
diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake
index 578edf99894..30b3cc9994b 100644
--- a/indra/cmake/Linking.cmake
+++ b/indra/cmake/Linking.cmake
@@ -14,6 +14,7 @@ if (NOT STANDALONE)
     endif (VIEWER)
     set(ARCH_PREBUILT_DIRS_RELEASE ${ARCH_PREBUILT_DIRS})
     set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS})
+    set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged .sos")
   elseif (DARWIN)
     set(ARCH_PREBUILT_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release)
     set(ARCH_PREBUILT_DIRS ${ARCH_PREBUILT_DIRS_RELEASE})
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index c46e2583f11..2ecd4ee5d48 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -245,6 +245,20 @@ if(LLCOMMON_LINK_SHARED)
         # Also this directory is shared with RunBuildTest.cmake, y'know, for the tests.
         set_target_properties(llcommon PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR})
     endif(SHARED_LIB_STAGING_DIR)
+
+    get_target_property(LLCOMMON_PATH llcommon LOCATION)
+    get_filename_component(LLCOMMON_FILE ${LLCOMMON_PATH} NAME)
+    add_custom_command(
+        TARGET llcommon POST_BUILD
+        COMMAND ${CMAKE_COMMAND}
+        ARGS
+          -E
+          copy_if_different
+          ${LLCOMMON_FILE}
+          ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/${LLCOMMON_FILE}
+        COMMENT "Copying llcommon to the staging folder."
+        )
+
 else(LLCOMMON_LINK_SHARED)
     add_library (llcommon ${llcommon_SOURCE_FILES})
 endif(LLCOMMON_LINK_SHARED)
@@ -263,6 +277,7 @@ target_link_libraries(
 
 add_dependencies(llcommon stage_third_party_libs)
 
+
 include(LLAddBuildTest)
 SET(llcommon_TEST_SOURCE_FILES
   # WARNING: Please don't write tests against LLCommon or LLMath until this issue is resolved: https://jira.lindenlab.com/jira/browse/DEV-29456
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index cc60ba0b809..35f6f7028dd 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -61,7 +61,7 @@ class LLChildInfo
 };
 #endif
 
-class LLApp
+class LL_COMMON_API LLApp
 {
 	friend class LLErrorThread;
 public:
diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h
index f968eabc181..0898aeec470 100644
--- a/indra/llcommon/llapr.h
+++ b/indra/llcommon/llapr.h
@@ -167,8 +167,8 @@ template <typename Type> class LLAtomic32
 	apr_uint32_t mData;
 };
 
-typedef LL_COMMON_API LLAtomic32<U32> LLAtomicU32;
-typedef LL_COMMON_API LLAtomic32<S32> LLAtomicS32;
+typedef LLAtomic32<U32> LLAtomicU32;
+typedef LLAtomic32<S32> LLAtomicS32;
 
 // File IO convenience functions.
 // Returns NULL if the file fails to openm sets *sizep to file size of not NULL
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index 6ccdf2174b0..4f68fb9f769 100644
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -129,7 +129,7 @@ namespace LLError
 		They are not intended for general use.
 	*/
 	
-	class LL_COMMON_API CallSite;
+	class CallSite;
 	
 	class LL_COMMON_API Log
 	{
diff --git a/indra/llcommon/llevent.h b/indra/llcommon/llevent.h
index 192cb84fea3..0ea7cf4ae83 100644
--- a/indra/llcommon/llevent.h
+++ b/indra/llcommon/llevent.h
@@ -41,10 +41,10 @@
 namespace LLOldEvents
 {
 
-class LL_COMMON_API LLEventListener;
-class LL_COMMON_API LLEvent;
-class LL_COMMON_API LLEventDispatcher;
-class LL_COMMON_API LLObservable;
+class LLEventListener;
+class LLEvent;
+class LLEventDispatcher;
+class LLObservable;
 
 // Abstract event. All events derive from LLEvent
 class LL_COMMON_API LLEvent : public LLThreadSafeRefCount
@@ -104,7 +104,7 @@ class LL_COMMON_API LLSimpleListener : public LLEventListener
 	std::vector<LLEventDispatcher *> mDispatchers;
 };
 
-class LL_COMMON_API LLObservable; // defined below
+class LLObservable; // defined below
 
 // A structure which stores a Listener and its metadata
 struct LLListenerEntry
diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index 8ebffc008fc..6df418fe5a5 100644
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -172,7 +172,7 @@ class LL_COMMON_API LLListenerOrPumpName
 /*****************************************************************************
 *   LLEventPumps
 *****************************************************************************/
-class LL_COMMON_API LLEventPump;
+class LLEventPump;
 
 /**
  * LLEventPumps is a Singleton manager through which one typically accesses
diff --git a/indra/llcommon/lllog.h b/indra/llcommon/lllog.h
index b0ec570c018..4b6777bb9c7 100644
--- a/indra/llcommon/lllog.h
+++ b/indra/llcommon/lllog.h
@@ -39,7 +39,7 @@
 
 class LLLogImpl;
 class LLApp;
-class LL_COMMON_API LLSD;
+class LLSD;
 
 class LL_COMMON_API LLLog
 {
diff --git a/indra/llcommon/llmetrics.h b/indra/llcommon/llmetrics.h
index 11e10a5a2e8..f6f49eb4562 100644
--- a/indra/llcommon/llmetrics.h
+++ b/indra/llcommon/llmetrics.h
@@ -36,7 +36,7 @@
 #define LL_LLMETRICS_H
 
 class LLMetricsImpl;
-class LL_COMMON_API LLSD;
+class LLSD;
 
 class LL_COMMON_API LLMetrics
 {
diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h
index ed6ca9a25fb..671e85b16f0 100644
--- a/indra/llcommon/llpreprocessor.h
+++ b/indra/llcommon/llpreprocessor.h
@@ -138,12 +138,14 @@
 #if LL_WINDOWS
 #define LL_DLLEXPORT __declspec(dllexport)
 #define LL_DLLIMPORT __declspec(dllimport)
+#elif LL_LINUX
+#define LL_DLLEXPORT __attribute__ ((visibility("default")))
+#define LL_DLLIMPORT
 #else
 #define LL_DLLEXPORT
 #define LL_DLLIMPORT
 #endif // LL_WINDOWS
 
-
 #if LL_COMMON_LINK_SHARED
 # if LL_COMMON_BUILD
 #   define LL_COMMON_API LL_DLLEXPORT
diff --git a/indra/llcommon/llrun.h b/indra/llcommon/llrun.h
index afe65fd734e..1fc9925df9c 100644
--- a/indra/llcommon/llrun.h
+++ b/indra/llcommon/llrun.h
@@ -38,7 +38,7 @@
 #include <vector>
 #include <boost/shared_ptr.hpp>
 
-class LL_COMMON_API LLRunnable;
+class LLRunnable;
 
 /** 
  * @class LLRunner
diff --git a/indra/llcommon/llsdutil.h b/indra/llcommon/llsdutil.h
index 8cb459d81b0..6a6c3966870 100644
--- a/indra/llcommon/llsdutil.h
+++ b/indra/llcommon/llsdutil.h
@@ -35,7 +35,7 @@
 #ifndef LL_LLSDUTIL_H
 #define LL_LLSDUTIL_H
 
-class LL_COMMON_API LLSD;
+class LLSD;
 
 // U32
 LL_COMMON_API LLSD ll_sd_from_U32(const U32);
diff --git a/indra/llcommon/llstat.h b/indra/llcommon/llstat.h
index 5d77215bebb..64ea8e5b40c 100644
--- a/indra/llcommon/llstat.h
+++ b/indra/llcommon/llstat.h
@@ -40,7 +40,7 @@
 #include "llframetimer.h"
 #include "llfile.h"
 
-class	LL_COMMON_API LLSD;
+class	LLSD;
 
 // Set this if longer stats are needed
 #define ENABLE_LONG_TIME_STATS	0
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index eb36dafee37..24a8d49a54c 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -345,9 +345,9 @@ class LLStringUtilBase
 template<class T> std::basic_string<T> LLStringUtilBase<T>::null;
 template<class T> std::string LLStringUtilBase<T>::sLocale;
 
-typedef LL_COMMON_API LLStringUtilBase<char> LLStringUtil;
-typedef LL_COMMON_API LLStringUtilBase<llwchar> LLWStringUtil;
-typedef LL_COMMON_API std::basic_string<llwchar> LLWString;
+typedef LLStringUtilBase<char> LLStringUtil;
+typedef LLStringUtilBase<llwchar> LLWStringUtil;
+typedef std::basic_string<llwchar> LLWString;
 
 //@ Use this where we want to disallow input in the form of "foo"
 //  This is used to catch places where english text is embedded in the code
@@ -419,7 +419,7 @@ LL_COMMON_API std::string rawstr_to_utf8(const std::string& raw);
 //
 // We should never use UTF16 except when communicating with Win32!
 //
-typedef LL_COMMON_API std::basic_string<U16> llutf16string;
+typedef std::basic_string<U16> llutf16string;
 
 LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str, S32 len);
 LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str);
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index e6bf95aaa96..c3d7650bd9b 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -38,9 +38,9 @@
 
 #include "apr_thread_cond.h"
 
-class LL_COMMON_API LLThread;
-class LL_COMMON_API LLMutex;
-class LL_COMMON_API LLCondition;
+class LLThread;
+class LLMutex;
+class LLCondition;
 
 class LL_COMMON_API LLThread
 {
diff --git a/indra/llcommon/lluri.h b/indra/llcommon/lluri.h
index 33fd88b4979..eb5c5203eb6 100644
--- a/indra/llcommon/lluri.h
+++ b/indra/llcommon/lluri.h
@@ -37,9 +37,9 @@
 
 #include <string>
 
-class LL_COMMON_API LLSD;
-class LL_COMMON_API LLUUID;
-class LL_COMMON_API LLApp;
+class LLSD;
+class LLUUID;
+class LLApp;
 
 /** 
  *
diff --git a/indra/llcommon/metaclass.h b/indra/llcommon/metaclass.h
index 8b93e0d6d59..f38bcd2d57c 100644
--- a/indra/llcommon/metaclass.h
+++ b/indra/llcommon/metaclass.h
@@ -40,9 +40,9 @@
 
 #include "stdtypes.h"
 
-class LL_COMMON_API LLReflective;
-class LL_COMMON_API LLMetaProperty;
-class LL_COMMON_API LLMetaMethod;
+class LLReflective;
+class LLMetaProperty;
+class LLMetaMethod;
 class LL_COMMON_API LLMetaClass
 {
 public:
diff --git a/indra/llcommon/metaproperty.h b/indra/llcommon/metaproperty.h
index 96e1b314a43..6c016c56ddc 100644
--- a/indra/llcommon/metaproperty.h
+++ b/indra/llcommon/metaproperty.h
@@ -39,8 +39,8 @@
 #include "llsd.h"
 #include "reflective.h"
 
-class LL_COMMON_API LLMetaClass;
-class LL_COMMON_API LLReflective;
+class LLMetaClass;
+class LLReflective;
 class LL_COMMON_API LLMetaProperty
 {
 public:
diff --git a/indra/llcommon/reflective.h b/indra/llcommon/reflective.h
index 541712538be..a13537681d7 100644
--- a/indra/llcommon/reflective.h
+++ b/indra/llcommon/reflective.h
@@ -35,7 +35,7 @@
 #ifndef LL_REFLECTIVE_H
 #define LL_REFLECTIVE_H
 
-class LL_COMMON_API LLMetaClass;
+class LLMetaClass;
 class LL_COMMON_API LLReflective
 {
 public:
-- 
GitLab