Author: rinrab
Date: Wed Sep  4 13:19:32 2024
New Revision: 1920465

URL: http://svn.apache.org/viewvc?rev=1920465&view=rev
Log:
On the 'cmake' branch: Rewrite def-file extractor on CMake to drop
Python dependency with default minimal build.

* CMakeLists.txt
  (swig.python): Find Python only if tests are enabled.
  (target_exports): Use CMake to generate exports for *.def files instead of
   invoking Python script.

Modified:
    subversion/branches/cmake/CMakeLists.txt

Modified: subversion/branches/cmake/CMakeLists.txt
URL: 
http://svn.apache.org/viewvc/subversion/branches/cmake/CMakeLists.txt?rev=1920465&r1=1920464&r2=1920465&view=diff
==============================================================================
--- subversion/branches/cmake/CMakeLists.txt (original)
+++ subversion/branches/cmake/CMakeLists.txt Wed Sep  4 13:19:32 2024
@@ -262,7 +262,7 @@ if(SVN_ENABLE_SWIG_PYTHON)
       Interpreter
       Development.Embed
   )
-else()
+elseif(SVN_ENABLE_TESTS)
   find_package(Python REQUIRED COMPONENTS
       Interpreter
   )
@@ -316,24 +316,68 @@ endif()
 
 function(target_exports target_name)
   if (WIN32)
-    set(def_file_path "${CMAKE_BINARY_DIR}/${target_name}.def")
-
-    add_custom_command(
-      WORKING_DIRECTORY
-        "${CMAKE_SOURCE_DIR}"
-      COMMAND
-        "${Python_EXECUTABLE}"
-      ARGS
-        "build/generator/extractor.py"
-        ${ARGN}
-        ">${def_file_path}"
-      OUTPUT
-        "${def_file_path}"
-      DEPENDS
-        "build/generator/extractor.py"
-        ${ARGN}
+    set(filter_names
+      # svn_config_enumerator_t looks like (to our regex) a
+      # function declaration for svn_boolean_t
+      "svn_boolean_t"
+      # Not available on Windows
+      "svn_auth_get_keychain_simple_provider"
+      "svn_auth_get_keychain_ssl_client_cert_pw_provider"
+      "svn_auth_get_gnome_keyring_simple_provider"
+      "svn_auth_get_gnome_keyring_ssl_client_cert_pw_provider"
+      "svn_auth_get_kwallet_simple_provider"
+      "svn_auth_get_kwallet_ssl_client_cert_pw_provider"
+      "svn_auth_gnome_keyring_version"
+      "svn_auth_kwallet_version"
+      "svn_auth_get_gpg_agent_simple_provider"
+      "svn_auth_gpg_agent_version"
     )
 
+    set(def_file_path ${CMAKE_BINARY_DIR}/${target_name}.def)
+
+    # see build/generator/extractor.py
+    set(func_regex "^([A-Za-z0-9_][A-Za-z0-9_* ]+[ *])?(svn[A-Za-z0-9_]+)\\(")
+
+    set(defs)
+    foreach(file ${ARGN})
+      file(STRINGS ${file} funcs REGEX "${func_regex}")
+
+      foreach(func_string ${funcs})
+        string(REGEX REPLACE "${func_regex}.*$" "\\2" func_name ${func_string})
+
+        list(APPEND defs "${func_name}")
+      endforeach()
+
+      get_filename_component(filename ${file} NAME)
+      if(${filename} STREQUAL "svn_ctype.h")
+        list(APPEND defs "svn_ctype_table = svn_ctype_table_internal CONSTANT")
+      elseif(${filename} STREQUAL "svn_wc_private.h")
+        # svn_wc__internal_walk_children() is now internal to libsvn_wc
+        # but entries-dump.c still calls it
+        list(APPEND defs "svn_wc__internal_walk_children")
+      endif()
+    endforeach()
+
+    list(SORT defs)
+    list(REMOVE_DUPLICATES defs)
+
+    set(def_file_content "EXPORTS\n")
+    foreach(def ${defs})
+      list(FIND filter_names "${def}" skip)
+      if(skip LESS 0)
+        string(APPEND def_file_content "${def}\n")
+      endif()
+    endforeach()
+
+    if(EXISTS "${def_file_path}")
+      file(READ "${def_file_path}" old_file_content)
+    else()
+      set(old_file_content "NOT_EXISTS")
+    endif()
+    if(NOT ${old_file_content} STREQUAL ${def_file_content})
+      file(WRITE "${def_file_path}" ${def_file_content})
+    endif()
+
     target_sources("${target_name}" PRIVATE "${def_file_path}")
   endif()
 endfunction()


Reply via email to