Author: brane
Date: Tue Jul  3 11:42:06 2018
New Revision: 1834948

URL: http://svn.apache.org/viewvc?rev=1834948&view=rev
Log:
In the CMake build, make sure that the DLL import library is generated.

* CMakeLists.txt: Define the export blacklist as in SConstruct.
   Generate a Windows DEF file and add it to the shared-lib sources.
* build/SerfWindowsToolkit.cmake (SerfWindowsGenDef): New function.
   Generates the DEF file, apparently just like build/gen_def.py.

Modified:
    serf/trunk/CMakeLists.txt
    serf/trunk/build/SerfWindowsToolkit.cmake

Modified: serf/trunk/CMakeLists.txt
URL: 
http://svn.apache.org/viewvc/serf/trunk/CMakeLists.txt?rev=1834948&r1=1834947&r2=1834948&view=diff
==============================================================================
--- serf/trunk/CMakeLists.txt (original)
+++ serf/trunk/CMakeLists.txt Tue Jul  3 11:42:06 2018
@@ -115,7 +115,14 @@ set(SOURCES
 )
 
 if(SERF_WINDOWS)
-  set(SHARED_SOURCES "serf.rc")
+  list(APPEND EXPORTS_BLACKLIST
+       "serf_connection_switch_protocol"
+       "serf_http_protocol_create"
+       "serf_https_protocol_create"
+       "serf_http_request_queue"
+  )
+  SerfWindowsGenDef("${EXPORTS_BLACKLIST}" "${CMAKE_BINARY_DIR}/serf.def" 
${HEADERS})
+  set(SHARED_SOURCES "serf.rc" "${CMAKE_BINARY_DIR}/serf.def")
 
   # Static OpenSSL, APR and APR-Util need additional libraries that are not
   # linked by default by CMake. These will be ignored by the linker if they're

Modified: serf/trunk/build/SerfWindowsToolkit.cmake
URL: 
http://svn.apache.org/viewvc/serf/trunk/build/SerfWindowsToolkit.cmake?rev=1834948&r1=1834947&r2=1834948&view=diff
==============================================================================
--- serf/trunk/build/SerfWindowsToolkit.cmake (original)
+++ serf/trunk/build/SerfWindowsToolkit.cmake Tue Jul  3 11:42:06 2018
@@ -33,3 +33,37 @@ function(SerfWindowsProcessZLIB)
   if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
   endif()
 endfunction(SerfWindowsProcessZLIB)
+
+# Generate a Windows DLL .def file from a list of headers.
+function(SerfWindowsGenDef blacklist_ target_)
+  if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
+    set(func_search_rx_ "^(([a-zA-Z_0-9]+|\\*) 
)+\\*?(serf_[a-z][a-zA-Z_0-9]*)\\(")
+    set(type_search_rx_ "^extern const serf_bucket_type_t (serf_[a-z_]*);")
+    set(func_rx_ "^(([a-zA-Z_0-9]+|\\*) )+\\*?(serf_[a-z][a-zA-Z_0-9]*).*$")
+    set(type_rx_ "^extern const serf_bucket_type_t (serf_[a-z_]*).*$")
+
+    foreach(file_ ${ARGN})
+      message(STATUS "Looking for exports in ${file_}")
+      file(STRINGS ${file_} funcs_ REGEX "${func_search_rx_}")
+      file(STRINGS ${file_} types_ REGEX "${type_search_rx_}")
+      foreach(sym_ ${funcs_})
+        string(REGEX REPLACE "${func_rx_}" "\\3" def_ ${sym_})
+        list(APPEND defs_ ${def_})
+      endforeach()
+      foreach(sym_ ${types_})
+        string(REGEX REPLACE "${type_rx_}" "\\1" def_ ${sym_})
+        list(APPEND defs_ ${def_})
+      endforeach()
+    endforeach()
+
+    list(SORT defs_)
+    list(REMOVE_DUPLICATES defs_)
+    file(WRITE ${target_} "EXPORTS\n")
+    foreach(def_ ${defs_})
+      list(FIND blacklist_ "${def_}" skip_)
+      if(skip_ LESS 0)
+        file(APPEND ${target_} "${def_}\n")
+      endif()
+    endforeach()
+  endif()
+endfunction(SerfWindowsGenDef)


Reply via email to