1#
2# Helper functions for wxWidgets bakefiles
3#
4# $Id: wxwin.py 50120 2007-11-20 22:52:40Z VS $
5#
6
7
8import utils
9
10# We use 'CFG' option in places where bakefile doesn't like it, so we must
11# register a substitution function for it that provides additional knowledge
12# about the option (in this case that it does not contain dir separators and
13# so utils.nativePaths() doesn't have to do anything with it):
14
15try:
16    # this fails in 0.1.4 and 0.1.5 has different subst.callbacks signature:
17    utils.checkBakefileVersion('0.1.5')
18    def __noopSubst(name, func, caller):
19        return '$(%s)' % name
20except AttributeError:
21    def __noopSubst(func, name):
22        return '$(%s)' % name
23utils.addSubstituteCallback('CFG', __noopSubst)
24utils.addSubstituteCallback('LIBDIRNAME', __noopSubst)
25utils.addSubstituteCallback('SETUPHDIR', __noopSubst)
26utils.addSubstituteCallback('OBJS', __noopSubst)
27
28
29def mk_wxid(id):
30    """Creates wxWidgets library identifier from bakefile target ID that
31       follows this convention: DLLs end with 'dll', static libraries
32       end with 'lib'. If withPrefix=1, then _wxid is returned instead
33       of wxid."""
34    if id.endswith('dll') or id.endswith('lib'):
35        wxid = id[:-3]
36    else:
37        wxid = id
38    return wxid
39
40
41# All libs that are part of the main library (i.e. non-contrib):
42MAIN_LIBS = ['mono', 'base', 'core', 'adv', 'html', 'xml', 'net',
43             'media', 'odbc', 'qa', 'dbgrid', 'xrc', 'aui', 'richtext']
44# List of library names/ids for categories with different names:
45LIBS_NOGUI = ['xml', 'net', 'odbc']
46LIBS_GUI   = ['core', 'adv', 'html', 'gl', 'qa', 'dbgrid', 'xrc', 'media', 'aui', 'richtext']
47# Additional libraries that must be linked in:
48EXTRALIBS = {
49    'gl' : '$(EXTRALIBS_OPENGL)',
50    'xml' : '$(EXTRALIBS_XML)',
51    'html' : '$(EXTRALIBS_HTML)',
52    'odbc' : '$(EXTRALIBS_ODBC)',
53    'adv' : '$(PLUGIN_ADV_EXTRALIBS)',
54    'media' : '$(EXTRALIBS_MEDIA)',
55}
56
57def mkLibName(wxid):
58    """Returns string that can be used as library name, including name
59       suffixes, prefixes, version tags etc. This must be kept in sync
60       with variables defined in common.bkl!"""
61    if wxid == 'mono':
62        return '$(WXNAMEPREFIXGUI)$(WXNAMESUFFIX)$(WXVERSIONTAG)$(HOST_SUFFIX)'
63    if wxid == 'base':
64        return '$(WXNAMEPREFIX)$(WXNAMESUFFIX)$(WXVERSIONTAG)$(HOST_SUFFIX)'
65    if wxid in LIBS_NOGUI:
66        return '$(WXNAMEPREFIX)$(WXNAMESUFFIX)_%s$(WXVERSIONTAG)$(HOST_SUFFIX)' % wxid
67    return '$(WXNAMEPREFIXGUI)$(WXNAMESUFFIX)_%s$(WXVERSIONTAG)$(HOST_SUFFIX)' % wxid
68
69def mkDllName(wxid):
70    """Returns string that can be used as DLL name, including name
71       suffixes, prefixes, version tags etc. This must be kept in sync
72       with variables defined in common.bkl!"""
73    if wxid == 'mono':
74        return '$(WXDLLNAMEPREFIXGUI)$(WXNAMESUFFIX)$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG)'
75    if wxid == 'base':
76        return '$(WXDLLNAMEPREFIX)$(WXNAMESUFFIX)$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG)'
77    if wxid in LIBS_NOGUI:
78        return '$(WXDLLNAMEPREFIX)$(WXNAMESUFFIX)_%s$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG)' % wxid
79    return '$(WXDLLNAMEPREFIXGUI)$(WXNAMESUFFIX)_%s$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG)' % wxid
80
81
82def libToLink(wxlibname):
83    """Returns string to pass to <sys-lib> when linking against 'wxlibname'.
84       For one of main libraries, libToLink('foo') returns '$(WXLIB_FOO)' which
85       must be defined in common.bkl as either nothing (in monolithic build) or
86       mkLibName('foo') (otherwise).
87       For contrib libraries, it returns mkDllName(wxlibname).
88       """
89    if wxlibname in MAIN_LIBS:
90        return '$(WXLIB_%s)' % wxlibname.upper()
91    else:
92        return mkLibName(wxlibname)
93
94def extraLdflags(wxlibname):
95    if wxlibname in EXTRALIBS:
96        return EXTRALIBS[wxlibname]
97    else:
98        return ''
99
100wxVersion = None
101VERSION_FILE = '../../include/wx/version.h'
102
103def getVersion():
104    """Returns wxWidgets version as a tuple: (major,minor,release)."""
105    global wxVersion
106    if wxVersion == None:
107        f = open(VERSION_FILE, 'rt')
108        lines = f.readlines()
109        f.close()
110        major = minor = release = None
111        for l in lines:
112            if not l.startswith('#define'): continue
113            splitline = l.strip().split()
114            if splitline[0] != '#define': continue
115            if len(splitline) < 3: continue
116            name = splitline[1]
117            value = splitline[2]
118            if value == None: continue
119            if name == 'wxMAJOR_VERSION': major = int(value)
120            if name == 'wxMINOR_VERSION': minor = int(value)
121            if name == 'wxRELEASE_NUMBER': release = int(value)
122            if major != None and minor != None and release != None:
123                break
124        wxVersion = (major, minor, release)
125    return wxVersion
126
127def getVersionMajor():
128    return getVersion()[0]
129def getVersionMinor():
130    return getVersion()[1]
131def getVersionRelease():
132    return getVersion()[2]
133
134
135def headersOnly(files):
136    """Filters 'files' so that only headers are left. Used with
137       <msvc-project-files> to add headers to VC++ projects but not files such
138       as arrimpl.cpp."""
139
140    def callback(cond, sources):
141        prf = suf = ''
142        if sources[0].isspace(): prf=' '
143        if sources[-1].isspace(): suf=' '
144        retval = []
145        for s in sources.split():
146            if s.endswith('.h'):
147                retval.append(s)
148        return '%s%s%s' % (prf, ' '.join(retval), suf)
149    return utils.substitute2(files, callback)
150
151
152def makeDspDependency(lib):
153    """Returns suitable entry for <depends-on-dsp> for main libs."""
154    return '%s:$(nativePaths(WXTOPDIR))build\\msw\\wx_%s.dsp' % (lib,lib)
155
156def makeContribDspDependency(lib):
157    """Returns suitable entry for <depends-on-dsp> for contrib libs."""
158    return '%s:$(nativePaths(WXTOPDIR))contrib\\build\\%s\\%s.dsp' % (lib,lib,lib)
159