From 25acf39d28bb4d6eb4126a967f2235bde769ff78 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Fri, 27 Sep 2013 06:46:31 +0000
Subject: [PATCH] trying to fix dynamic windows build

---
 CMakeLists.txt | 48 ++++++++++++++++++++++++++----------------------
 1 file changed, 26 insertions(+), 22 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index f5e7994e3d..9171b64d7d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1240,6 +1240,7 @@ if(WIN32 AND NOT MSVC OR CYGWIN)
     set(FLAGS "${FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/Win32Icon.res")
   endif(HAVE_64BIT_SIZE_T)
   if(ENABLE_BUILD_DYNAMIC)
+    set(FLAGS "${FLAGS} -Wl,-Bstatic -lgfortran")
     set_target_properties(gmsh PROPERTIES 
       LINK_FLAGS "${FLAGS} -Wl,--enable-auto-import")
     set(LIBGMSH_DEF "libGmsh-${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.def")
@@ -1355,32 +1356,35 @@ if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
     # install .def file
     install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${LIBGMSH_DEF} 
             DESTINATION ${GMSH_LIB})
-    # install these DLLs until we figure out how to link them in statically
-    # NB (using mingw-w64):
-    #   stc++ can be linked statically with -static-libstdc++
-    #   gfortran with -Wl,-Bstatic -lgfortran  (-static-libgfortran does not work 
-    #     for c++ linker)
-    #   unfortunately -static-libgcc causes link error here (multiple definition 
-    #     of ...)
-    # Also, find_program does not work in cross-compilation mode -> ask the compiler instead
-    execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libgfortran-3.dll 
-                    OUTPUT_VARIABLE GFORTRAN_DLL OUTPUT_STRIP_TRAILING_WHITESPACE)
+    # install these DLLs until we figure out how to link them in statically (libstc++ and
+    # libgcc should be linkable statically with -static-libstdc++ and -static-libgcc but with
+    # current mingw64 toolchain it does not work). Also, when cross-compilating find_program
+    # does not work -> ask the compiler instead
     if(HAVE_64BIT_SIZE_T)
-      execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libgcc_s_seh-1.dll
-                      OUTPUT_VARIABLE GCC_DLL OUTPUT_STRIP_TRAILING_WHITESPACE)
+      find_program(GCC_DLL libgcc_s_sjlj-1.dll)
     else(HAVE_64BIT_SIZE_T)
-      execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libgcc_s_sjlj-1.dll
-                      OUTPUT_VARIABLE GCC_DLL OUTPUT_STRIP_TRAILING_WHITESPACE)
+      find_program(GCC_DLL libgcc_s_seh-1.dll)
     endif(HAVE_64BIT_SIZE_T)
-    execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libstdc++-6.dll
-                    OUTPUT_VARIABLE STDC_DLL OUTPUT_STRIP_TRAILING_WHITESPACE)
-    get_filename_component(STD_DLL ${STDC_DLL} ABSOLUTE)
-    get_filename_component(GFORTRAN_DLL ${GFORTRAN_DLL} ABSOLUTE)
-    get_filename_component(GCC_DLL ${GCC_DLL} ABSOLUTE)
-    if(GCC_DLL AND GFORTRAN_DLL AND STDC_DLL)
+    find_program(STDC_DLL libstdc++-6.dll)
+    if(NOT GCC_DLL)
+      if(HAVE_64BIT_SIZE_T)
+        execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libgcc_s_seh-1.dll
+                        OUTPUT_VARIABLE GCC_DLL OUTPUT_STRIP_TRAILING_WHITESPACE)
+      else(HAVE_64BIT_SIZE_T)
+        execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libgcc_s_sjlj-1.dll
+                        OUTPUT_VARIABLE GCC_DLL OUTPUT_STRIP_TRAILING_WHITESPACE)
+      endif(HAVE_64BIT_SIZE_T)
+      get_filename_component(GCC_DLL ${GCC_DLL} ABSOLUTE)
+    endif(NOT GCC_DLL)
+    if(NOT STDC_DLL)
+      execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libstdc++-6.dll
+                      OUTPUT_VARIABLE STDC_DLL OUTPUT_STRIP_TRAILING_WHITESPACE)
+      get_filename_component(STD_DLL ${STDC_DLL} ABSOLUTE)
+    endif(NOT STDC_DLL)
+    if(GCC_DLL AND STDC_DLL)
       message(STATUS "Will install extra DLLs for Windows")
-      install(FILES ${GCC_DLL} ${GFORTRAN_DLL} ${STDC_DLL} DESTINATION ${GMSH_LIB})
-    endif(GCC_DLL AND GFORTRAN_DLL AND STDC_DLL)
+      install(FILES ${GCC_DLL} ${STDC_DLL} DESTINATION ${GMSH_LIB})
+    endif(GCC_DLL AND STDC_DLL)
   else(WIN32 AND NOT MSVC OR CYGWIN)
     install(TARGETS shared DESTINATION ${GMSH_LIB} OPTIONAL)
   endif(WIN32 AND NOT MSVC OR CYGWIN)
-- 
GitLab