You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ri...@apache.org on 2025/06/09 13:41:14 UTC

svn commit: r1926286 - in /subversion/trunk: CMakeLists.txt build/cmake/extractor.cmake

Author: rinrab
Date: Mon Jun  9 13:41:13 2025
New Revision: 1926286

URL: http://svn.apache.org/viewvc?rev=1926286&view=rev
Log:
cmake: Generate def files in build time using an external script
extractor.cmake script (similarly to extractor.py).

* build/cmake/extractor.cmake: New file, with symbol scrapper code.
* CMakeLists.txt
  (def generator): Generate def files using custom commands and
   the extractor.cmake script.

Added:
    subversion/trunk/build/cmake/extractor.cmake
Modified:
    subversion/trunk/CMakeLists.txt

Modified: subversion/trunk/CMakeLists.txt
URL: http://svn.apache.org/viewvc/subversion/trunk/CMakeLists.txt?rev=1926286&r1=1926285&r2=1926286&view=diff
==============================================================================
--- subversion/trunk/CMakeLists.txt (original)
+++ subversion/trunk/CMakeLists.txt Mon Jun  9 13:41:13 2025
@@ -516,52 +516,22 @@ function(target_exports target_name)
     )
 
     set(def_file_path ${CMAKE_BINARY_DIR}/${target_name}.def)
+    set(headers)
 
-    # see build/generator/extractor.py
-    set(func_regex "(^|\n)((([A-Za-z0-9_]+|[*]) )+[*]?)?((svn|apr)_[A-Za-z0-9_]+)[ \t\r\n]*\\(")
-
-    set(defs)
     foreach(file ${ARGN})
-      file(READ ${file} contents)
-      string(REGEX MATCHALL "${func_regex}" funcs ${contents})
-
-      foreach(func_string ${funcs})
-        string(REGEX MATCH "[A-Za-z0-9_]+[ \t\r\n]*\\($" func_name ${func_string})
-        string(REGEX REPLACE "[ \t\r\n]*\\($" "" func_name ${func_name})
-        list(APPEND defs "${func_name}")
-      endforeach()
-
-      get_filename_component(filename ${file} NAME)
-      if(${filename} STREQUAL "svn_ctype.h")
-        # See libsvn_subr/ctype.c for an explanation why we use CONSTANT and not
-        # DATA, even though it causes an LNK4087 warning!
-        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()
+      list(APPEND headers "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
     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()
+    add_custom_command(
+      OUTPUT "${def_file_path}"
+      DEPENDS ${headers}
+      COMMAND ${CMAKE_COMMAND}
+              "-DEXPORT_HEADER_FILE_PATHS=${headers}"
+              "-DEXPORT_DEF_FILE_PATH=${def_file_path}"
+              "-DEXPORT_BLACKLIST=${filter_names}"
+              -P "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/extractor.cmake"
+      WORKING_DIRECTORY "${SERF_SOURCE_DIR}"
+    )
 
     target_sources("${target_name}" PRIVATE "${def_file_path}")
   endif()

Added: subversion/trunk/build/cmake/extractor.cmake
URL: http://svn.apache.org/viewvc/subversion/trunk/build/cmake/extractor.cmake?rev=1926286&view=auto
==============================================================================
--- subversion/trunk/build/cmake/extractor.cmake (added)
+++ subversion/trunk/build/cmake/extractor.cmake Mon Jun  9 13:41:13 2025
@@ -0,0 +1,74 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# extractor.cmake -- Extracts function names from header files and writes
+# them to a .def file.
+#
+# cmake -DEXPORT_HEADER_FILE_PATHS=<...path_to_header_files>
+#       -DEXPORT_DEF_FILE_PATH=<path_to_def_file>
+#       [-DEXPORT_BLACKLIST=<...symbols_to_ignore>]
+#       -P extractor.cmake
+
+separate_arguments(EXPORT_HEADER_FILE_PATHS)
+separate_arguments(EXPORT_BLACKLIST)
+
+# see build/generator/extractor.py
+set(func_regex "(^|\n)((([A-Za-z0-9_]+|[*]) )+[*]?)?((svn|apr)_[A-Za-z0-9_]+)[ \t\r\n]*\\(")
+
+set(defs)
+foreach(file ${EXPORT_HEADER_FILE_PATHS})
+  file(READ ${file} contents)
+  string(REGEX MATCHALL "${func_regex}" funcs ${contents})
+
+  foreach(func_string ${funcs})
+    string(REGEX MATCH "[A-Za-z0-9_]+[ \t\r\n]*\\($" func_name ${func_string})
+    string(REGEX REPLACE "[ \t\r\n]*\\($" "" func_name ${func_name})
+    list(APPEND defs "${func_name}")
+  endforeach()
+
+  get_filename_component(filename ${file} NAME)
+  if(${filename} STREQUAL "svn_ctype.h")
+    # See libsvn_subr/ctype.c for an explanation why we use CONSTANT and not
+    # DATA, even though it causes an LNK4087 warning!
+    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 EXPORT_BLACKLIST "${def}" skip)
+  if(skip LESS 0)
+    string(APPEND def_file_content "${def}\n")
+  endif()
+endforeach()
+
+if(EXISTS "${EXPORT_DEF_FILE_PATH}")
+  file(READ "${EXPORT_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 "${EXPORT_DEF_FILE_PATH}" ${def_file_content})
+endif()



Re: svn commit: r1926286 - in /subversion/trunk: CMakeLists.txt build/cmake/extractor.cmake

Posted by Timofei Zhakov <ti...@chemodax.net>.
On Mon, Jun 9, 2025 at 7:32 PM Branko Čibej <br...@apache.org> wrote:

> On 9. 6. 25 19:26, Timofei Zhakov wrote:
>
> On Mon, Jun 9, 2025 at 7:23 PM Branko Čibej <br...@apache.org> wrote:
>
>> On 9. 6. 25 15:41, rinrab@apache.org wrote:
>>
>> Author: rinrab
>> Date: Mon Jun  9 13:41:13 2025
>> New Revision: 1926286
>>
>> URL: http://svn.apache.org/viewvc?rev=1926286&view=rev
>> Log:
>> cmake: Generate def files in build time using an external script
>> extractor.cmake script (similarly to extractor.py).
>>
>> * build/cmake/extractor.cmake: New file, with symbol scrapper code.
>> * CMakeLists.txt
>>   (def generator): Generate def files using custom commands and
>>    the extractor.cmake script.
>>
>>
>>
>> Why?  What's the difference, other than you're now spawning another cmake
>> process?
>>
>> -- Brane
>>
>>
> You no longer need to reconfigure the entire project when changing a set
> of public symbols exported from a shared library on windows, which was
> really annoying before, at least for me.
>
>
> I don't understand. You still have to generate the new .def file. How do
> you do that? By invoking extractor.cmake directly?
>
> -- Brane
>
>
I first add a custom build rule for .def files using add_custom_command() and
use these files using target_sources() (which invokes custom build rules
for these files, if any). Using of  add_custom_command() makes it so the
OUTPUT file is not rebuilt as long as the DEPENDS files remain unchanged.

-- 
Timofei Zhakov

Re: svn commit: r1926286 - in /subversion/trunk: CMakeLists.txt build/cmake/extractor.cmake

Posted by Branko Čibej <br...@apache.org>.
On 9. 6. 25 19:26, Timofei Zhakov wrote:
> On Mon, Jun 9, 2025 at 7:23 PM Branko Čibej <br...@apache.org> wrote:
>
>     On 9. 6. 25 15:41, rinrab@apache.org wrote:
>>     Author: rinrab
>>     Date: Mon Jun  9 13:41:13 2025
>>     New Revision: 1926286
>>
>>     URL:http://svn.apache.org/viewvc?rev=1926286&view=rev  <http://svn.apache.org/viewvc?rev=1926286&view=rev>
>>     Log:
>>     cmake: Generate def files in build time using an external script
>>     extractor.cmake script (similarly to extractor.py).
>>
>>     * build/cmake/extractor.cmake: New file, with symbol scrapper code.
>>     * CMakeLists.txt
>>        (def generator): Generate def files using custom commands and
>>         the extractor.cmake script.
>
>
>     Why?  What's the difference, other than you're now spawning
>     another cmake process?
>
>     -- Brane
>
>
> You no longer need to reconfigure the entire project when changing a 
> set of public symbols exported from a shared library on windows, which 
> was really annoying before, at least for me.

I don't understand. You still have to generate the new .def file. How do 
you do that? By invoking extractor.cmake directly?

-- Brane

Re: svn commit: r1926286 - in /subversion/trunk: CMakeLists.txt build/cmake/extractor.cmake

Posted by Timofei Zhakov <ti...@chemodax.net>.
On Mon, Jun 9, 2025 at 7:23 PM Branko Čibej <br...@apache.org> wrote:

> On 9. 6. 25 15:41, rinrab@apache.org wrote:
>
> Author: rinrab
> Date: Mon Jun  9 13:41:13 2025
> New Revision: 1926286
>
> URL: http://svn.apache.org/viewvc?rev=1926286&view=rev
> Log:
> cmake: Generate def files in build time using an external script
> extractor.cmake script (similarly to extractor.py).
>
> * build/cmake/extractor.cmake: New file, with symbol scrapper code.
> * CMakeLists.txt
>   (def generator): Generate def files using custom commands and
>    the extractor.cmake script.
>
>
>
> Why?  What's the difference, other than you're now spawning another cmake
> process?
>
> -- Brane
>
>
You no longer need to reconfigure the entire project when changing a set of
public symbols exported from a shared library on windows, which was really
annoying before, at least for me.

-- 
Timofei Zhakov

Re: svn commit: r1926286 - in /subversion/trunk: CMakeLists.txt build/cmake/extractor.cmake

Posted by Branko Čibej <br...@apache.org>.
On 9. 6. 25 15:41, rinrab@apache.org wrote:
> Author: rinrab
> Date: Mon Jun  9 13:41:13 2025
> New Revision: 1926286
>
> URL:http://svn.apache.org/viewvc?rev=1926286&view=rev
> Log:
> cmake: Generate def files in build time using an external script
> extractor.cmake script (similarly to extractor.py).
>
> * build/cmake/extractor.cmake: New file, with symbol scrapper code.
> * CMakeLists.txt
>    (def generator): Generate def files using custom commands and
>     the extractor.cmake script.


Why?  What's the difference, other than you're now spawning another 
cmake process?

-- Brane