]> git.saurik.com Git - wxWidgets.git/blob - build/bakefiles/wxwin.py
glibc's vswprintf doesn't nul terminate on truncation.
[wxWidgets.git] / build / bakefiles / wxwin.py
1 #
2 # Helper functions for wxWidgets bakefiles
3 #
4 # $Id$
5 #
6
7
8 import 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
15 try:
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
20 except AttributeError:
21 def __noopSubst(func, name):
22 return '$(%s)' % name
23 utils.addSubstituteCallback('CFG', __noopSubst)
24 utils.addSubstituteCallback('LIBDIRNAME', __noopSubst)
25 utils.addSubstituteCallback('SETUPHDIR', __noopSubst)
26 utils.addSubstituteCallback('OBJS', __noopSubst)
27
28
29 def 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):
42 MAIN_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:
45 LIBS_NOGUI = ['xml', 'net', 'odbc']
46 LIBS_GUI = ['core', 'adv', 'html', 'gl', 'qa', 'dbgrid', 'xrc', 'media', 'aui', 'richtext']
47 # Additional libraries that must be linked in:
48 EXTRALIBS = {
49 'gl' : '$(EXTRALIBS_OPENGL)',
50 'xml' : '$(EXTRALIBS_XML)',
51 'html' : '$(EXTRALIBS_HTML)',
52 'odbc' : '$(EXTRALIBS_ODBC)',
53 'adv' : '$(PLUGIN_ADV_EXTRALIBS)',
54 }
55
56 def mkLibName(wxid):
57 """Returns string that can be used as library name, including name
58 suffixes, prefixes, version tags etc. This must be kept in sync
59 with variables defined in common.bkl!"""
60 if wxid == 'mono':
61 return '$(WXNAMEPREFIXGUI)$(WXNAMESUFFIX)$(WXVERSIONTAG)$(HOST_SUFFIX)'
62 if wxid == 'base':
63 return '$(WXNAMEPREFIX)$(WXNAMESUFFIX)$(WXVERSIONTAG)$(HOST_SUFFIX)'
64 if wxid in LIBS_NOGUI:
65 return '$(WXNAMEPREFIX)$(WXNAMESUFFIX)_%s$(WXVERSIONTAG)$(HOST_SUFFIX)' % wxid
66 return '$(WXNAMEPREFIXGUI)$(WXNAMESUFFIX)_%s$(WXVERSIONTAG)$(HOST_SUFFIX)' % wxid
67
68 def mkDllName(wxid):
69 """Returns string that can be used as DLL name, including name
70 suffixes, prefixes, version tags etc. This must be kept in sync
71 with variables defined in common.bkl!"""
72 if wxid == 'mono':
73 return '$(WXDLLNAMEPREFIXGUI)$(WXNAMESUFFIX)$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG)'
74 if wxid == 'base':
75 return '$(WXDLLNAMEPREFIX)$(WXNAMESUFFIX)$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG)'
76 if wxid in LIBS_NOGUI:
77 return '$(WXDLLNAMEPREFIX)$(WXNAMESUFFIX)_%s$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG)' % wxid
78 return '$(WXDLLNAMEPREFIXGUI)$(WXNAMESUFFIX)_%s$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG)' % wxid
79
80
81 def libToLink(wxlibname):
82 """Returns string to pass to <sys-lib> when linking against 'wxlibname'.
83 For one of main libraries, libToLink('foo') returns '$(WXLIB_FOO)' which
84 must be defined in common.bkl as either nothing (in monolithic build) or
85 mkLibName('foo') (otherwise).
86 For contrib libraries, it returns mkDllName(wxlibname).
87 """
88 if wxlibname in MAIN_LIBS:
89 return '$(WXLIB_%s)' % wxlibname.upper()
90 else:
91 return mkLibName(wxlibname)
92
93 def extraLdflags(wxlibname):
94 if wxlibname in EXTRALIBS:
95 return EXTRALIBS[wxlibname]
96 else:
97 return ''
98
99 wxVersion = None
100 VERSION_FILE = '../../include/wx/version.h'
101
102 def getVersion():
103 """Returns wxWidgets version as a tuple: (major,minor,release)."""
104 global wxVersion
105 if wxVersion == None:
106 f = open(VERSION_FILE, 'rt')
107 lines = f.readlines()
108 f.close()
109 major = minor = release = None
110 for l in lines:
111 if not l.startswith('#define'): continue
112 splitline = l.strip().split()
113 if splitline[0] != '#define': continue
114 if len(splitline) < 3: continue
115 name = splitline[1]
116 value = splitline[2]
117 if value == None: continue
118 if name == 'wxMAJOR_VERSION': major = int(value)
119 if name == 'wxMINOR_VERSION': minor = int(value)
120 if name == 'wxRELEASE_NUMBER': release = int(value)
121 if major != None and minor != None and release != None:
122 break
123 wxVersion = (major, minor, release)
124 return wxVersion
125
126 def getVersionMajor():
127 return getVersion()[0]
128 def getVersionMinor():
129 return getVersion()[1]
130 def getVersionRelease():
131 return getVersion()[2]
132
133
134 def headersOnly(files):
135 """Filters 'files' so that only headers are left. Used with
136 <msvc-project-files> to add headers to VC++ projects but not files such
137 as arrimpl.cpp."""
138
139 def callback(cond, sources):
140 prf = suf = ''
141 if sources[0].isspace(): prf=' '
142 if sources[-1].isspace(): suf=' '
143 retval = []
144 for s in sources.split():
145 if s.endswith('.h'):
146 retval.append(s)
147 return '%s%s%s' % (prf, ' '.join(retval), suf)
148 return utils.substitute2(files, callback)
149
150
151 def makeDspDependency(lib):
152 """Returns suitable entry for <depends-on-dsp> for main libs."""
153 return '%s:$(nativePaths(WXTOPDIR))build\\msw\\wx_%s.dsp' % (lib,lib)
154
155 def makeContribDspDependency(lib):
156 """Returns suitable entry for <depends-on-dsp> for contrib libs."""
157 return '%s:$(nativePaths(WXTOPDIR))contrib\\build\\%s\\%s.dsp' % (lib,lib,lib)