[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--