File indexing completed on 2024-04-21 08:33:32

0001 #!/usr/bin/env python3
0002 # -*- coding: utf-8 -*-
0003 #     Copyright 2009-2014 Simon Edwards <simon@simonzone.com>
0004 #     Copyright 2015 Scott Kitterman <scott@kitterman.com>
0005 #
0006 # This program is free software; you can redistribute it and/or modify
0007 # it under the terms of the GNU General Public License as published by
0008 # the Free Software Foundation; either version 2 of the License, or
0009 # (at your option) any later version.
0010 #
0011 # This program is distributed in the hope that it will be useful,
0012 # but WITHOUT ANY WARRANTY; without even the implied warranty of
0013 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0014 # GNU General Public License for more details.
0015 #
0016 # You should have received a copy of the GNU General Public License
0017 # along with this program; if not, write to the
0018 # Free Software Foundation, Inc.,
0019 # 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
0020 
0021 import argparse
0022 import configparser
0023 import inspect
0024 import kbindinggenerator.toolkit as toolkit
0025 import kbindinggenerator.qtkde5macros as qtkde5macros
0026 import kbindinggenerator.sipsymboldata as sipsymboldata
0027 import os
0028 import re
0029 
0030 kauth = None
0031 kitemmodels = None
0032 kitemviews = None
0033 karchive = None
0034 kplotting = None
0035 solid = None
0036 kcoreaddons = None
0037 sonnet = None
0038 kguiaddons = None
0039 kwidgetsaddons = None
0040 
0041 def _readConfiguration(configfile):
0042 
0043     settings = configparser.ConfigParser()
0044     settings._interpolation = configparser.ExtendedInterpolation()
0045     settings.read(configfile)
0046     
0047     return(settings)
0048 
0049 def _writeConfiguration(settings, configfile):
0050     cfgfile = open(configfile,'w')
0051     settings.write(cfgfile)
0052     cfgfile.close()
0053 
0054 def _setSettings(source_dir, build_dir, settings):
0055     outputBaseDirectory = os.path.join(source_dir,
0056                                        settings.get('kf5.config', 'outputBaseDirectory'))
0057     cmakelistBaseDirectory = os.path.join(source_dir,
0058                                           settings.get('kf5.config', 'cmakelistBaseDirectory'))
0059     kdelibsBuildDirectory = os.path.join(build_dir,
0060                                          settings.get('kf5.config', 'kdelibsBuildDirectory'))
0061     sipImportDir = os.path.join(source_dir,
0062                                 settings.get('kf5.config', 'sipImportDir'))
0063     sipImportDirs = [ str(sipImportDir), str(outputBaseDirectory) + '/sip']
0064     return(outputBaseDirectory, cmakelistBaseDirectory, kdelibsBuildDirectory,
0065            sipImportDir, sipImportDirs)
0066 
0067 def _getConfiguration(configfile):
0068     settings = _readConfiguration(configfile)
0069     outputBaseDirectory, cmakelistBaseDirectory, kdelibsBuildDirectory, \
0070         sipImportDir, sipImportDirs =_setSettings(settings)
0071     return(outputBaseDirectory, cmakelistBaseDirectory, kdelibsBuildDirectory,
0072         sipImportDir, sipImportDirs)
0073 
0074 def _printConfiguration(outputBaseDirectory, cmakelistBaseDirectory,
0075                         kdelibsBuildDirectory, sipImportDir, sipImportDirs):
0076     print('Current values for configuration options:')
0077     print('outputBaseDirectory = {0}'.format(outputBaseDirectory))
0078     print('cmakelistBaseDirectory = {0}'.format(cmakelistBaseDirectory))
0079     print('kdelibsBuildDirectory = {0}'.format(kdelibsBuildDirectory))
0080     print('sipImportDir = {0}'.format(sipImportDir))
0081     print('sipImportDirs = {0}'.format(sipImportDirs))
0082 
0083 def _setupAll(outputBaseDirectory, cmakelistBaseDirectory, kdelibsBuildDirectory,
0084               sipImportDir, sipImportDirs):
0085 
0086     global kauth
0087     global kitemmodels
0088     global kitemviews
0089     global karchive
0090     global kplotting
0091     global solid
0092     global kcoreaddons
0093     global sonnet
0094     global kguiaddons
0095     global kwidgetsaddons
0096     ###########################################################################
0097     kauth = toolkit.ModuleGenerator(
0098         module="PyKDE5.kauth",
0099         outputDirectory=os.path.join(outputBaseDirectory, "sip/kauth"),
0100         docsOutputDirectory=os.path.join(outputBaseDirectory, "docs/html/kauth"),
0101         mainDocs=os.path.join(cmakelistBaseDirectory,"kauth/Mainpage.dox"),
0102         
0103         # .h file extraction
0104         cmakelists=os.path.join(cmakelistBaseDirectory,"kauth/CMakeLists.txt"),
0105         
0106         ignoreHeaders="""kauth_export.h kauth_version.h kauth.h""".split(" "),
0107         
0108         #noUpdateSip=["typedefs.sip"],
0109         
0110         # Cpp parsing    
0111         preprocessSubstitutionMacros=qtkde5macros.QtPreprocessSubstitutionMacros(),
0112         macros=qtkde5macros.QtMacros(),
0113         bareMacros=qtkde5macros.QtBareMacros(["KAUTH_EXPORT"]),
0114         
0115         # Sip generation
0116         sipImportDirs=[sipImportDir],
0117         sipImports=["QtCore/QtCoremod.sip","QtGui/QtGuimod.sip","QtNetwork/QtNetworkmod.sip"],
0118         copyrightNotice=qtkde5macros.copyrightNotice(),
0119         exportMacros=["KAUTH_EXPORT"],
0120         ignoreBases=[],
0121         
0122         annotationRules=qtkde5macros.annotationRules()
0123         )
0124 
0125     ###########################################################################
0126     kitemmodels = toolkit.ModuleGenerator(
0127         module="PyKDE5.kitemmodels",
0128         outputDirectory=os.path.join(outputBaseDirectory, "sip/kitemmodels"),
0129         docsOutputDirectory=os.path.join(outputBaseDirectory, "docs/html/kitemmodels"),
0130         # mainDocs=os.path.join(cmakelistBaseDirectory,"kitemmodels/Mainpage.dox"),
0131 
0132         # .h file extraction
0133         cmakelists=os.path.join(cmakelistBaseDirectory,"kitemmodels/CMakeLists.txt"),
0134 
0135         ignoreHeaders="""kitemmodels_export.h kitemmodels_version.h kitemmodels.h""".split(" "),
0136 
0137         #noUpdateSip=["typedefs.sip"],
0138 
0139         # Cpp parsing
0140         preprocessSubstitutionMacros=qtkde5macros.QtPreprocessSubstitutionMacros(),
0141         macros=qtkde5macros.QtMacros(),
0142         bareMacros=qtkde5macros.QtBareMacros(["KITEMMODELS_EXPORT"]),
0143 
0144         # Sip generation
0145         sipImportDirs=[sipImportDir],
0146         sipImports=["QtCore/QtCoremod.sip"],
0147         copyrightNotice=qtkde5macros.copyrightNotice(),
0148         exportMacros=["KITEMMODELS_EXPORT"],
0149         ignoreBases=[],
0150 
0151         annotationRules=qtkde5macros.annotationRules()
0152         )
0153 
0154     ###########################################################################
0155     kitemviews = toolkit.ModuleGenerator(
0156         module="PyKDE5.kitemviews",
0157         outputDirectory=os.path.join(outputBaseDirectory, "sip/kitemviews"),
0158         docsOutputDirectory=os.path.join(outputBaseDirectory, "docs/html/kitemviews"),
0159         # mainDocs=os.path.join(cmakelistBaseDirectory,"kitemviews/Mainpage.dox"),
0160 
0161         # .h file extraction
0162         cmakelists=os.path.join(cmakelistBaseDirectory,"kitemviews/CMakeLists.txt"),
0163 
0164         ignoreHeaders="""kitemviews_export.h kitemviews_version.h kitemviews.h""".split(" "),
0165 
0166         #noUpdateSip=["typedefs.sip"],
0167 
0168         preprocessorValues={"KDE_NO_DEPRECATED": "1", "KITEMVIEWS_NO_DEPRECATED": "1"},
0169 
0170         # Cpp parsing
0171         preprocessSubstitutionMacros=qtkde5macros.QtPreprocessSubstitutionMacros(),
0172         macros=qtkde5macros.QtMacros(),
0173         bareMacros=qtkde5macros.QtBareMacros(["KITEMVIEWS_EXPORT"]),
0174 
0175         # Sip generation
0176         sipImportDirs=[sipImportDir],
0177         sipImports=["QtCore/QtCoremod.sip","QtGui/QtGuimod.sip","QtWidgets/QtWidgetsmod.sip"],
0178         copyrightNotice=qtkde5macros.copyrightNotice(),
0179         exportMacros=["KITEMVIEWS_EXPORT"],
0180         ignoreBases=[],
0181 
0182         annotationRules=qtkde5macros.annotationRules()
0183         )
0184 
0185     ###########################################################################
0186     karchive = toolkit.ModuleGenerator(
0187         module="PyKDE5.karchive",
0188         outputDirectory=os.path.join(outputBaseDirectory, "sip/karchive"),
0189         docsOutputDirectory=os.path.join(outputBaseDirectory, "docs/html/karchive"),
0190         # mainDocs=os.path.join(cmakelistBaseDirectory,"karchive/Mainpage.dox"),
0191 
0192         # .h file extraction
0193         cmakelists=os.path.join(cmakelistBaseDirectory,"karchive/CMakeLists.txt"),
0194 
0195         ignoreHeaders="""karchive_export.h karchive_version.h""".split(" "),
0196 
0197         #noUpdateSip=["typedefs.sip"],
0198 
0199         preprocessorValues={"KDE_NO_DEPRECATED": "1", "KARCHIVE_NO_DEPRECATED": "1"},
0200 
0201         # Cpp parsing
0202         preprocessSubstitutionMacros=qtkde5macros.QtPreprocessSubstitutionMacros(),
0203         macros=qtkde5macros.QtMacros(),
0204         bareMacros=qtkde5macros.QtBareMacros(["KARCHIVE_EXPORT"]),
0205 
0206         # Sip generation
0207         sipImportDirs=sipImportDirs,
0208         sipImports=["typedefs.sip", "QtCore/QtCoremod.sip"],
0209         copyrightNotice=qtkde5macros.copyrightNotice(),
0210         exportMacros=["KARCHIVE_EXPORT"],
0211         ignoreBases=[],
0212 
0213         annotationRules=qtkde5macros.annotationRules()
0214         )
0215 
0216     ###########################################################################
0217     kplotting = toolkit.ModuleGenerator(
0218         module="PyKDE5.kplotting",
0219         outputDirectory=os.path.join(outputBaseDirectory, "sip/kplotting"),
0220         docsOutputDirectory=os.path.join(outputBaseDirectory, "docs/html/kplotting"),
0221         # mainDocs=os.path.join(cmakelistBaseDirectory,"kplotting/Mainpage.dox"),
0222 
0223         # .h file extraction
0224         cmakelists=os.path.join(cmakelistBaseDirectory,"kplotting/CMakeLists.txt"),
0225 
0226         ignoreHeaders="""kplotting_export.h kplotting_version.h""".split(" "),
0227 
0228         #noUpdateSip=["typedefs.sip"],
0229 
0230         preprocessorValues={"KDE_NO_DEPRECATED": "1"},
0231 
0232         # Cpp parsing
0233         preprocessSubstitutionMacros=qtkde5macros.QtPreprocessSubstitutionMacros(),
0234         macros=qtkde5macros.QtMacros(),
0235         bareMacros=qtkde5macros.QtBareMacros(["KPLOTTING_EXPORT"]),
0236 
0237         # Sip generation
0238         sipImportDirs=sipImportDirs,
0239         sipImports=["typedefs.sip", "QtCore/QtCoremod.sip", "QtGui/QtGuimod.sip", "QtWidgets/QtWidgetsmod.sip"],
0240         copyrightNotice=qtkde5macros.copyrightNotice(),
0241         exportMacros=["KPLOTTING_EXPORT"],
0242         ignoreBases=[],
0243 
0244         annotationRules=qtkde5macros.annotationRules()
0245         )
0246 
0247     ###########################################################################
0248     solid = toolkit.ModuleGenerator(
0249         module="PyKDE5.solid",
0250         outputDirectory=os.path.join(outputBaseDirectory, "sip/solid"),
0251         docsOutputDirectory=os.path.join(outputBaseDirectory, "docs/html/solid"),
0252         # mainDocs=os.path.join(cmakelistBaseDirectory,"solid/Mainpage.dox"),
0253 
0254         # .h file extraction
0255         cmakelists=os.path.join(cmakelistBaseDirectory,"solid/CMakeLists.txt"),
0256 
0257         ignoreHeaders="""solid_export.h solid_version.h kuser.h acpluggedjob.h inhibition.h inhibitionjob.h job.h power.h requeststatejob.h statesjob.h""".split(" "),
0258 
0259         #noUpdateSip=["typedefs.sip"],
0260 
0261         preprocessorValues={"KDE_NO_DEPRECATED": "1"},
0262 
0263         # Cpp parsing
0264         preprocessSubstitutionMacros=qtkde5macros.QtPreprocessSubstitutionMacros(),
0265         macros=qtkde5macros.QtMacros(),
0266         bareMacros=qtkde5macros.QtBareMacros(["SOLID_EXPORT", "SOLID_DEPRECATED"]),
0267 
0268         # Sip generation
0269         sipImportDirs=sipImportDirs,
0270         sipImports=["typedefs.sip", "QtCore/QtCoremod.sip"],
0271         copyrightNotice=qtkde5macros.copyrightNotice(),
0272         exportMacros=["SOLID_EXPORT"],
0273         ignoreBases=[],
0274 
0275         annotationRules=qtkde5macros.annotationRules()
0276         )
0277 
0278     ###########################################################################
0279     kcoreaddons = toolkit.ModuleGenerator(
0280         module="PyKDE5.kcoreaddons",
0281         outputDirectory=os.path.join(outputBaseDirectory, "sip/kcoreaddons"),
0282         docsOutputDirectory=os.path.join(outputBaseDirectory, "docs/html/kcoreaddons"),
0283         # mainDocs=os.path.join(cmakelistBaseDirectory,"kcoreaddons/Mainpage.dox"),
0284 
0285         # .h file extraction
0286         cmakelists=os.path.join(cmakelistBaseDirectory,"kcoreaddons/CMakeLists.txt"),
0287         cmakeVariables = {"cmake_current_binary_dir": [kdelibsBuildDirectory + "/kcoreaddons"]},
0288 
0289         ignoreHeaders="""kcoreaddons_export.h kcoreaddons_version.h""".split(" "),
0290 
0291         #noUpdateSip=["typedefs.sip"],
0292 
0293         preprocessorValues={"KDE_NO_DEPRECATED": "1", "KCOREADDONS_NO_DEPRECATED": "1"},
0294 
0295         # Cpp parsing
0296         preprocessSubstitutionMacros=qtkde5macros.QtPreprocessSubstitutionMacros(),
0297         macros=qtkde5macros.QtMacros(),
0298         bareMacros=qtkde5macros.QtBareMacros(["KCOREADDONS_EXPORT"]),
0299 
0300         # Sip generation
0301         sipImportDirs=sipImportDirs,
0302         sipImports=["typedefs.sip", "QtCore/QtCoremod.sip"],
0303         copyrightNotice=qtkde5macros.copyrightNotice(),
0304         exportMacros=["KCOREADDONS_EXPORT"],
0305         ignoreBases=[],
0306 
0307         annotationRules=qtkde5macros.annotationRules()
0308         )
0309 
0310     ###########################################################################
0311     sonnet = toolkit.ModuleGenerator(
0312         module="PyKDE5.sonnet",
0313         outputDirectory=os.path.join(outputBaseDirectory, "sip/sonnet"),
0314         docsOutputDirectory=os.path.join(outputBaseDirectory, "docs/html/sonnet"),
0315         # mainDocs=os.path.join(cmakelistBaseDirectory,"sonnet/Mainpage.dox"),
0316 
0317         # .h file extraction
0318         cmakelists=os.path.join(cmakelistBaseDirectory,"sonnet/CMakeLists.txt"),
0319 
0320         ignoreHeaders="""sonnetui_export.h sonnet_export.h sonnet_version.h""".split(" "),
0321 
0322         #noUpdateSip=["typedefs.sip"],
0323 
0324         preprocessorValues={"KDE_NO_DEPRECATED": "1"},
0325 
0326         # Cpp parsing
0327         preprocessSubstitutionMacros=qtkde5macros.QtPreprocessSubstitutionMacros(),
0328         macros=qtkde5macros.QtMacros(),
0329         bareMacros=qtkde5macros.QtBareMacros(["SONNETCORE_EXPORT","SONNETUI_EXPORT"]),
0330 
0331         # Sip generation
0332         sipImportDirs=sipImportDirs,
0333         sipImports=["typedefs.sip", "QtCore/QtCoremod.sip", "QtGui/QtGuimod.sip", "QtWidgets/QtWidgetsmod.sip"],
0334         copyrightNotice=qtkde5macros.copyrightNotice(),
0335         exportMacros=["SONNET_EXPORT","SONNETUI_EXPORT","SONNETCORE_EXPORT"],
0336         ignoreBases=[],
0337 
0338         annotationRules=qtkde5macros.annotationRules()
0339         )
0340 
0341     ###########################################################################
0342     kguiaddons = toolkit.ModuleGenerator(
0343         module="PyKDE5.kguiaddons",
0344         outputDirectory=os.path.join(outputBaseDirectory, "sip/kguiaddons"),
0345         docsOutputDirectory=os.path.join(outputBaseDirectory, "docs/html/kguiaddons"),
0346         # mainDocs=os.path.join(cmakelistBaseDirectory,"kguiaddons/Mainpage.dox"),
0347 
0348         # .h file extraction
0349         cmakelists=os.path.join(cmakelistBaseDirectory,"kguiaddons/CMakeLists.txt"),
0350         cmakeVariables = {"cmake_current_binary_dir": [kdelibsBuildDirectory + "/kguiaddons"]},
0351 
0352         ignoreHeaders="""kguiaddons_export.h kguiaddons_version.h""".split(" "),
0353 
0354         #noUpdateSip=["typedefs.sip"],
0355 
0356         preprocessorValues={"KDE_NO_DEPRECATED": "1"},
0357 
0358         # Cpp parsing
0359         preprocessSubstitutionMacros=qtkde5macros.QtPreprocessSubstitutionMacros(),
0360         macros=qtkde5macros.QtMacros(),
0361         bareMacros=qtkde5macros.QtBareMacros(["KGUIADDONS_EXPORT"]),
0362 
0363         # Sip generation
0364         sipImportDirs=sipImportDirs,
0365         sipImports=["typedefs.sip", "QtCore/QtCoremod.sip", "QtGui/QtGuimod.sip"],
0366         copyrightNotice=qtkde5macros.copyrightNotice(),
0367         exportMacros=["KGUIADDONS_EXPORT"],
0368         ignoreBases=[],
0369 
0370         annotationRules=qtkde5macros.annotationRules()
0371         )
0372 
0373     ###########################################################################
0374     kwidgetsaddons = toolkit.ModuleGenerator(
0375         module="PyKDE5.kwidgetsaddons",
0376         outputDirectory=os.path.join(outputBaseDirectory, "sip/kwidgetsaddons"),
0377         docsOutputDirectory=os.path.join(outputBaseDirectory, "docs/html/kwidgetsaddons"),
0378         # mainDocs=os.path.join(cmakelistBaseDirectory,"kwidgetsaddons/Mainpage.dox"),
0379 
0380         # .h file extraction
0381         cmakelists=os.path.join(cmakelistBaseDirectory,"kwidgetsaddons/CMakeLists.txt"),
0382         cmakeVariables = {"cmake_current_binary_dir": [kdelibsBuildDirectory + "/kwidgetsaddons"]},
0383 
0384         ignoreHeaders="""kwidgetsaddons_export.h kwidgetsaddons_version.h""".split(" "),
0385 
0386         #noUpdateSip=["typedefs.sip"],
0387 
0388         preprocessorValues={"KDE_NO_DEPRECATED": "1", "KWIDGETSADDONS_NO_DEPRECATED": "1"},
0389 
0390         # Cpp parsing
0391         preprocessSubstitutionMacros=qtkde5macros.QtPreprocessSubstitutionMacros(),
0392         macros=qtkde5macros.QtMacros(),
0393         bareMacros=qtkde5macros.QtBareMacros(["KWIDGETSADDONS_EXPORT"]),
0394 
0395         # Sip generation
0396         sipImportDirs=sipImportDirs,
0397         sipImports=["typedefs.sip", "QtCore/QtCoremod.sip", "QtWidgets/QtWidgetsmod.sip"],
0398         copyrightNotice=qtkde5macros.copyrightNotice(),
0399         exportMacros=["KWIDGETSADDONS_EXPORT"],
0400         ignoreBases=[],
0401 
0402         annotationRules=qtkde5macros.annotationRules()
0403         )
0404 
0405 def updateSIP():
0406     global kauth
0407     global kitemmodels
0408     global kitemviews
0409     global karchive
0410     global kplotting
0411     global solid
0412     global kcoreaddons
0413     global sonnet
0414     global kguiaddons
0415     global kwidgetsaddons
0416     kauth.run()
0417     kitemmodels.run()
0418     kitemviews.run()
0419     karchive.run()
0420     kplotting.run()
0421     solid.run()
0422     kcoreaddons.run()
0423     sonnet.run()
0424 
0425     # kcodecs N/A - use Python's libraries for this functionality.
0426     # kwindowsystem N/A
0427 
0428     kguiaddons.run()
0429     kwidgetsaddons.run()
0430 
0431     # TODO
0432     # kconfig
0433     # kjs
0434 
0435 def updateDocs():
0436     global kauth
0437     global kitemmodels
0438     global kitemviews
0439     global karchive
0440     global kplotting
0441     global solid
0442     global kcoreaddons
0443     global sonnet
0444     global kguiaddons
0445     global kwidgetsaddons
0446     classNames = []
0447     nsNames = []
0448 
0449     def UpdateClassNamespaceList(moduleName,sipScopes):
0450         nsNames.append( (moduleName,'global', 'global') )
0451         def ExtractClassNamespace(scope):
0452             for item in scope:
0453                 if isinstance(item,sipsymboldata.SymbolData.SipClass):
0454                     classNames.append( (moduleName, item.fqPythonName(), item.fqPythonName()) )
0455                     ExtractClassNamespace(item)
0456                 elif isinstance(item,sipsymboldata.SymbolData.Namespace):
0457                     nsTuple = (moduleName,item.fqPythonName(),item.fqPythonName())
0458                     if nsTuple not in nsNames:
0459                         nsNames.append( nsTuple )
0460                     ExtractClassNamespace(item)
0461         for scope in sipScopes:
0462             ExtractClassNamespace(scope)
0463 
0464     # UpdateClassNamespaceList('kauth',kauth.docs())
0465     UpdateClassNamespaceList('kitemmodels',kitemmodels.docs())
0466     UpdateClassNamespaceList('kitemviews',kitemviews.docs())
0467     UpdateClassNamespaceList('karchive',karchive.docs())
0468     UpdateClassNamespaceList('kplotting',kplotting.docs())
0469     UpdateClassNamespaceList('solid',solid.docs())
0470     UpdateClassNamespaceList('kcoreaddons',kcoreaddons.docs())
0471     UpdateClassNamespaceList('sonnet',sonnet.docs())
0472     UpdateClassNamespaceList('kguiaddons',kguiaddons.docs())
0473     UpdateClassNamespaceList('kwidgetsaddons',kwidgetsaddons.docs())
0474 
0475     print("Writing all classes index:")
0476     toolkit.ModuleGenerator.WriteAllClasses(os.path.join(outputBaseDirectory,"docs/html"),nsNames,classNames)
0477     print("Done")
0478     
0479 ###########################################################################
0480 def main():
0481     """
0482     Process kf5 source to generate Python bindings.
0483 
0484     The current CONFIGFILE defaults are:
0485 
0486         [kf5.config]
0487         source = /source
0488         build = /build
0489         ...
0490         outputbasedirectory = ${kf5.config:source}/pykde5
0491             
0492     The output is a set of files in the outputbasedirectory directory.
0493     """
0494     configfile = os.path.join(os.path.dirname(__file__), 'config')
0495     parser = argparse.ArgumentParser(epilog = inspect.getdoc(main),
0496                                      formatter_class=argparse.RawDescriptionHelpFormatter)
0497     parser.add_argument('-l', '--listopts', default=False, action='store_true', help='list stored configuration option values and exit')
0498     parser.add_argument('-f', '--configfile', default=configfile, action='store', help='path to alternate configuration file to use')
0499     parser.add_argument('-w', '--writeopt', default=[], action='append', help='change config file value using item=value syntax - add multiple times to change multiple values')
0500     args = parser.parse_args()
0501     #
0502     # The source directory is located relative to the specified configfile,
0503     # and the build directory is "here".
0504     #
0505     source_dir = os.path.dirname(os.path.dirname(os.path.realpath(args.configfile)))
0506     build_dir = os.getcwd()
0507     #
0508     # Read the default settings.
0509     #
0510     settings = _readConfiguration(args.configfile)
0511     outputBaseDirectory, cmakelistBaseDirectory, kdelibsBuildDirectory, sipImportDir, \
0512         sipImportDirs =_setSettings(source_dir, build_dir, settings)
0513     if args.listopts:
0514         _printConfiguration(outputBaseDirectory, cmakelistBaseDirectory,
0515                             kdelibsBuildDirectory, sipImportDir, sipImportDirs)
0516         exit(0)
0517     if args.writeopt:
0518         for arg in args.writeopt:
0519             try:
0520                 item, value = arg.split('=')
0521             except ValueError as e:
0522                 print("Error: item and value must be separated by '='. {0}".format(e))
0523                 exit(1)
0524             item = item.strip()
0525             value = value.strip()
0526             oldvalue = settings.get('kf5.config', item)
0527             print("Changing {0} from {1} to {2}".format(item, oldvalue, value))
0528             settings.set('kf5.config', item, value)
0529             _setSettings(source_dir, build_dir, settings)
0530             _writeConfiguration(settings, configfile)
0531         exit(0)
0532         
0533     _setupAll(outputBaseDirectory, cmakelistBaseDirectory, kdelibsBuildDirectory,
0534               sipImportDir, sipImportDirs)
0535     #print(repr(kitemmodels.extractCmakeListsHeaders()))
0536     updateSIP()
0537     updateDocs()
0538 
0539 if __name__=="__main__":
0540     main()