~svn/ubuntu/oneiric/subversion/ppa

« back to all changes in this revision

Viewing changes to build/generator/gen_vcnet_vcproj.py

  • Committer: Bazaar Package Importer
  • Author(s): Adam Conrad
  • Date: 2005-12-05 01:26:14 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20051205012614-qom4xfypgtsqc2xq
Tags: 1.2.3dfsg1-3ubuntu1
Merge with the final Debian release of 1.2.3dfsg1-3, bringing in
fixes to the clean target, better documentation of the libdb4.3
upgrade and build fixes to work with swig1.3_1.3.27.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#
 
2
# gen_vcnet.py -- generate Microsoft Visual C++.NET projects
 
3
#
 
4
 
 
5
import os
 
6
import md5
 
7
import string
 
8
 
 
9
import gen_base
 
10
import gen_win
 
11
import ezt
 
12
 
 
13
 
 
14
class Generator(gen_win.WinGeneratorBase):
 
15
  "Generate a Visual C++.NET project"
 
16
 
 
17
  def __init__(self, fname, verfname, options):
 
18
    gen_win.WinGeneratorBase.__init__(self, fname, verfname, options,
 
19
                                      'vcnet-vcproj')
 
20
 
 
21
  def quote(self, str):
 
22
    return '"%s"' % str
 
23
 
 
24
  def write_project(self, target, fname):
 
25
    "Write a Project (.vcproj)"
 
26
 
 
27
    if isinstance(target, gen_base.TargetExe):
 
28
      #EXE
 
29
      config_type=1
 
30
    elif isinstance(target, gen_base.TargetJava):
 
31
      config_type=1
 
32
    elif isinstance(target, gen_base.TargetLib):
 
33
      if target.msvc_static:
 
34
        config_type=4
 
35
      else:
 
36
        config_type=2
 
37
    elif isinstance(target, gen_base.TargetProject):
 
38
      config_type=1
 
39
    elif isinstance(target, gen_base.TargetI18N):
 
40
      config_type=4
 
41
    else:
 
42
      raise gen_base.GenError("Cannot create project for %s" % target.name)
 
43
 
 
44
    target.output_name = self.get_output_name(target)
 
45
    target.output_dir = self.get_output_dir(target)
 
46
    target.intermediate_dir = self.get_intermediate_dir(target)
 
47
 
 
48
    configs = self.get_configs(target)
 
49
 
 
50
    sources = self.get_proj_sources(False, target)
 
51
 
 
52
    data = {
 
53
      'target' : target,
 
54
      'target_type' : config_type,
 
55
#      'target_number' : targval,
 
56
      'rootpath' : self.rootpath,
 
57
      'platforms' : self.platforms,
 
58
      'configs' : configs,
 
59
      'includes' : self.get_win_includes(target),
 
60
      'sources' : sources,
 
61
      'default_platform' : self.platforms[0],
 
62
      'default_config' : configs[0].name,
 
63
      'def_file' : self.get_def_file(target),
 
64
      'is_exe' : ezt.boolean(isinstance(target, gen_base.TargetExe)),
 
65
      'is_external' : ezt.boolean((isinstance(target, gen_base.TargetProject)
 
66
                                   or isinstance(target, gen_base.TargetI18N))
 
67
                                  and target.cmd),
 
68
      'is_utility' : ezt.boolean(isinstance(target,
 
69
                                            gen_base.TargetProject)),
 
70
      'instrument_apr_pools' : self.instrument_apr_pools,
 
71
      'instrument_purify_quantify' : self.instrument_purify_quantify,
 
72
      'version' : self.vsnet_proj_ver,
 
73
      }
 
74
 
 
75
    self.write_with_template(fname, 'vcnet_vcproj.ezt', data)
 
76
 
 
77
  def makeguid(self, data):
 
78
    "Generate a windows style GUID"
 
79
    ### blah. this function can generate invalid GUIDs. leave it for now,
 
80
    ### but we need to fix it. we can wrap the apr UUID functions, or
 
81
    ### implement this from scratch using the algorithms described in
 
82
    ### http://www.webdav.org/specs/draft-leach-uuids-guids-01.txt
 
83
 
 
84
    hash = md5.md5(data)
 
85
    try:
 
86
      myhash = hash.hexdigest()
 
87
    except AttributeError:
 
88
      # Python 1.5.2
 
89
      myhash = string.join(map(lambda x: '%02x' % ord(x), hash.digest()), '')
 
90
 
 
91
    guid = string.upper("{%s-%s-%s-%s-%s}" % (myhash[0:8], myhash[8:12],
 
92
                                              myhash[12:16], myhash[16:20],
 
93
                                              myhash[20:32]))
 
94
    return guid
 
95
 
 
96
  def write(self):
 
97
    "Write a Solution (.sln)"
 
98
 
 
99
    # apr doesn't supply vcproj files, so move our pre-defined ones
 
100
    # over if they don't match
 
101
    self.move_proj_file(self.apr_path, 'libapr.vcproj')
 
102
    self.move_proj_file(self.apr_iconv_path, 'libapriconv.vcproj')
 
103
    self.move_proj_file(os.path.join(self.apr_iconv_path,'ccs'),
 
104
                        'libapriconv_ccs_modules.vcproj')
 
105
    self.move_proj_file(os.path.join(self.apr_iconv_path,'ces'),
 
106
                        'libapriconv_ces_modules.vcproj')
 
107
    self.move_proj_file(self.apr_util_path, 'libaprutil.vcproj')
 
108
    self.move_proj_file(os.path.join(self.apr_util_path,'uri'),
 
109
                        'gen_uri_delims.vcproj')
 
110
    self.move_proj_file(os.path.join(self.apr_util_path,'xml', 'expat',
 
111
                        'lib'), 'xml.vcproj')
 
112
    self.move_proj_file(os.path.join('build', 'win32'), 'svn_config.vcproj')
 
113
    self.move_proj_file(os.path.join('build', 'win32'), 'svn_locale.vcproj')
 
114
    self.write_zlib_project_file('zlib.vcproj')
 
115
    self.write_neon_project_file('neon.vcproj')
 
116
 
 
117
    install_targets = self.get_install_targets()
 
118
 
 
119
    targets = [ ]
 
120
 
 
121
    guids = { }
 
122
 
 
123
    # VC.NET uses GUIDs to refer to projects. generate them up front
 
124
    # because we need them already assigned on the dependencies for
 
125
    # each target we work with.
 
126
    for target in install_targets:
 
127
      # These aren't working yet
 
128
      if isinstance(target, gen_base.TargetProject) and target.cmd:
 
129
        continue
 
130
      guids[target.name] = self.makeguid(target.name)
 
131
 
 
132
    self.gen_proj_names(install_targets)
 
133
 
 
134
    # Traverse the targets and generate the project files
 
135
    for target in install_targets:
 
136
      name = target.name
 
137
      # These aren't working yet
 
138
      if isinstance(target, gen_base.TargetProject) and target.cmd:
 
139
        continue
 
140
 
 
141
      fname = self.get_external_project(target, 'vcproj')
 
142
      if fname is None:
 
143
        fname = os.path.join(self.projfilesdir,
 
144
                             "%s_vcnet.vcproj" % target.proj_name)
 
145
        self.write_project(target, fname)
 
146
 
 
147
      if '-' in fname:
 
148
        fname = '"%s"' % fname
 
149
 
 
150
      depends = [ ]
 
151
      if not isinstance(target, gen_base.TargetI18N):
 
152
        depends = self.adjust_win_depends(target, name)
 
153
 
 
154
      deplist = [ ]
 
155
      for i in range(len(depends)):
 
156
        deplist.append(gen_win.ProjectItem(guid=guids[depends[i].name],
 
157
                                           index=i,
 
158
                                           ))
 
159
      targets.append(
 
160
        gen_win.ProjectItem(name=target.name,
 
161
                            path=string.replace(fname, os.sep, '\\'),
 
162
                            guid=guids[target.name],
 
163
                            depends=deplist,
 
164
                            ))
 
165
 
 
166
    targets.sort(lambda x, y: cmp(x.name, y.name))
 
167
 
 
168
    configs = [ ]
 
169
    for i in range(len(self.configs)):
 
170
      ### this is different from write_project
 
171
      configs.append(gen_win.ProjectItem(name=self.configs[i], index=i))
 
172
 
 
173
    # sort the values for output stability.
 
174
    guidvals = guids.values()
 
175
    guidvals.sort()
 
176
 
 
177
    data = {
 
178
      'version': self.vsnet_version,
 
179
      'targets' : targets,
 
180
      'configs' : configs,
 
181
      'platforms' : self.platforms,
 
182
      'guids' : guidvals,
 
183
      }
 
184
 
 
185
    self.write_with_template('subversion_vcnet.sln', 'vcnet_sln.ezt', data)
 
186
 
 
187
 
 
188
# compatibility with older Pythons:
 
189
try:
 
190
  True
 
191
except NameError:
 
192
  True = 1
 
193
  False = 0