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)