cpython/Mac/scripts/genpluginprojects.py

186 lines
6.8 KiB
Python

import mkcwproject
import sys
import os
import string
PYTHONDIR = sys.prefix
PROJECTDIR = os.path.join(PYTHONDIR, ":Mac:Build")
MODULEDIRS = [ # Relative to projectdirs
"::Modules:%s",
"::Modules",
":::Modules",
]
# Global variable to control forced rebuild (otherwise the project is only rebuilt
# when it is changed)
FORCEREBUILD=0
def relpath(base, path):
"""Turn abs path into path relative to another. Only works for 2 abs paths
both pointing to folders"""
if not os.path.isabs(base) or not os.path.isabs(path):
raise 'Absolute paths only'
if base[-1] == ':':
base = base[:-1]
basefields = string.split(base, os.sep)
pathfields = string.split(path, os.sep)
commonfields = len(os.path.commonprefix((basefields, pathfields)))
basefields = basefields[commonfields:]
pathfields = pathfields[commonfields:]
pathfields = ['']*(len(basefields)+1) + pathfields
rv = string.join(pathfields, os.sep)
return rv
def genpluginproject(architecture, module,
project=None, projectdir=None,
sources=[], sourcedirs=[],
libraries=[], extradirs=[],
extraexportsymbols=[], outputdir=":::Lib:lib-dynload",
libraryflags=None, stdlibraryflags=None, prefixname=None,
initialize=None):
if architecture != "carbon":
raise 'Unsupported architecture: %s'%architecture
templatename = "template-%s" % architecture
targetname = "%s.%s" % (module, architecture)
dllname = "%s.%s.slb" % (module, architecture)
if not project:
project = "%s.%s.mcp"%(module, architecture)
if not projectdir:
projectdir = PROJECTDIR
if not sources:
sources = [module + 'module.c']
if not sourcedirs:
for moduledir in MODULEDIRS:
if '%' in moduledir:
# For historical reasons an initial _ in the modulename
# is not reflected in the folder name
if module[0] == '_':
modulewithout_ = module[1:]
else:
modulewithout_ = module
moduledir = moduledir % modulewithout_
fn = os.path.join(projectdir, os.path.join(moduledir, sources[0]))
if os.path.exists(fn):
moduledir, sourcefile = os.path.split(fn)
sourcedirs = [relpath(projectdir, moduledir)]
sources[0] = sourcefile
break
else:
print "Warning: %s: sourcefile not found: %s"%(module, sources[0])
sourcedirs = []
if prefixname:
pass
elif architecture == "carbon":
prefixname = "mwerks_shcarbon_pch"
else:
prefixname = "mwerks_plugin_config.h"
dict = {
"sysprefix" : relpath(projectdir, sys.prefix),
"sources" : sources,
"extrasearchdirs" : sourcedirs + extradirs,
"libraries": libraries,
"mac_outputdir" : outputdir,
"extraexportsymbols" : extraexportsymbols,
"mac_targetname" : targetname,
"mac_dllname" : dllname,
"prefixname" : prefixname,
}
if libraryflags:
dict['libraryflags'] = libraryflags
if stdlibraryflags:
dict['stdlibraryflags'] = stdlibraryflags
if initialize:
dict['initialize'] = initialize
mkcwproject.mkproject(os.path.join(projectdir, project), module, dict,
force=FORCEREBUILD, templatename=templatename)
def genallprojects(force=0):
global FORCEREBUILD
FORCEREBUILD = force
# Standard Python modules
genpluginproject("carbon", "pyexpat",
sources=["pyexpat.c", "xmlparse.c", "xmlrole.c", "xmltok.c"],
extradirs=[":::Modules:expat"],
prefixname="mwerks_shcarbon_config.h"
)
genpluginproject("carbon", "zlib",
libraries=["zlib.ppc.Lib"],
extradirs=["::::imglibs:zlib:mac", "::::imglibs:zlib"])
genpluginproject("carbon", "gdbm",
libraries=["gdbm.ppc.gusi.lib"],
extradirs=["::::gdbm:mac", "::::gdbm"])
genpluginproject("carbon", "_weakref", sources=["_weakref.c"])
genpluginproject("carbon", "_symtable", sources=["symtablemodule.c"])
# Example/test modules
genpluginproject("carbon", "_testcapi")
genpluginproject("carbon", "xx")
genpluginproject("carbon", "xxsubtype", sources=["xxsubtype.c"])
genpluginproject("carbon", "_hotshot", sources=["_hotshot.c"])
# bgen-generated Toolbox modules
genpluginproject("carbon", "_AE", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_AH", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_App", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Cm", outputdir="::Lib:Carbon")
# XXX can't work properly because we need to set a custom fragment initializer
#genpluginproject("carbon", "_CG",
# sources=["_CGModule.c", "CFMLateImport.c"],
# libraries=["CGStubLib"],
# outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Ctl", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Dlg", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Drag", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Evt",
stdlibraryflags="Debug, WeakImport", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_File",
stdlibraryflags="Debug, WeakImport", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Fm",
stdlibraryflags="Debug, WeakImport", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Folder",
stdlibraryflags="Debug, WeakImport", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Help", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_IBCarbon", sources=[":ibcarbon:_IBCarbon.c"],
outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Icn", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_List", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Menu", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Qd",
stdlibraryflags="Debug, WeakImport", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Qt",
libraryflags="Debug, WeakImport", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Qdoffs",
stdlibraryflags="Debug, WeakImport", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Res",
stdlibraryflags="Debug, WeakImport", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Scrap", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Snd", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Sndihooks", sources=[":snd:_Sndihooks.c"], outputdir="::Lib:Carbon")
genpluginproject("carbon", "_TE", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Mlte", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_Win", outputdir="::Lib:Carbon")
genpluginproject("carbon", "_CF", sources=["_CFmodule.c", "pycfbridge.c"], outputdir="::Lib:Carbon")
genpluginproject("carbon", "_CarbonEvt", outputdir="::Lib:Carbon")
genpluginproject("carbon", "hfsplus")
# Other Mac modules
genpluginproject("carbon", "calldll", sources=["calldll.c"])
genpluginproject("carbon", "ColorPicker")
genpluginproject("carbon", "waste",
sources=[
"wastemodule.c",
"WEObjectHandlers.c",
"WETabs.c", "WETabHooks.c"],
libraries=["WASTE.Carbon.lib"],
extradirs=[
'{Compiler}:MacOS Support:(Third Party Support):Waste 2.0 Distribution:C_C++ Headers',
'{Compiler}:MacOS Support:(Third Party Support):Waste 2.0 Distribution:Static Libraries',
'::wastemods',
]
)
genpluginproject("carbon", "icglue", sources=["icgluemodule.c"])
if __name__ == '__main__':
genallprojects()