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