On 14/03/15 10:35 PM, DRC wrote:
> I'll look into it. There are a couple of obvious bugs ("defaker"
> instead of "dlfaker"), and I think I can make CMake do a little more
> of the work instead of requiring so many ifdefs

Sorry, looking at that 3rd patch again, besides s/defaker/dlfaker/ and
DEFAKER/DLFAKER/ the *LIB_NAME should be set outside the ifdef like
lib${RRFAKER_BASE_NAME}.so, as in attached.

-Nathan

>From 5c291ee9db13affe0a11ad4971de4aa61cf8535d Mon Sep 17 00:00:00 2001
From: Nathan Kidd <nk...@opentext.com>
Date: Tue, 3 Mar 2015 17:50:49 -0500
Subject: [PATCH] Support custom vendor lib names

To set custom library names use:
cmake -DRRFAKER_BASE_NAME=vendorrrfaker \
      -DDLFAKER_BASE_NAME=vendordlfaker \
      -DGLFAKER_BASE_NAME=vendorglfaker

This increases reliability, working around problems where
it is too easy to load another vendor's lib because of the app startup
scripts modifying LD_LIBRARY_PATH order, etc..

Files in release/ are left unchanged since they specify package names and
installation dirs specific to the VirtualGL.org release, and vendors
should thus use their own packaging scripts.
---
 CMakeLists.txt        | 16 ++++++++++++++++
 server/CMakeLists.txt | 28 ++++++++++++++--------------
 server/dlfaker.c      | 29 ++++++++++++++++++++++-------
 3 files changed, 52 insertions(+), 21 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6ecd4ee..d1261bd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -290,6 +290,22 @@ option(VGL_BUILDSERVER "Build VirtualGL server components"
 if(VGL_BUILDSERVER)
 	message(STATUS "Building VirtualGL server components")
 
+	if (NOT DEFINED RRFAKER_BASE_NAME)
+		set(RRFAKER_BASE_NAME "rrfaker")
+	endif()
+	set(RRFAKER_LIB_NAME  "lib${RRFAKER_BASE_NAME}.so")
+	if (NOT DEFINED DLFAKER_BASE_NAME)
+		set(DLFAKER_BASE_NAME "dlfaker")
+	endif()
+	set(DLFAKER_LIB_NAME  "lib${DLFAKER_BASE_NAME}.so")
+	if (NOT DEFINED GEFAKER_BASE_NAME)
+		set(GEFAKER_BASE_NAME "gefaker")
+	endif()
+	set(GEFAKER_LIB_NAME  "lib${GEFAKER_BASE_NAME}.so")
+	message(STATUS "RRFAKER_LIB_NAME = ${RRFAKER_LIB_NAME}")
+	message(STATUS "DLFAKER_LIB_NAME = ${DLFAKER_LIB_NAME}")
+	message(STATUS "GEFAKER_LIB_NAME = ${GEFAKER_LIB_NAME}")
+
 	if("${CMAKE_INSTALL_PREFIX}" STREQUAL "/opt/VirtualGL")
 		set(DEFAULT_VGL_FAKELIBDIR ${CMAKE_INSTALL_PREFIX}/fakelib${BITS})
 		set(DEFAULT_VGL_LIBDIR ${CMAKE_INSTALL_PREFIX}/lib${BITS})
diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt
index d4669fc..4512240 100644
--- a/server/CMakeLists.txt
+++ b/server/CMakeLists.txt
@@ -67,40 +67,40 @@ set(RRFAKER_SOURCES
 if(VGL_USEXV)
 	set(RRFAKER_SOURCES ${RRFAKER_SOURCES};XVTrans.cpp)
 endif()
-add_library(rrfaker SHARED ${RRFAKER_SOURCES})
+add_library(${RRFAKER_BASE_NAME} SHARED ${RRFAKER_SOURCES})
 if(MAPFLAG)
 	set_source_files_properties(faker-sym.cpp PROPERTIES
 		OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/faker-mapfile)
-	set_target_properties(rrfaker PROPERTIES
+	set_target_properties(${RRFAKER_BASE_NAME} PROPERTIES
 		LINK_FLAGS "-z defs ${MAPFLAG}${CMAKE_CURRENT_BINARY_DIR}/faker-mapfile")
 else()
-	set_target_properties(rrfaker PROPERTIES LINK_FLAGS "-z defs")
+	set_target_properties(${RRFAKER_BASE_NAME} PROPERTIES LINK_FLAGS "-z defs")
 endif()
 if(VGL_FAKEXCB)
 	set(LIBXCB xcb xcb-glx xcb-keysyms X11-xcb)
 endif()
-target_link_libraries(rrfaker vglcommon ${FBXFAKERLIB} vglsocket m
+target_link_libraries(${RRFAKER_BASE_NAME} vglcommon ${FBXFAKERLIB} vglsocket m
 	${OPENGL_gl_LIBRARY} ${LIBDL} ${LIBXCB})
 if(CMAKE_SYSTEM_NAME STREQUAL "SunOS" AND CMAKE_COMPILER_IS_GNUCXX)
 	# For some reason, on SunOS/GCC CMake tries to use the C compiler to link
 	# C++ shared libs.  Grrr...
-	target_link_libraries(rrfaker stdc++)
+	target_link_libraries(${RRFAKER_BASE_NAME} stdc++)
 endif()
-install(TARGETS rrfaker DESTINATION ${VGL_LIBDIR})
+install(TARGETS ${RRFAKER_BASE_NAME} DESTINATION ${VGL_LIBDIR})
 install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory
 	\$ENV{DESTDIR}${VGL_FAKELIBDIR})")
 install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
-	${VGL_LIBDIR}/librrfaker.so
+	${VGL_LIBDIR}/${RRFAKER_LIB_NAME}
 	\$ENV{DESTDIR}${VGL_FAKELIBDIR}/libGL.so)")
 
-add_library(dlfaker SHARED dlfaker.c)
-target_link_libraries(dlfaker ${LIBDL})
-install(TARGETS dlfaker DESTINATION ${VGL_LIBDIR})
+add_library(${DLFAKER_BASE_NAME} SHARED dlfaker.c)
+target_link_libraries(${DLFAKER_BASE_NAME} ${LIBDL})
+install(TARGETS ${DLFAKER_BASE_NAME} DESTINATION ${VGL_LIBDIR})
 
-add_library(gefaker SHARED gefaker.c)
-set_target_properties(gefaker PROPERTIES LINK_FLAGS "-z defs")
-target_link_libraries(gefaker ${LIBDL})
-install(TARGETS gefaker DESTINATION ${VGL_LIBDIR})
+add_library(${GEFAKER_BASE_NAME} SHARED gefaker.c)
+set_target_properties(${GEFAKER_BASE_NAME} PROPERTIES LINK_FLAGS "-z defs")
+target_link_libraries(${GEFAKER_BASE_NAME} ${LIBDL})
+install(TARGETS ${GEFAKER_BASE_NAME} DESTINATION ${VGL_LIBDIR})
 
 set(HEADERS ../common/rr.h rrtransport.h)
 install(FILES ${HEADERS} DESTINATION ${VGL_INCDIR})
diff --git a/server/dlfaker.c b/server/dlfaker.c
index f3e7fed..6f3e5da 100644
--- a/server/dlfaker.c
+++ b/server/dlfaker.c
@@ -20,6 +20,21 @@
 
 extern void *_vgl_dlopen(const char *, int);
 
+const char *rrfakerlibname=
+#ifdef RRFAKER_LIB_NAME
+RRFAKER_LIB_NAME
+#else
+"librrfaker.so"
+#endif
+;
+
+const char *dlfakerlibname=
+#ifdef DLFAKER_BASE_NAME
+DLFAKER_LIB_NAME
+#else
+"libdlfaker.so"
+#endif
+;
 
 /* If an application uses dlopen()/dlsym() to load functions from libGL or
    libX11, this bypasses the LD_PRELOAD mechanism.  Thus, VirtualGL has to
@@ -49,8 +64,8 @@ void *dlopen(const char *filename, int flag)
 			filename? filename:"NULL", flag);
 	}
 
-	if((env=getenv(envname))==NULL || strlen(env)<1)
-		env="librrfaker.so";
+	if((env=getenv(envname))!=NULL && strlen(env)>0)
+		rrfakerlibname=env;
 	if(filename &&
 		(!strncmp(filename, "libGL.", 6) || strstr(filename, "/libGL.")
 			|| !strncmp(filename, "libX11.", 7) || strstr(filename, "/libX11.")
@@ -61,16 +76,16 @@ void *dlopen(const char *filename, int flag)
 		if(verbose)
 			fprintf(stderr,
 				"[VGL] NOTICE: Replacing dlopen(\"%s\") with dlopen(\"%s\")\n",
-				filename? filename:"NULL", env? env:"NULL");
-		retval=_vgl_dlopen(env, flag);
+				filename? filename:"NULL", rrfakerlibname);
+		retval=_vgl_dlopen(rrfakerlibname, flag);
 	}
 	else if(filename && (!strncmp(filename, "libdl.", 6)
 		|| strstr(filename, "/libdl.")))
 	{
 		if(verbose)
-			fprintf(stderr, "[VGL] NOTICE: Replacing dlopen(\"%s\") with dlopen(\"libdlfaker.so\")\n",
-				filename? filename:"NULL");
-		retval=_vgl_dlopen("libdlfaker.so", flag);
+			fprintf(stderr, "[VGL] NOTICE: Replacing dlopen(\"%s\") with dlopen(\"%s\")\n",
+				filename? filename:"NULL", dlfakerlibname);
+		retval=_vgl_dlopen(dlfakerlibname, flag);
 	}
 	else retval=_vgl_dlopen(filename, flag);
 
-- 
1.9.1


------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
VirtualGL-Devel mailing list
VirtualGL-Devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/virtualgl-devel

Reply via email to