Can you suggest a patch for this ?
It is not immediately obvious to me how to do this.

I've attached a quick patch. Sorry for all the noise, my editor is configured to reformat Python code.

The patch provides a custom build_py command class for distutils / setuptools. It writes jcc.config during the build_py phase if the file doesn't exist or a build command is provided on the command line.
Index: setup.py
===================================================================
--- setup.py	(Revision 945822)
+++ setup.py	(Arbeitskopie)
@@ -10,7 +10,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
-import os, sys, platform, subprocess
+import os, sys, platform, subprocess, textwrap
 
 jcc_ver = '2.6'
 machine = platform.machine()
@@ -72,22 +72,22 @@
 
 Please set the environment variable JCC_JDK to the correct location before
 running setup.py.
-''' %(JDK[platform]))
+''' % (JDK[platform]))
 
 
 INCLUDES = {
-    'darwin': ['%(darwin)s/Headers' %(JDK)],
-    'ipod': ['%(ipod)s/darwin/default' %(JDK)],
-    'linux2': ['%(linux2)s/include' %(JDK),
-               '%(linux2)s/include/linux' %(JDK)],
-    'sunos5': ['%(sunos5)s/include' %(JDK),
-               '%(sunos5)s/include/solaris' %(JDK)],
-    'win32': ['%(win32)s/include' %(JDK),
-              '%(win32)s/include/win32' %(JDK)],
-    'mingw32': ['%(mingw32)s/include' %(JDK),
-                '%(mingw32)s/include/win32' %(JDK)],
-    'freebsd7': ['%(freebsd7)s/include' %(JDK),
-                 '%(freebsd7)s/include/freebsd' %(JDK)],
+    'darwin': ['%(darwin)s/Headers' % (JDK)],
+    'ipod': ['%(ipod)s/darwin/default' % (JDK)],
+    'linux2': ['%(linux2)s/include' % (JDK),
+               '%(linux2)s/include/linux' % (JDK)],
+    'sunos5': ['%(sunos5)s/include' % (JDK),
+               '%(sunos5)s/include/solaris' % (JDK)],
+    'win32': ['%(win32)s/include' % (JDK),
+              '%(win32)s/include/win32' % (JDK)],
+    'mingw32': ['%(mingw32)s/include' % (JDK),
+                '%(mingw32)s/include/win32' % (JDK)],
+    'freebsd7': ['%(freebsd7)s/include' % (JDK),
+                 '%(freebsd7)s/include/freebsd' % (JDK)],
 }
 
 CFLAGS = {
@@ -114,48 +114,48 @@
 
 LFLAGS = {
     'darwin': ['-framework', 'JavaVM'],
-    'ipod': ['-ljvm', '-lpython%s.%s' %(sys.version_info[0:2]),
+    'ipod': ['-ljvm', '-lpython%s.%s' % (sys.version_info[0:2]),
              '-L/usr/lib/gcc/arm-apple-darwin9/4.0.1'],
-    'linux2/i386': ['-L%(linux2)s/jre/lib/i386' %(JDK), '-ljava',
-                    '-L%(linux2)s/jre/lib/i386/client' %(JDK), '-ljvm',
-                    '-Wl,-rpath=%(linux2)s/jre/lib/i386:%(linux2)s/jre/lib/i386/client' %(JDK)],
-    'linux2/i686': ['-L%(linux2)s/jre/lib/i386' %(JDK), '-ljava',
-                    '-L%(linux2)s/jre/lib/i386/client' %(JDK), '-ljvm',
-                    '-Wl,-rpath=%(linux2)s/jre/lib/i386:%(linux2)s/jre/lib/i386/client' %(JDK)],
-    'linux2/x86_64': ['-L%(linux2)s/jre/lib/amd64' %(JDK), '-ljava',
-                      '-L%(linux2)s/jre/lib/amd64/server' %(JDK), '-ljvm',
-                      '-Wl,-rpath=%(linux2)s/jre/lib/amd64:%(linux2)s/jre/lib/amd64/server' %(JDK)],
-    'sunos5': ['-L%(sunos5)s/jre/lib/i386' %(JDK), '-ljava',
-               '-L%(sunos5)s/jre/lib/i386/client' %(JDK), '-ljvm',
-               '-R%(sunos5)s/jre/lib/i386:%(sunos5)s/jre/lib/i386/client' %(JDK)],
-    'win32': ['/LIBPATH:%(win32)s/lib' %(JDK), 'jvm.lib'],
-    'mingw32': ['-L%(mingw32)s/lib' %(JDK), '-ljvm'],
-    'freebsd7': ['-L%(freebsd7)s/jre/lib/i386' %(JDK), '-ljava', '-lverify',
-                 '-L%(freebsd7)s/jre/lib/i386/client' %(JDK), '-ljvm',
-                 '-Wl,-rpath=%(freebsd7)s/jre/lib/i386:%(freebsd7)s/jre/lib/i386/client' %(JDK)],
+    'linux2/i386': ['-L%(linux2)s/jre/lib/i386' % (JDK), '-ljava',
+                    '-L%(linux2)s/jre/lib/i386/client' % (JDK), '-ljvm',
+                    '-Wl,-rpath=%(linux2)s/jre/lib/i386:%(linux2)s/jre/lib/i386/client' % (JDK)],
+    'linux2/i686': ['-L%(linux2)s/jre/lib/i386' % (JDK), '-ljava',
+                    '-L%(linux2)s/jre/lib/i386/client' % (JDK), '-ljvm',
+                    '-Wl,-rpath=%(linux2)s/jre/lib/i386:%(linux2)s/jre/lib/i386/client' % (JDK)],
+    'linux2/x86_64': ['-L%(linux2)s/jre/lib/amd64' % (JDK), '-ljava',
+                      '-L%(linux2)s/jre/lib/amd64/server' % (JDK), '-ljvm',
+                      '-Wl,-rpath=%(linux2)s/jre/lib/amd64:%(linux2)s/jre/lib/amd64/server' % (JDK)],
+    'sunos5': ['-L%(sunos5)s/jre/lib/i386' % (JDK), '-ljava',
+               '-L%(sunos5)s/jre/lib/i386/client' % (JDK), '-ljvm',
+               '-R%(sunos5)s/jre/lib/i386:%(sunos5)s/jre/lib/i386/client' % (JDK)],
+    'win32': ['/LIBPATH:%(win32)s/lib' % (JDK), 'jvm.lib'],
+    'mingw32': ['-L%(mingw32)s/lib' % (JDK), '-ljvm'],
+    'freebsd7': ['-L%(freebsd7)s/jre/lib/i386' % (JDK), '-ljava', '-lverify',
+                 '-L%(freebsd7)s/jre/lib/i386/client' % (JDK), '-ljvm',
+                 '-Wl,-rpath=%(freebsd7)s/jre/lib/i386:%(freebsd7)s/jre/lib/i386/client' % (JDK)],
 }
 
 if platform == 'linux2':
-    LFLAGS['linux2'] = LFLAGS['linux2/%s' %(machine)]
+    LFLAGS['linux2'] = LFLAGS['linux2/%s' % (machine)]
 
 JAVAC = {
     'darwin': ['javac', '-target', '1.5'],
     'ipod': ['jikes', '-cp', '/usr/share/classpath/glibj.zip'],
     'linux2': ['javac'],
     'sunos5': ['javac'],
-    'win32': ['%(win32)s/bin/javac.exe' %(JDK)],
-    'mingw32': ['%(mingw32)s/bin/javac.exe' %(JDK)],
+    'win32': ['%(win32)s/bin/javac.exe' % (JDK)],
+    'mingw32': ['%(mingw32)s/bin/javac.exe' % (JDK)],
     'freebsd7': ['javac'],
 }
-        
 
+
 try:
     if 'USE_DISTUTILS' in os.environ:
         raise ImportError
     from setuptools import setup, Extension
     from pkg_resources import require
     with_setuptools = require('setuptools')[0].parsed_version
-    
+
     enable_shared = False
     with_setuptools_c7 = ('00000000', '00000006', '*c', '00000007', '*final')
 
@@ -181,7 +181,43 @@
         with_setuptools = None
         enable_shared = False
 
+from distutils.command.build_py import build_py
+from distutils import log
 
+
+class JCCBuildPy(build_py):
+    config_text = None
+    config_file = os.path.join(os.path.dirname(os.path.abspath(__file__)),
+                               'jcc', 'config.py')
+    def run(self):
+        self.write_jcc_config()
+        return build_py.run(self)
+
+    def write_jcc_config(self):
+        # only write jcc.config if the file doesn't exist or a build 
+        # command is given
+        write = False
+        if not os.path.isfile(self.config_file):
+            write = True
+        else:
+            for command in self.distribution.commands:
+                if command.startswith("build"):
+                    write = True
+                    break
+
+        if write:
+            log.info("Writing jcc.config")
+            config = open(self.config_file, 'w')
+            print self.config_text
+            try:
+                config.write(self.config_text)
+            finally:
+               config.close()
+        else:
+            log.info("Not writing jcc.config")
+
+
+
 def main(debug):
 
     _jcc_argsep = os.environ.get('JCC_ARGSEP', os.pathsep)
@@ -211,18 +247,17 @@
     else:
         _javac = JAVAC[platform]
 
-    config = file(os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                               'jcc', 'config.py'), 'w')
-    print >>config
-    print >>config, 'INCLUDES=%s' %(_includes)
-    print >>config, 'CFLAGS=%s' %(_cflags)
-    print >>config, 'DEBUG_CFLAGS=%s' %(_debug_cflags)
-    print >>config, 'LFLAGS=%s' %(_lflags)
-    print >>config, 'SHARED=%s' %(enable_shared)
-    print >>config, 'VERSION="%s"' %(jcc_ver)
-    print >>config
-    config.close()
 
+    config = ['']
+    config.append('INCLUDES=%s' % (_includes))
+    config.append('CFLAGS=%s' % (_cflags))
+    config.append('DEBUG_CFLAGS=%s' % (_debug_cflags))
+    config.append('LFLAGS=%s' % (_lflags))
+    config.append('SHARED=%s' % (enable_shared))
+    config.append('VERSION="%s"' % (jcc_ver))
+    config.append('')
+    JCCBuildPy.config_text = '\n'.join(config)
+
     extensions = []
 
     boot = '_jcc'
@@ -259,7 +294,7 @@
         kwds = { "extra_compile_args": cflags,
                  "include_dirs": includes,
                  "define_macros": [('_jcc_lib', None),
-                                   ('JCC_VER', '"%s"' %(jcc_ver))],
+                                   ('JCC_VER', '"%s"' % (jcc_ver))],
                  "sources": sources[0:2] }
 
         if platform in ('darwin', 'ipod'):
@@ -269,12 +304,12 @@
                           '-compatibility_version', jcc_ver]
         elif platform == 'linux2':
             kwds["extra_link_args"] = \
-                lflags + ['-lpython%s.%s' %(sys.version_info[0:2])]
+                lflags + ['-lpython%s.%s' % (sys.version_info[0:2])]
             kwds["force_shared"] = True    # requires jcc/patches/patch.43
         elif platform == 'win32':
-            jcclib = 'jcc%s.lib' %(debug and '_d' or '')
+            jcclib = 'jcc%s.lib' % (debug and '_d' or '')
             kwds["extra_link_args"] = \
-                lflags + ["/IMPLIB:%s" %(os.path.join('jcc', jcclib))]
+                lflags + ["/IMPLIB:%s" % (os.path.join('jcc', jcclib))]
             package_data.append(jcclib)
         else:
             kwds["extra_link_args"] = lflags
@@ -290,7 +325,7 @@
         try:
             process = Popen(args, stderr=PIPE)
         except Exception, e:
-            raise type(e), "%s: %s" %(e, args)
+            raise type(e), "%s: %s" % (e, args)
         process.wait()
         if process.returncode != 0:
             raise OSError, process.stderr.read()
@@ -302,7 +337,7 @@
                                 extra_link_args=lflags,
                                 include_dirs=includes,
                                 define_macros=[('_java_generics', None),
-                                               ('JCC_VER', '"%s"' %(jcc_ver))],
+                                               ('JCC_VER', '"%s"' % (jcc_ver))],
                                 sources=sources))
 
     args = {
@@ -325,11 +360,12 @@
         'packages': ['jcc'],
         'package_dir': {'jcc': 'jcc'},
         'package_data': {'jcc': package_data},
-        'ext_modules': extensions
+        'ext_modules': extensions,
+        "cmdclass": {"build_py": JCCBuildPy},
     }
     if with_setuptools:
         args['zip_safe'] = False
-        
+
     setup(**args)
 
 

Reply via email to