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)