Add a BUILD_STATIC option which links statically against libgcc and libstdc++ (if applicable.)  Remove the corresponding code from build-xorg.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4608 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ef34705..e67feb4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -107,6 +107,44 @@
   message(STATUS "32-bit build")
 endif()
 
+# This ensures that we don't depend on libstdc++ or libgcc
+if(CMAKE_COMPILER_IS_GNUCXX AND NOT APPLE AND NOT CYGWIN)
+  option(BUILD_STATIC
+    "Link statically against libgcc and libstdc++, if possible" OFF)
+  if(BUILD_STATIC)
+    # For some reason, simply passing ${CMAKE_CXX_FLAGS} to the compiler in
+    # execute_process() doesn't work.  Grrr...
+    if(64BIT)
+      execute_process(COMMAND ${CMAKE_CXX_COMPILER} -m64
+        --print-file-name=libstdc++.a OUTPUT_VARIABLE LIBSTDCPLUSPLUS
+        RESULT_VARIABLE RESULT)
+    else()
+      execute_process(COMMAND ${CMAKE_CXX_COMPILER} -m32
+        --print-file-name=libstdc++.a OUTPUT_VARIABLE LIBSTDCPLUSPLUS
+        RESULT_VARIABLE RESULT)
+    endif()
+    string(REGEX REPLACE "\n" "" LIBSTDCPLUSPLUS ${LIBSTDCPLUSPLUS})
+    if(RESULT MATCHES 0 AND LIBSTDCPLUSPLUS)
+      message(STATUS "Linking with static libstdc++:\n   ${LIBSTDCPLUSPLUS}")
+      file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/staticlib)
+      execute_process(COMMAND ${CMAKE_COMMAND} -E remove
+        ${CMAKE_BINARY_DIR}/staticlib/libstdc++.a)
+      execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
+        ${LIBSTDCPLUSPLUS} ${CMAKE_BINARY_DIR}/staticlib/libstdc++.a)
+      set(CMAKE_EXE_LINKER_FLAGS
+        "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_BINARY_DIR}/staticlib")
+      set(CMAKE_SHARED_LINKER_FLAGS
+        "${CMAKE_SHARED_LINKER_FLAGS} -L${CMAKE_BINARY_DIR}/staticlib")
+    else()
+      message(WARNING Cannot find static libstdc++.  VirtualGL will depend on dynamic libstdc++.)
+    endif()
+    add_definitions(-static-libgcc)
+    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc")
+    set(CMAKE_SHARED_LINKER_FLAGS
+      "${CMAKE_SHARED_LINKER_FLAGS} -static-libgcc")
+  endif()
+endif()
+
 # CMake doesn't properly support resource compilation with MinGW.  Boo!
 if(MINGW)
   if(NOT DEFINED RC)
diff --git a/unix/build-xorg b/unix/build-xorg
index ffa04e2..e71f6dd 100755
--- a/unix/build-xorg
+++ b/unix/build-xorg
@@ -116,7 +116,7 @@
 
     # Build VNC
     echo "*** Building VNC ***"
-    cmake -G"Unix Makefiles" ${1+"$@"} -DUSE_INCLUDED_ZLIB=1 $SRCDIR
+    cmake -G"Unix Makefiles" ${1+"$@"} -DUSE_INCLUDED_ZLIB=1 -DUSE_INCLUDED_FLTK=1 -DBUILD_STATIC=1 $SRCDIR
     $MAKE
 
     # Build Xorg
@@ -291,9 +291,9 @@
     if [ "$CXXFLAGS" = "" ]; then
 	CXXFLAGS=-O3
     fi
-    CFLAGS="$CFLAGS -static-libgcc -fPIC"
-    CXXFLAGS="$CXXFLAGS -static-libgcc -fPIC"
-    LDFLAGS="$LDFLAGS -static-libgcc -L`pwd`/xorg.build/syslib"
+    CFLAGS="$CFLAGS -fPIC"
+    CXXFLAGS="$CXXFLAGS -fPIC"
+    LDFLAGS="$LDFLAGS -L`pwd`/xorg.build/syslib"
     echo CC = $CC
     echo CXX = $CXX
     echo CFLAGS = $CFLAGS
@@ -302,16 +302,6 @@
     if [[ $CFLAGS = *-m32* ]]; then
 	CFGHOST="--host i686-pc-linux-gnu"
     fi
-    if [ -f ./xorg.build/syslib/libstdc++.a ]; then
-	rm -f ./xorg.build/syslib/libstdc++.a
-    fi
-    LIBSTDCPLUSPLUS=`$CC $CFLAGS -print-file-name=libstdc++.a`
-    if [ ! -f $LIBSTDCPLUSPLUS ]; then
-	echo Cannot find suitable libstdc++.a.  Aborting ...
-	exit 1
-    else
-	ln -fs $LIBSTDCPLUSPLUS ./xorg.build/syslib
-    fi
     STATICLIBS='libcrypto.a libz.a'
     for lib in $STATICLIBS; do
 	if [ -f ./xorg.build/syslib/$lib ]; then