[Distutils] RC and MC patch for msvccompiler
Thomas Heller
thomas.heller@ion-tof.com
Fri, 23 Jun 2000 10:58:39 +0200
This is a multi-part message in MIME format.
------=_NextPart_000_0494_01BFDD01.FD091580
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
This is the patch for msvccompiler factored out
of my previous swig patch, which allows compiling
resource scripts (.rc) to .res files,
and messages (.mc) to .res files.
The resulting .res files are passed to the linker.
Additionally .cxx is now recognized as C++ source extension.
Thomas
------=_NextPart_000_0494_01BFDD01.FD091580
Content-Type: text/plain;
name="msvccompiler.diff.txt"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="msvccompiler.diff.txt"
Index: msvccompiler.py
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/python/distutils/distutils/msvccompiler.py,v
retrieving revision 1.30
diff -c -r1.30 msvccompiler.py
*** msvccompiler.py 2000/05/30 02:02:49 1.30
--- msvccompiler.py 2000/06/23 08:46:53
***************
*** 169,179 ****
=20
# Private class data (need to distinguish C from C++ source for =
compiler)
_c_extensions =3D ['.c']
! _cpp_extensions =3D ['.cc','.cpp']
=20
# Needed for the filename generation methods provided by the
# base class, CCompiler.
! src_extensions =3D _c_extensions + _cpp_extensions
obj_extension =3D '.obj'
static_lib_extension =3D '.lib'
shared_lib_extension =3D '.dll'
--- 169,182 ----
=20
# Private class data (need to distinguish C from C++ source for =
compiler)
_c_extensions =3D ['.c']
! _cpp_extensions =3D ['.cc','.cpp', '.cxx']
! _rc_extensions =3D ['.rc']
! _mc_extensions =3D ['.mc']
=20
# Needed for the filename generation methods provided by the
# base class, CCompiler.
! src_extensions =3D _c_extensions + _cpp_extensions + =
_rc_extensions + _mc_extensions
! res_extension =3D '.res'
obj_extension =3D '.obj'
static_lib_extension =3D '.lib'
shared_lib_extension =3D '.dll'
***************
*** 195,200 ****
--- 198,205 ----
self.cc =3D find_exe("cl.exe", version)
self.link =3D find_exe("link.exe", version)
self.lib =3D find_exe("lib.exe", version)
+ self.rc =3D find_exe("rc.exe", version) # resource =
compiler
+ self.mc =3D find_exe("mc.exe", version) # message =
compiler
set_path_env_var ('lib', version)
set_path_env_var ('include', version)
path=3Dget_msvc_paths('path', version)
***************
*** 209,214 ****
--- 214,221 ----
self.cc =3D "cl.exe"
self.link =3D "link.exe"
self.lib =3D "lib.exe"
+ self.rc =3D "rc.exe"
+ self.mc =3D "mc.exe"
=20
self.preprocess_options =3D None
self.compile_options =3D [ '/nologo', '/Ox', '/MD', '/W3' ]
***************
*** 223,228 ****
--- 230,266 ----
=20
# -- Worker methods =
------------------------------------------------
=20
+ def object_filenames (self,
+ source_filenames,
+ strip_dir=3D0,
+ output_dir=3D''):
+ # Copied from ccompiler.py, extended to return .res as =
'object'-file
+ # for .rc input file
+ if output_dir is None: output_dir =3D ''
+ obj_names =3D []
+ for src_name in source_filenames:
+ (base, ext) =3D os.path.splitext (src_name)
+ if ext not in self.src_extensions:
+ # Better to raise an exception instead of silently =
continuing
+ # and later complain about sources and targets having
+ # different lengths
+ raise CompileError ("Don't know how to compile %s" % =
src_name)
+ if strip_dir:
+ base =3D os.path.basename (base)
+ if ext in self._rc_extensions:
+ obj_names.append (os.path.join (output_dir,
+ base + =
self.res_extension))
+ elif ext in self._mc_extensions:
+ obj_names.append (os.path.join (output_dir,
+ base + =
self.res_extension))
+ else:
+ obj_names.append (os.path.join (output_dir,
+ base + =
self.obj_extension))
+ return obj_names
+=20
+ # object_filenames ()
+=20
+=20
def compile (self,
sources,
output_dir=3DNone,
***************
*** 254,267 ****
if skip_sources[src]:
self.announce ("skipping %s (%s up-to-date)" % (src, =
obj))
else:
if ext in self._c_extensions:
input_opt =3D "/Tc" + src
elif ext in self._cpp_extensions:
input_opt =3D "/Tp" + src
=20
output_opt =3D "/Fo" + obj
-=20
- self.mkpath (os.path.dirname (obj))
try:
self.spawn ([self.cc] + compile_opts + pp_opts +
[input_opt, output_opt] +
--- 292,345 ----
if skip_sources[src]:
self.announce ("skipping %s (%s up-to-date)" % (src, =
obj))
else:
+ self.mkpath (os.path.dirname (obj))
+=20
if ext in self._c_extensions:
input_opt =3D "/Tc" + src
elif ext in self._cpp_extensions:
input_opt =3D "/Tp" + src
+ elif ext in self._rc_extensions:
+ # compile .RC to .RES file
+ input_opt =3D src
+ output_opt =3D "/fo" + obj
+ try:
+ self.spawn ([self.rc] +
+ [output_opt] + [input_opt])
+ except DistutilsExecError, msg:
+ raise CompileError, msg
+ continue
+ elif ext in self._mc_extensions:
+ # compile .MC to .RC file to .RES file
+ # '-h dir' specifies the directory for the =
generated include file
+ # '-r dir' specifies the target directory of the =
generated RC file
+ # and the binary message resource it includes.
+=20
+ # For now (since there are no options to change =
this),
+ # we use the source-directory for the include file
+ # and the build directory for the RC file
+ # and message resources. This works at least for =
win32all.
+ h_dir =3D os.path.dirname (src)
+ rc_dir =3D os.path.dirname (obj)
+ try:
+ # first compile .MC to .RC and .H file
+ self.spawn ([self.mc] +
+ ['-h', h_dir, '-r', rc_dir] + =
[src])
+ base, _ =3D os.path.splitext (os.path.basename =
(src))
+ rc_file =3D os.path.join (rc_dir, base + =
'.rc')
+ # then compile .RC to .RES file
+ self.spawn ([self.rc] +
+ ["/fo" + obj] + [rc_file])
+=20
+ except DistutilsExecError, msg:
+ raise CompileError, msg
+ continue
+ else:
+ # how to handle this file?
+ raise CompileError (
+ "Don't know how to compile %s to %s" % \
+ (src, obj))
=20
output_opt =3D "/Fo" + obj
try:
self.spawn ([self.cc] + compile_opts + pp_opts +
[input_opt, output_opt] +
***************
*** 374,382 ****
if extra_postargs:
ld_args.extend (extra_postargs)
=20
- print "link_shared_object():"
- print " output_filename =3D", output_filename
- print " mkpath'ing:", os.path.dirname (output_filename)
self.mkpath (os.path.dirname (output_filename))
try:
self.spawn ([self.link] + ld_args)
--- 452,457 ----
------=_NextPart_000_0494_01BFDD01.FD091580--