On 2024/06/19 2:33, Timofey Zhakov wrote:
> Hello again!
> 
> I was working on the CMake patch and didn't update the progress for a long 
> time.
> 
> Here are some things that I have done: ...

Running "python3 gen-make.py -t cmake" on Windows and get the weird warning:

[[[
C> python.exe gen-make.py -t cmake
WARNING: errno intersects APR error codes; runtime computation of symbolic 
error names for the following numeric codes might be wrong: <filter object at 
0x0000022379A52BF0>
Wrote: subversion/libsvn_subr/errorcode.inc
Wrote: subversion/libsvn_subr/config_keys.inc
]]]

The root cause of the message is wrong handling filter() function in 
build/generator/gen_base.py with Python 3.

[[[
diff --git a/build/generator/gen_base.py b/build/generator/gen_base.py
index f4131866bc..7adf9106ed 100644
--- a/build/generator/gen_base.py
+++ b/build/generator/gen_base.py
@@ -320,9 +320,8 @@ class GeneratorBase:
     del aprerr
 
     ## sanity check
-    intersection = set(errno.errorcode.keys()) & set(aprdict.keys())
-    intersection = filter(lambda x: errno.errorcode[x] != aprdict[x],
-                          intersection)
+    intersection = sorted(x for x in (set(errno.errorcode) & set(aprdict))
+                            if errno.errorcode[x] != aprdict[x])
     if self.errno_filter(intersection):
         print("WARNING: errno intersects APR error codes; "
               "runtime computation of symbolic error names for the following 
numeric codes might be wrong: "
@@ -332,8 +331,7 @@ class GeneratorBase:
                                '\n'.join(lines))
 
   def errno_filter(self, codes):
-    # list() to force the generator under python3
-    return list(codes)
+    return codes
 
   class FileSectionOptionEnum(object):
     # These are accessed via getattr() later on
]]]

In build/generator/gen_win.py, the errno_filter() is overridden to ignore 10000 
<= errno <= 10100 (probably winsock errors). See also 
https://svn.apache.org/r1488803

[[[
  def errno_filter(self, codes):
    "Callback for gen_base.write_errno_table()."
    # Filter out apr_errno.h SOC* codes, which alias the windows API names.
    return set(filter(lambda code: not (10000 <= code <= 10100), codes))
]]]

I think build/generator/gen_cmake.py should have the same logic for Windows 
like the following (not elegant...):

[[[
diff --git a/build/generator/gen_cmake.py b/build/generator/gen_cmake.py
index 426abe9da6..dcc5a80d38 100644
--- a/build/generator/gen_cmake.py
+++ b/build/generator/gen_cmake.py
@@ -235,3 +235,8 @@ class Generator(gen_base.GeneratorBase):
       if isinstance(target, gen_base.TargetExe):
         if target.install == "bdb-test":
           return True
+
+  if os.name == 'nt':
+    def errno_filter(self, codes):
+      """From errno_filter() in gen_win.py"""
+      return [code for code in codes if not (10000 <= code <= 10100)]
]]]

-- 
Jun Omae <jun6...@gmail.com> (大前 潤)

Reply via email to