Author: brane Date: Tue Jun 10 13:02:15 2025 New Revision: 1926337 URL: http://svn.apache.org/viewvc?rev=1926337&view=rev Log: On the user-defined-authn branch: sync with trunk to r1926336.
Added: serf/branches/user-defined-authn/build/exports.py - copied unchanged from r1926336, serf/trunk/build/exports.py Modified: serf/branches/user-defined-authn/ (props changed) serf/branches/user-defined-authn/SConstruct serf/branches/user-defined-authn/build/SerfPlatform.cmake serf/branches/user-defined-authn/build/gen_def.py Propchange: serf/branches/user-defined-authn/ ------------------------------------------------------------------------------ Merged /serf/trunk:r1926256-1926336 Modified: serf/branches/user-defined-authn/SConstruct URL: http://svn.apache.org/viewvc/serf/branches/user-defined-authn/SConstruct?rev=1926337&r1=1926336&r2=1926337&view=diff ============================================================================== --- serf/branches/user-defined-authn/SConstruct (original) +++ serf/branches/user-defined-authn/SConstruct Tue Jun 10 13:02:15 2025 @@ -40,6 +40,7 @@ except ImportError: src_dir = File('SConstruct').rfile().get_dir().abspath sys.path.insert(0, src_dir) import build.scons_extras +import build.exports custom_tests = {'CheckGnuCC': build.scons_extras.CheckGnuCC} @@ -175,12 +176,13 @@ if sys.platform == 'win32': EnumVariable('TARGET_ARCH', "Platform to build for", 'x86', - allowed_values=('x86', 'x86_64', 'ia64'), + allowed_values=('x86', 'x86_64', 'arm64', 'ia64'), map={'X86' : 'x86', 'win32': 'x86', 'Win32': 'x86', 'x64' : 'x86_64', - 'X64' : 'x86_64' + 'X64' : 'x86_64', + 'ARM64': 'arm64' }), EnumVariable('MSVC_VERSION', @@ -212,14 +214,31 @@ env = Environment(variables=opts, CPPPATH=['.', ], ) +# "Legacy" .def file builder gen_def_script = env.File('build/gen_def.py').rstr() - env.Append(BUILDERS = { 'GenDef' : Builder(action = '"%s" "%s" $SOURCES > $TARGET' % (sys.executable, gen_def_script,), suffix='.def', src_suffix='.h') }) +# Export symbol generator (for Windows DLL, Mach-O and ELF) +export_generator = build.exports.ExportGenerator() +if export_generator.target is None: + # Nothing to do on this platform + export_generator = None +else: + def generate_exports(target, source, env): + for target_path in (str(t) for t in target): + stream = open(target_path, 'wt') + export_generator.generate(stream, *(str(s) for s in source)) + stream.close() + env.Append(BUILDERS = { + 'GenExports': Builder(action=generate_exports, + suffix=export_generator.target.ext, + src_suffix='.h') + }) + match = re.search('SERF_MAJOR_VERSION ([0-9]+).*' 'SERF_MINOR_VERSION ([0-9]+).*' 'SERF_PATCH_VERSION ([0-9]+)', @@ -293,6 +312,11 @@ elif env['SHLIBPREFIX'] == '$LIBPREFIX': else: SHLIBNAME = '%sserf-%d' % (env['SHLIBPREFIX'], MAJOR) +if export_generator is None: + export_filter = None +else: + export_filter = '%s%s' % (SHLIBNAME, export_generator.target.ext) + env.Append(RPATH=[libdir], PDB='${TARGET.filebase}.pdb') @@ -358,16 +382,21 @@ else: # PLAN THE BUILD SHARED_SOURCES = [] if sys.platform == 'win32': - env.GenDef(['serf.h','serf_bucket_types.h', 'serf_bucket_util.h']) - SHARED_SOURCES.append(['serf.def']) + env.GenDef(target=[export_filter], source=HEADER_FILES) + SHARED_SOURCES.append([export_filter]) dll_res = env.RES(['serf.rc']) SHARED_SOURCES.append(dll_res) + # TODO: Use GenExports instead. + export_filter = None SOURCES = Glob('src/*.c') + Glob('buckets/*.c') + Glob('auth/*.c') + \ Glob('protocols/*.c') lib_static = env.StaticLibrary(LIBNAME, SOURCES) lib_shared = env.SharedLibrary(SHLIBNAME, SOURCES + SHARED_SOURCES) +if export_filter is not None: + env.GenExports(target=export_filter, source=HEADER_FILES) + env.Depends(lib_shared, export_filter) # Define OPENSSL_NO_STDIO to prevent using _fp() API. env.Append(CPPDEFINES=['OPENSSL_NO_STDIO']) @@ -385,7 +414,7 @@ if sys.platform == 'win32': '_CRT_SECURE_NO_WARNINGS', '_CRT_NONSTDC_NO_WARNINGS']) - if env.get('TARGET_ARCH', None) == 'x86_64': + if env.get('TARGET_ARCH', None) in ('x86_64', 'arm64', 'ia64'): env.Append(CPPDEFINES=['WIN64']) # Get the APR-Util version number to check if we need an external Expat @@ -599,6 +628,20 @@ if brotli and CALLOUT_OKAY: Exit(1) env = conf.Finish() +if CALLOUT_OKAY: + conf = Configure(env, custom_tests=custom_tests) + + ### some configuration stuffs + if conf.CheckCHeader('stdbool.h'): + env.Append(CPPDEFINES=['HAVE_STDBOOL_H']) + + env = conf.Finish() + +# Tweak the link flags for selecting exported symbols. Must come after the +# config checks, because the symbols file doesn't exist yet. +if export_filter is not None: + env.Append(LINKFLAGS=[export_generator.target.link_flag % export_filter]) + # Set preprocessor define to disable the logging framework if disablelogging: env.Append(CPPDEFINES=['SERF_DISABLE_LOGGING']) @@ -625,16 +668,6 @@ pkgconfig = env.Textfile('serf-%d.pc' % env.Default(lib_static, lib_shared, pkgconfig) -if CALLOUT_OKAY: - conf = Configure(env, custom_tests=custom_tests) - - ### some configuration stuffs - if conf.CheckCHeader('stdbool.h'): - env.Append(CPPDEFINES=['HAVE_STDBOOL_H']) - - env = conf.Finish() - - # INSTALLATION STUFF install_static = env.Install(libdir, lib_static) Modified: serf/branches/user-defined-authn/build/SerfPlatform.cmake URL: http://svn.apache.org/viewvc/serf/branches/user-defined-authn/build/SerfPlatform.cmake?rev=1926337&r1=1926336&r2=1926337&view=diff ============================================================================== --- serf/branches/user-defined-authn/build/SerfPlatform.cmake (original) +++ serf/branches/user-defined-authn/build/SerfPlatform.cmake Tue Jun 10 13:02:15 2025 @@ -43,6 +43,11 @@ elseif(${CMAKE_SYSTEM_NAME} MATCHES "Ope set(SERF_OPENBSD TRUE) set(SERF_ELF_TARGET TRUE) set(SERF_PLATFORM "OpenBSD") +elseif(${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") + set(SERF_UNIX TRUE) + set(SERF_NETBSD TRUE) + set(SERF_ELF_TARGET TRUE) + set(SERF_PLATFORM "NetBSD") elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows") set(SERF_WINDOWS TRUE) if(CMAKE_GENERATOR_PLATFORM MATCHES "(x64|ARM64|IA64)") Modified: serf/branches/user-defined-authn/build/gen_def.py URL: http://svn.apache.org/viewvc/serf/branches/user-defined-authn/build/gen_def.py?rev=1926337&r1=1926336&r2=1926337&view=diff ============================================================================== --- serf/branches/user-defined-authn/build/gen_def.py (original) +++ serf/branches/user-defined-authn/build/gen_def.py Tue Jun 10 13:02:15 2025 @@ -26,56 +26,10 @@ # C:\PATH> python build/gen_def.py serf.h serf_bucket_types.h serf_bucket_util.h > build/serf.def # -import re import sys - -# This regex parses function declarations that look like: -# -# return_type serf_func1(... -# return_type *serf_func2(... -# -# Where return_type is a combination of words and "*" each separated by a -# SINGLE space. If the function returns a pointer type (like serf_func2), -# then a space may exist between the "*" and the function name. Thus, -# a more complicated example might be: -# const type * const * serf_func3(... -# -_funcs = re.compile(r'^(?:(?:\w+|\*) )+\*?(serf_[a-z][a-zA-Z_0-9]*)\(', - re.MULTILINE) - -# This regex parses the bucket type definitions which look like: -# -# extern const serf_bucket_type_t serf_bucket_type_FOO; -# -_types = re.compile(r'^extern const serf_bucket_type_t (serf_[a-z_]*);', - re.MULTILINE) - - -def extract_exports(fname): - content = open(fname).read() - exports = set() - for name in _funcs.findall(content): - exports.add(name) - for name in _types.findall(content): - exports.add(name) - return exports - - -# Blacklist the serf v2 API for now -BLACKLIST = set(['serf_connection_switch_protocol', - 'serf_http_protocol_create', - 'serf_https_protocol_create', - 'serf_http_request_queue', - "serf_authn_unregister_scheme", - ]) - +import exports if __name__ == '__main__': - # run the extraction over each file mentioned - import sys - print("EXPORTS") - - for fname in sys.argv[1:]: - funclist = extract_exports(fname) - BLACKLIST - for func in funclist: - print(func) + gen = exports.ExportGenerator(exports.TARGET_WINDLL) + if not gen.generate(sys.stdout, *sys.argv[1:]): + sys.exit(1)