Files
Phoenix/etg/help.py
Scott Talbert b69a44006a Include <wx/helpbase.h> instead of <wx/help.h> for wxHelpControllerBase
This hopefully resolves a link issue with GCC 16+ which performs more
aggressive devirtualization.  We want to avoid linking wxHTML into the
core library, so we need to just include helpbase here so GCC doesn't
see the derived classes.

Fixes: https://github.com/wxWidgets/Phoenix/issues/2807
2025-10-28 11:56:25 -04:00

86 lines
3.1 KiB
Python

#---------------------------------------------------------------------------
# Name: etg/help.py
# Author: Robin Dunn
#
# Created: 06-Apr-2012
# Copyright: (c) 2012-2020 by Total Control Software
# License: wxWindows License
#---------------------------------------------------------------------------
import etgtools
import etgtools.tweaker_tools as tools
PACKAGE = "wx"
MODULE = "_core"
NAME = "help" # Base name of the file to generate to for this script
DOCSTRING = ""
# The classes and/or the basename of the Doxygen XML files to be processed by
# this script.
ITEMS = [ "wxHelpControllerBase",
#"wxHelpController", See note below
]
#---------------------------------------------------------------------------
def run():
# Parse the XML file(s) building a collection of Extractor objects
module = etgtools.ModuleDef(PACKAGE, MODULE, NAME, DOCSTRING)
etgtools.parseDoxyXML(module, ITEMS)
#-----------------------------------------------------------------
# Tweak the parsed meta objects in the module object as needed for
# customizing the generated code and docstrings.
c = module.find('wxHelpControllerBase')
assert isinstance(c, etgtools.ClassDef)
c.find('GetFrameParameters.size').out = True
c.find('GetFrameParameters.pos').out = True
c.find('GetFrameParameters.newFrameEachTime').out = True
# We want to avoid having to link with wxHTML so override the include of
# wx/help.h and use wx/helpbase.h instead. This is needed with GCC 16+
# which performs more aggressive inlining.
c.includes[c.includes.index('wx/help.h')] = 'wx/helpbase.h'
# NOTE: Since wxHelpController is an alias for wxHtmlHelpController on
# Mac and GTK, and since we don't want to force the wx.core extension
# module to link to the wxHTML library, then we won't provide a wrapper
# for the wxHelpController 'class' here.
#
# Instead we'll add a Python factory function that accomplishes the same
# thing. Basically it just provides a help controller instance that is the
# best for the platform.
module.addPyFunction('HelpController', '(parentWindow=None)',
doc="""\
Rather than being an alias for some class, the Python version of
``HelpController`` is a factory function that creates and returns an
instance of the best Help Controller for the platform.
""",
body="""\
try:
if 'wxMSW' in wx.PlatformInfo:
from .msw import CHMHelpController as ControllerClass
else:
from .html import HtmlHelpController as ControllerClass
except ImportError:
from .adv import ExtHelpController as ControllerClass
return ControllerClass(parentWindow)
""")
#-----------------------------------------------------------------
tools.doCommonTweaks(module)
tools.runGenerators(module)
#---------------------------------------------------------------------------
if __name__ == '__main__':
run()