Commit 405adb9e authored by Martin v. Löwis's avatar Martin v. Löwis

Patch #488073: AtheOS port.

parent 56261979
...@@ -178,9 +178,9 @@ class build_ext (Command): ...@@ -178,9 +178,9 @@ class build_ext (Command):
if os.name == 'os2': if os.name == 'os2':
self.library_dirs.append(os.path.join(sys.exec_prefix, 'Config')) self.library_dirs.append(os.path.join(sys.exec_prefix, 'Config'))
# for extensions under Cygwin Python's library directory must be # for extensions under Cygwin and AtheOS Python's library directory must be
# appended to library_dirs # appended to library_dirs
if sys.platform[:6] == 'cygwin': if sys.platform[:6] == 'cygwin' or sys.platform[:6] == 'atheos':
if string.find(sys.executable, sys.exec_prefix) != -1: if string.find(sys.executable, sys.exec_prefix) != -1:
# building third party extensions # building third party extensions
self.library_dirs.append(os.path.join(sys.prefix, "lib", self.library_dirs.append(os.path.join(sys.prefix, "lib",
...@@ -656,6 +656,22 @@ class build_ext (Command): ...@@ -656,6 +656,22 @@ class build_ext (Command):
# don't extend ext.libraries, it may be shared with other # don't extend ext.libraries, it may be shared with other
# extensions, it is a reference to the original list # extensions, it is a reference to the original list
return ext.libraries + [pythonlib] return ext.libraries + [pythonlib]
elif sys.platform[:6] == "atheos":
from distutils import sysconfig
template = "python%d.%d"
pythonlib = (template %
(sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff))
# Get SHLIBS from Makefile
extra = []
for lib in sysconfig.get_config_var('SHLIBS').split():
if lib.startswith('-l'):
extra.append(lib[2:])
else:
extra.append(lib)
# don't extend ext.libraries, it may be shared with other
# extensions, it is a reference to the original list
return ext.libraries + [pythonlib, "m"] + extra
else: else:
return ext.libraries return ext.libraries
......
This diff is collapsed.
# Generated by h2py from /include/sys/types.h
_SYS_TYPES_H = 1
# Included from features.h
_FEATURES_H = 1
__USE_ANSI = 1
__FAVOR_BSD = 1
_ISOC9X_SOURCE = 1
_POSIX_SOURCE = 1
_POSIX_C_SOURCE = 199506L
_XOPEN_SOURCE = 500
_XOPEN_SOURCE_EXTENDED = 1
_LARGEFILE64_SOURCE = 1
_BSD_SOURCE = 1
_SVID_SOURCE = 1
_BSD_SOURCE = 1
_SVID_SOURCE = 1
__USE_ISOC9X = 1
_POSIX_SOURCE = 1
_POSIX_C_SOURCE = 2
_POSIX_C_SOURCE = 199506L
__USE_POSIX = 1
__USE_POSIX2 = 1
__USE_POSIX199309 = 1
__USE_POSIX199506 = 1
__USE_XOPEN = 1
__USE_XOPEN_EXTENDED = 1
__USE_UNIX98 = 1
_LARGEFILE_SOURCE = 1
__USE_XOPEN_EXTENDED = 1
__USE_LARGEFILE = 1
__USE_LARGEFILE64 = 1
__USE_FILE_OFFSET64 = 1
__USE_MISC = 1
__USE_BSD = 1
__USE_SVID = 1
__USE_GNU = 1
__USE_REENTRANT = 1
__STDC_IEC_559__ = 1
__STDC_IEC_559_COMPLEX__ = 1
__GNU_LIBRARY__ = 6
__GLIBC__ = 2
__GLIBC_MINOR__ = 1
# Included from sys/cdefs.h
_SYS_CDEFS_H = 1
def __PMT(args): return args
def __P(args): return args
def __PMT(args): return args
def __P(args): return ()
def __PMT(args): return ()
def __STRING(x): return #x
def __STRING(x): return "x"
def __ASMNAME(cname): return __ASMNAME2 (__USER_LABEL_PREFIX__, cname)
def __attribute__(xyz): return
__USE_EXTERN_INLINES = 1
# Included from gnu/stubs.h
# Included from bits/types.h
_BITS_TYPES_H = 1
__FD_SETSIZE = 1024
def __FDELT(d): return ((d) / __NFDBITS)
# Included from bits/pthreadtypes.h
# Included from time.h
_TIME_H = 1
# Included from bits/time.h
# Included from posix/time.h
# Included from posix/types.h
MAXHOSTNAMELEN = 64
FD_SETSIZE = 1024
CLOCKS_PER_SEC = 1000000
_BITS_TIME_H = 1
CLOCKS_PER_SEC = 1000000
CLK_TCK = 100
_STRUCT_TIMEVAL = 1
CLK_TCK = CLOCKS_PER_SEC
__clock_t_defined = 1
__time_t_defined = 1
__timespec_defined = 1
def __isleap(year): return \
__BIT_TYPES_DEFINED__ = 1
# Included from endian.h
_ENDIAN_H = 1
__LITTLE_ENDIAN = 1234
__BIG_ENDIAN = 4321
__PDP_ENDIAN = 3412
# Included from bits/endian.h
__BYTE_ORDER = __LITTLE_ENDIAN
__FLOAT_WORD_ORDER = __BYTE_ORDER
LITTLE_ENDIAN = __LITTLE_ENDIAN
BIG_ENDIAN = __BIG_ENDIAN
PDP_ENDIAN = __PDP_ENDIAN
BYTE_ORDER = __BYTE_ORDER
# Included from sys/select.h
_SYS_SELECT_H = 1
# Included from bits/select.h
def __FD_ZERO(fdsp): return \
def __FD_ZERO(set): return \
# Included from bits/sigset.h
_SIGSET_H_types = 1
_SIGSET_H_fns = 1
def __sigmask(sig): return \
def __sigemptyset(set): return \
def __sigfillset(set): return \
def __sigisemptyset(set): return \
FD_SETSIZE = __FD_SETSIZE
def FD_ZERO(fdsetp): return __FD_ZERO (fdsetp)
# Included from sys/sysmacros.h
_SYS_SYSMACROS_H = 1
def major(dev): return ( (( (dev) >> 8) & 0xff))
def minor(dev): return ( ((dev) & 0xff))
#! /bin/sh
set -v
python$EXE ../../Tools/scripts/h2py.py -i '\(u_long\)' -i '\(uint32_t\)' -i '\(int\)' -i '\(unsigned int\)' /include/netinet/in.h /include/sys/types.h
...@@ -721,6 +721,34 @@ _expectations = { ...@@ -721,6 +721,34 @@ _expectations = {
test_zipfile test_zipfile
test_zlib test_zlib
""", """,
'atheos':
"""
test_al
test_cd
test_cl
test_curses
test_dl
test_email_codecs
test_gdbm
test_gl
test_imgfile
test_largefile
test_linuxaudiodev
test_locale
test_mhlib
test_mmap
test_mpz
test_nis
test_poll
test_popen2
test_resource
test_socket_ssl
test_socketserver
test_sunaudiodev
test_unicode_file
test_winreg
test_winsound
""",
} }
class _ExpectedSkips: class _ExpectedSkips:
......
...@@ -17,6 +17,9 @@ except AttributeError: ...@@ -17,6 +17,9 @@ except AttributeError:
else: else:
start_len = "qq" start_len = "qq"
if sys.platform.startswith('atheos'):
start_len = "qq"
if sys.platform in ('netbsd1', 'Darwin1.2', 'darwin', if sys.platform in ('netbsd1', 'Darwin1.2', 'darwin',
'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5', 'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5',
'bsdos2', 'bsdos3', 'bsdos4', 'bsdos2', 'bsdos3', 'bsdos4',
......
import sys
import os import os
from array import array from array import array
...@@ -88,7 +89,11 @@ f.close() ...@@ -88,7 +89,11 @@ f.close()
if not f.closed: if not f.closed:
raise TestFailed, 'file.closed should be true' raise TestFailed, 'file.closed should be true'
for methodname in ['fileno', 'flush', 'isatty', 'read', 'readinto', 'readline', 'readlines', 'seek', 'tell', 'truncate', 'write', 'xreadlines' ]: methods = ['fileno', 'flush', 'isatty', 'read', 'readinto', 'readline', 'readlines', 'seek', 'tell', 'truncate', 'write', 'xreadlines' ]
if sys.platform.startswith('atheos'):
methods.remove('truncate')
for methodname in methods:
method = getattr(f, methodname) method = getattr(f, methodname)
try: try:
method() method()
......
...@@ -12,7 +12,7 @@ import os, StringIO ...@@ -12,7 +12,7 @@ import os, StringIO
import sys import sys
import mhlib import mhlib
if sys.platform.startswith("win") or sys.platform=="riscos": if sys.platform.startswith("win") or sys.platform=="riscos" or sys.platform.startswith("atheos"):
raise TestSkipped("test_mhlib skipped on %s -- "%sys.platform + raise TestSkipped("test_mhlib skipped on %s -- "%sys.platform +
"too many Unix assumptions") "too many Unix assumptions")
......
...@@ -139,7 +139,13 @@ class StatAttributeTests(unittest.TestCase): ...@@ -139,7 +139,13 @@ class StatAttributeTests(unittest.TestCase):
return return
import statvfs import statvfs
result = os.statvfs(self.fname) try:
result = os.statvfs(self.fname)
except OSError, e:
# On AtheOS, glibc always returns ENOSYS
import errno
if e.errno == errno.ENOSYS:
return
# Make sure direct access works # Make sure direct access works
self.assertEquals(result.f_bfree, result[statvfs.F_BFREE]) self.assertEquals(result.f_bfree, result[statvfs.F_BFREE])
......
...@@ -14,11 +14,12 @@ from test_support import TestSkipped ...@@ -14,11 +14,12 @@ from test_support import TestSkipped
def main(): def main():
print "Test popen2 module:" print "Test popen2 module:"
if sys.platform[:4] == 'beos' and __name__ != '__main__': if (sys.platform[:4] == 'beos' or sys.platform[:6] == 'atheos') \
and __name__ != '__main__':
# Locks get messed up or something. Generally we're supposed # Locks get messed up or something. Generally we're supposed
# to avoid mixing "posix" fork & exec with native threads, and # to avoid mixing "posix" fork & exec with native threads, and
# they may be right about that after all. # they may be right about that after all.
raise TestSkipped, "popen2() doesn't work during import on BeOS" raise TestSkipped, "popen2() doesn't work during import on " + sys.platform
try: try:
from os import popen from os import popen
except ImportError: except ImportError:
......
...@@ -146,6 +146,7 @@ LIBS= @LIBS@ ...@@ -146,6 +146,7 @@ LIBS= @LIBS@
LIBM= @LIBM@ LIBM= @LIBM@
LIBC= @LIBC@ LIBC= @LIBC@
SYSLIBS= $(LIBM) $(LIBC) SYSLIBS= $(LIBM) $(LIBC)
SHLIBS= @SHLIBS@
MAINOBJ= @MAINOBJ@ MAINOBJ= @MAINOBJ@
THREADOBJ= @THREADOBJ@ THREADOBJ= @THREADOBJ@
...@@ -341,7 +342,7 @@ $(LIBRARY): $(LIBRARY_OBJS) ...@@ -341,7 +342,7 @@ $(LIBRARY): $(LIBRARY_OBJS)
$(RANLIB) $@ $(RANLIB) $@
libpython$(VERSION).so: $(LIBRARY_OBJS) libpython$(VERSION).so: $(LIBRARY_OBJS)
$(LDSHARED) -o $@ $(LIBRARY_OBJS) $(LIBC) $(LIBM) $(LDSHARED) -o $@ $(LIBRARY_OBJS) $(SHLIBS) $(LIBC) $(LIBM)
libpython$(VERSION).sl: $(LIBRARY_OBJS) libpython$(VERSION).sl: $(LIBRARY_OBJS)
$(LDSHARED) -o $@ $(LIBRARY_OBJS) $(LIBC) $(LIBM) $(LDSHARED) -o $@ $(LIBRARY_OBJS) $(LIBC) $(LIBM)
......
...@@ -78,6 +78,7 @@ Mike Carlton ...@@ -78,6 +78,7 @@ Mike Carlton
Luke Kenneth Casson Leighton Luke Kenneth Casson Leighton
Donn Cave Donn Cave
Per Cederqvist Per Cederqvist
Octavian Cerna
Jeffrey Chang Jeffrey Chang
Brad Chapman Brad Chapman
Greg Chapman Greg Chapman
......
Python for AtheOS
Before building:
Make sure you have shared versions of the libraries you want to use
with Python. You will have to compile them yourself, or download
precompiled packages.
Recommended libraries:
ncurses-4.2
readline-4.2a
zlib-1.1.4
Build:
$ ./configure --prefix=/usr/python
$ make
Python is always built as a shared library, otherwise dynamic loading
would not work.
Testing:
$ make test
Install:
# make install
# pkgmanager -a /usr/python
AtheOS issues:
- large file support: due to a stdio bug in glibc/libio, access to
large files may not work correctly.
fseeko() tries to seek to a negative offset.
ftello() returns a negative offset, it looks like a 32->64bit
sign-extension issue.
The lowlevel functions (open, lseek, etc) are OK.
- sockets: AF_UNIX is defined in the C library and in Python, but
not implemented in the system.
- select: poll is available in the C library, but does not work
(It does not return POLLNVAL for bad fds and hangs).
- posix: statvfs and fstatvfs always return ENOSYS.
-
- disabled modules:
- mmap: not yet implemented in AtheOS
- nis: broken (on an unconfigured system yp_get_default_domain()
returns junk instead of error)
- dl: dynamic loading doesn't work via dlopen()
- resource: getrimit and setrlimit are not yet implemented
- if you are getting segmentation faults, you probably are low on memory.
AtheOS doesn't handle very well an out-of-memory condition and
simply SEGVs the process.
Tested on:
AtheOS-0.3.7
gcc-2.95
binutils-2.10
make-3.78
--
Octavian Cerna <tavy@ylabs.com>
...@@ -311,6 +311,8 @@ C API ...@@ -311,6 +311,8 @@ C API
New platforms New platforms
- AtheOS is now supported.
- GNU/Hurd is now supported. - GNU/Hurd is now supported.
Tests Tests
......
...@@ -17,7 +17,9 @@ static PyObject *crypt_crypt(PyObject *self, PyObject *args) ...@@ -17,7 +17,9 @@ static PyObject *crypt_crypt(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "ss:crypt", &word, &salt)) { if (!PyArg_ParseTuple(args, "ss:crypt", &word, &salt)) {
return NULL; return NULL;
} }
return PyString_FromString( crypt( word, salt ) ); /* On some platforms (AtheOS) crypt returns NULL for an invalid
salt. Return None in that case. XXX Maybe raise an exception? */
return Py_BuildValue("s", crypt(word, salt));
} }
......
/* Support for dynamic loading of extension modules */
#include <atheos/image.h>
#include <errno.h>
#include "Python.h"
#include "importdl.h"
const struct filedescr _PyImport_DynLoadFiletab[] = {
{".so", "rb", C_EXTENSION},
{"module.so", "rb", C_EXTENSION},
{0, 0}
};
dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
const char *pathname, FILE *fp)
{
void *p;
int lib;
char funcname[258];
if (Py_VerboseFlag)
printf("load_library %s\n", pathname);
lib = load_library(pathname, 0);
if (lib < 0) {
char buf[512];
if (Py_VerboseFlag)
perror(pathname);
PyOS_snprintf(buf, sizeof(buf), "Failed to load %.200s: %.200s",
pathname, strerror(errno));
PyErr_SetString(PyExc_ImportError, buf);
return NULL;
}
PyOS_snprintf(funcname, sizeof(funcname), "init%.200s", shortname);
if (Py_VerboseFlag)
printf("get_symbol_address %s\n", funcname);
if (get_symbol_address(lib, funcname, -1, &p) < 0) {
p = NULL;
if (Py_VerboseFlag)
perror(funcname);
}
return (dl_funcptr) p;
}
...@@ -133,6 +133,10 @@ void PyThread_init_thread(void) ...@@ -133,6 +133,10 @@ void PyThread_init_thread(void)
#include "thread_plan9.h" #include "thread_plan9.h"
#endif #endif
#ifdef ATHEOS_THREADS
#include "thread_atheos.h"
#endif
/* /*
#ifdef FOOBAR_THREADS #ifdef FOOBAR_THREADS
#include "thread_foobar.h" #include "thread_foobar.h"
......
/* Threading for AtheOS.
Based on thread_beos.h. */
#include <atheos/threads.h>
#include <atheos/semaphore.h>
#include <atheos/atomic.h>
#include <errno.h>
#include <string.h>
/* Missing decl from threads.h */
extern int exit_thread(int);
/* Undefine FASTLOCK to play with simple semaphores. */
#define FASTLOCK
#ifdef FASTLOCK
/* Use an atomic counter and a semaphore for maximum speed. */
typedef struct fastmutex {
sem_id sem;
atomic_t count;
} fastmutex_t;
static int fastmutex_create(const char *name, fastmutex_t * mutex);
static int fastmutex_destroy(fastmutex_t * mutex);
static int fastmutex_lock(fastmutex_t * mutex);
static int fastmutex_timedlock(fastmutex_t * mutex, bigtime_t timeout);
static int fastmutex_unlock(fastmutex_t * mutex);
static int fastmutex_create(const char *name, fastmutex_t * mutex)
{
mutex->count = 0;
mutex->sem = create_semaphore(name, 0, 0);
return (mutex->sem < 0) ? -1 : 0;
}
static int fastmutex_destroy(fastmutex_t * mutex)
{
if (fastmutex_timedlock(mutex, 0) == 0 || errno == EWOULDBLOCK) {
return delete_semaphore(mutex->sem);
}
return 0;
}
static int fastmutex_lock(fastmutex_t * mutex)
{
atomic_t prev = atomic_add(&mutex->count, 1);
if (prev > 0)
return lock_semaphore(mutex->sem);
return 0;
}
static int fastmutex_timedlock(fastmutex_t * mutex, bigtime_t timeout)
{
atomic_t prev = atomic_add(&mutex->count, 1);
if (prev > 0)
return lock_semaphore_x(mutex->sem, 1, 0, timeout);
return 0;
}
static int fastmutex_unlock(fastmutex_t * mutex)
{
atomic_t prev = atomic_add(&mutex->count, -1);
if (prev > 1)
return unlock_semaphore(mutex->sem);
return 0;
}
#endif /* FASTLOCK */
/*
* Initialization.
*
*/
static void PyThread__init_thread(void)
{
/* Do nothing. */
return;
}
/*
* Thread support.
*
*/
static atomic_t thread_count = 0;
long PyThread_start_new_thread(void (*func) (void *), void *arg)
{
status_t success = -1;
thread_id tid;
char name[OS_NAME_LENGTH];
atomic_t this_thread;
dprintf(("PyThread_start_new_thread called\n"));
this_thread = atomic_add(&thread_count, 1);
PyOS_snprintf(name, sizeof(name), "python thread (%d)", this_thread);
tid = spawn_thread(name, func, NORMAL_PRIORITY, 0, arg);
if (tid < 0) {
dprintf(("PyThread_start_new_thread spawn_thread failed: %s\n", strerror(errno)));
} else {
success = resume_thread(tid);
if (success < 0) {
dprintf(("PyThread_start_new_thread resume_thread failed: %s\n", strerror(errno)));
}
}
return (success < 0 ? -1 : tid);
}
long PyThread_get_thread_ident(void)
{
return get_thread_id(NULL);
}
static void do_PyThread_exit_thread(int no_cleanup)
{
dprintf(("PyThread_exit_thread called\n"));
/* Thread-safe way to read a variable without a mutex: */
if (atomic_add(&thread_count, 0) == 0) {
/* No threads around, so exit main(). */
if (no_cleanup)
_exit(0);
else
exit(0);
} else {
/* We're a thread */
exit_thread(0);
}
}
void PyThread_exit_thread(void)
{
do_PyThread_exit_thread(0);
}
void PyThread__exit_thread(void)
{
do_PyThread_exit_thread(1);
}
#ifndef NO_EXIT_PROG
static void do_PyThread_exit_prog(int status, int no_cleanup)
{
dprintf(("PyThread_exit_prog(%d) called\n", status));
/* No need to do anything, the threads get torn down if main()exits. */
if (no_cleanup)
_exit(status);
else
exit(status);
}
void PyThread_exit_prog(int status)
{
do_PyThread_exit_prog(status, 0);
}
void PyThread__exit_prog(int status)
{
do_PyThread_exit_prog(status, 1);
}
#endif /* NO_EXIT_PROG */
/*
* Lock support.
*
*/
static atomic_t lock_count = 0;
PyThread_type_lock PyThread_allocate_lock(void)
{
#ifdef FASTLOCK
fastmutex_t *lock;
#else
sem_id sema;
#endif
char name[OS_NAME_LENGTH];
atomic_t this_lock;
dprintf(("PyThread_allocate_lock called\n"));
#ifdef FASTLOCK
lock = (fastmutex_t *) malloc(sizeof(fastmutex_t));
if (lock == NULL) {
dprintf(("PyThread_allocate_lock failed: out of memory\n"));
return (PyThread_type_lock) NULL;
}
#endif
this_lock = atomic_add(&lock_count, 1);
PyOS_snprintf(name, sizeof(name), "python lock (%d)", this_lock);
#ifdef FASTLOCK
if (fastmutex_create(name, lock) < 0) {
dprintf(("PyThread_allocate_lock failed: %s\n",
strerror(errno)));
free(lock);
lock = NULL;
}
dprintf(("PyThread_allocate_lock()-> %p\n", lock));
return (PyThread_type_lock) lock;
#else
sema = create_semaphore(name, 1, 0);
if (sema < 0) {
dprintf(("PyThread_allocate_lock failed: %s\n",
strerror(errno)));
sema = 0;
}
dprintf(("PyThread_allocate_lock()-> %p\n", sema));
return (PyThread_type_lock) sema;
#endif
}
void PyThread_free_lock(PyThread_type_lock lock)
{
dprintf(("PyThread_free_lock(%p) called\n", lock));
#ifdef FASTLOCK
if (fastmutex_destroy((fastmutex_t *) lock) < 0) {
dprintf(("PyThread_free_lock(%p) failed: %s\n", lock,
strerror(errno)));
}
free(lock);
#else
if (delete_semaphore((sem_id) lock) < 0) {
dprintf(("PyThread_free_lock(%p) failed: %s\n", lock,
strerror(errno)));
}
#endif
}
int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
{
int retval;
dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock,
waitflag));
#ifdef FASTLOCK
if (waitflag)
retval = fastmutex_lock((fastmutex_t *) lock);
else
retval = fastmutex_timedlock((fastmutex_t *) lock, 0);
#else
if (waitflag)
retval = lock_semaphore((sem_id) lock);
else
retval = lock_semaphore_x((sem_id) lock, 1, 0, 0);
#endif
if (retval < 0) {
dprintf(("PyThread_acquire_lock(%p, %d) failed: %s\n",
lock, waitflag, strerror(errno)));
}
dprintf(("PyThread_acquire_lock(%p, %d)-> %d\n", lock, waitflag,
retval));
return retval < 0 ? 0 : 1;
}
void PyThread_release_lock(PyThread_type_lock lock)
{
dprintf(("PyThread_release_lock(%p) called\n", lock));
#ifdef FASTLOCK
if (fastmutex_unlock((fastmutex_t *) lock) < 0) {
dprintf(("PyThread_release_lock(%p) failed: %s\n", lock,
strerror(errno)));
}
#else
if (unlock_semaphore((sem_id) lock) < 0) {
dprintf(("PyThread_release_lock(%p) failed: %s\n", lock,
strerror(errno)));
}
#endif
}
...@@ -50,6 +50,8 @@ except KeyError: ...@@ -50,6 +50,8 @@ except KeyError:
try: try:
if sys.platform.find("beos") == 0: if sys.platform.find("beos") == 0:
searchdirs=os.environ['BEINCLUDES'].split(';') searchdirs=os.environ['BEINCLUDES'].split(';')
elif sys.platform.startswith("atheos"):
searchdirs=os.environ['C_INCLUDE_PATH'].split(':')
else: else:
raise KeyError raise KeyError
except KeyError: except KeyError:
......
#! /bin/sh #! /bin/sh
# From configure.in Revision: 1.321 . # From configure.in Revision: 1.322 .
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.53. # Generated by GNU Autoconf 2.53.
# #
...@@ -1293,6 +1293,7 @@ then ...@@ -1293,6 +1293,7 @@ then
case $MACHDEP in case $MACHDEP in
cygwin*) MACHDEP="cygwin";; cygwin*) MACHDEP="cygwin";;
darwin*) MACHDEP="darwin";; darwin*) MACHDEP="darwin";;
atheos*) MACHDEP="atheos";;
'') MACHDEP="unknown";; '') MACHDEP="unknown";;
esac esac
fi fi
...@@ -3072,7 +3073,7 @@ fi; ...@@ -3072,7 +3073,7 @@ fi;
if test -z "$enable_shared" if test -z "$enable_shared"
then then
case $ac_sys_system in case $ac_sys_system in
CYGWIN*) CYGWIN* | atheos*)
enable_shared="yes";; enable_shared="yes";;
*) *)
enable_shared="no";; enable_shared="no";;
...@@ -3131,6 +3132,11 @@ if test $enable_shared = "yes"; then ...@@ -3131,6 +3132,11 @@ if test $enable_shared = "yes"; then
BLDLIBRARY='-rpath $(LIBDIR) -L. -lpython$(VERSION)' BLDLIBRARY='-rpath $(LIBDIR) -L. -lpython$(VERSION)'
RUNSHARED=LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH RUNSHARED=LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
;; ;;
atheos*)
LDLIBRARY='libpython$(VERSION).so'
BLDLIBRARY='-L. -lpython$(VERSION)'
RUNSHARED=DLL_PATH=`pwd`:${DLL_PATH:-/atheos/sys/libs:/atheos/autolnk/lib}
;;
esac esac
# DG/UX requires some fancy ld contortions to produce a .so from an .a # DG/UX requires some fancy ld contortions to produce a .so from an .a
case $MACHDEP in case $MACHDEP in
...@@ -3384,6 +3390,7 @@ if test -z "$LN" ; then ...@@ -3384,6 +3390,7 @@ if test -z "$LN" ; then
case $ac_sys_system in case $ac_sys_system in
BeOS*) LN="ln -s";; BeOS*) LN="ln -s";;
CYGWIN*) LN="ln -s";; CYGWIN*) LN="ln -s";;
atheos*) LN="ln -s";;
*) LN=ln;; *) LN=ln;;
esac esac
fi fi
...@@ -8779,6 +8786,7 @@ then ...@@ -8779,6 +8786,7 @@ then
SCO_SV*) LDSHARED="cc -G -KPIC -Ki486 -belf -Wl,-Bexport";; SCO_SV*) LDSHARED="cc -G -KPIC -Ki486 -belf -Wl,-Bexport";;
Monterey*) LDSHARED="cc -G -dy -Bdynamic -Bexport -L/usr/lib/ia64l64";; Monterey*) LDSHARED="cc -G -dy -Bdynamic -Bexport -L/usr/lib/ia64l64";;
CYGWIN*) LDSHARED="gcc -shared -Wl,--enable-auto-image-base";; CYGWIN*) LDSHARED="gcc -shared -Wl,--enable-auto-image-base";;
atheos*) LDSHARED="gcc -shared";;
*) LDSHARED="ld";; *) LDSHARED="ld";;
esac esac
fi fi
...@@ -8814,6 +8822,7 @@ then ...@@ -8814,6 +8822,7 @@ then
*) CCSHARED="";; *) CCSHARED="";;
esac;; esac;;
CYGWIN*) CCSHARED="-DUSE_DL_IMPORT";; CYGWIN*) CCSHARED="-DUSE_DL_IMPORT";;
atheos*) CCSHARED="-fPIC";;
esac esac
fi fi
echo "$as_me:$LINENO: result: $CCSHARED" >&5 echo "$as_me:$LINENO: result: $CCSHARED" >&5
...@@ -8883,6 +8892,23 @@ fi ...@@ -8883,6 +8892,23 @@ fi
echo "$as_me:$LINENO: result: $CFLAGSFORSHARED" >&5 echo "$as_me:$LINENO: result: $CFLAGSFORSHARED" >&5
echo "${ECHO_T}$CFLAGSFORSHARED" >&6 echo "${ECHO_T}$CFLAGSFORSHARED" >&6
# SHLIBS are libraries (except -lc and -lm) to link to the python shared
# library (with --enable-shared).
# For platforms on which shared libraries are not allowed to have unresolved
# symbols, this must be set to $(LIBS) (expanded by make).
echo "$as_me:$LINENO: checking SHLIBS" >&5
echo $ECHO_N "checking SHLIBS... $ECHO_C" >&6
case "$ac_sys_system" in
atheos*)
SHLIBS='$(LIBS)';;
*)
SHLIBS='';;
esac
echo "$as_me:$LINENO: result: $SHLIBS" >&5
echo "${ECHO_T}$SHLIBS" >&6
# checks for libraries # checks for libraries
echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
...@@ -9870,6 +9896,120 @@ _ACEOF ...@@ -9870,6 +9896,120 @@ _ACEOF
THREADOBJ="Python/thread.o" THREADOBJ="Python/thread.o"
else else
if test "${ac_cv_header_atheos_threads_h+set}" = set; then
echo "$as_me:$LINENO: checking for atheos/threads.h" >&5
echo $ECHO_N "checking for atheos/threads.h... $ECHO_C" >&6
if test "${ac_cv_header_atheos_threads_h+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
fi
echo "$as_me:$LINENO: result: $ac_cv_header_atheos_threads_h" >&5
echo "${ECHO_T}$ac_cv_header_atheos_threads_h" >&6
else
# Is the header compilable?
echo "$as_me:$LINENO: checking atheos/threads.h usability" >&5
echo $ECHO_N "checking atheos/threads.h usability... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
#include "confdefs.h"
$ac_includes_default
#include <atheos/threads.h>
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_header_compiler=yes
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
ac_header_compiler=no
fi
rm -f conftest.$ac_objext conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
echo "${ECHO_T}$ac_header_compiler" >&6
# Is the header present?
echo "$as_me:$LINENO: checking atheos/threads.h presence" >&5
echo $ECHO_N "checking atheos/threads.h presence... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
#include "confdefs.h"
#include <atheos/threads.h>
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
ac_header_preproc=yes
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
ac_header_preproc=no
fi
rm -f conftest.err conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
echo "${ECHO_T}$ac_header_preproc" >&6
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc in
yes:no )
{ echo "$as_me:$LINENO: WARNING: atheos/threads.h: accepted by the compiler, rejected by the preprocessor!" >&5
echo "$as_me: WARNING: atheos/threads.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ echo "$as_me:$LINENO: WARNING: atheos/threads.h: proceeding with the preprocessor's result" >&5
echo "$as_me: WARNING: atheos/threads.h: proceeding with the preprocessor's result" >&2;};;
no:yes )
{ echo "$as_me:$LINENO: WARNING: atheos/threads.h: present but cannot be compiled" >&5
echo "$as_me: WARNING: atheos/threads.h: present but cannot be compiled" >&2;}
{ echo "$as_me:$LINENO: WARNING: atheos/threads.h: check for missing prerequisite headers?" >&5
echo "$as_me: WARNING: atheos/threads.h: check for missing prerequisite headers?" >&2;}
{ echo "$as_me:$LINENO: WARNING: atheos/threads.h: proceeding with the preprocessor's result" >&5
echo "$as_me: WARNING: atheos/threads.h: proceeding with the preprocessor's result" >&2;};;
esac
echo "$as_me:$LINENO: checking for atheos/threads.h" >&5
echo $ECHO_N "checking for atheos/threads.h... $ECHO_C" >&6
if test "${ac_cv_header_atheos_threads_h+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
ac_cv_header_atheos_threads_h=$ac_header_preproc
fi
echo "$as_me:$LINENO: result: $ac_cv_header_atheos_threads_h" >&5
echo "${ECHO_T}$ac_cv_header_atheos_threads_h" >&6
fi
if test $ac_cv_header_atheos_threads_h = yes; then
cat >>confdefs.h <<\_ACEOF
#define WITH_THREAD 1
_ACEOF
cat >>confdefs.h <<\_ACEOF
#define ATHEOS_THREADS 1
_ACEOF
THREADOBJ="Python/thread.o"
else
if test "${ac_cv_header_kernel_OS_h+set}" = set; then if test "${ac_cv_header_kernel_OS_h+set}" = set; then
echo "$as_me:$LINENO: checking for kernel/OS.h" >&5 echo "$as_me:$LINENO: checking for kernel/OS.h" >&5
echo $ECHO_N "checking for kernel/OS.h... $ECHO_C" >&6 echo $ECHO_N "checking for kernel/OS.h... $ECHO_C" >&6
...@@ -10324,6 +10464,9 @@ fi ...@@ -10324,6 +10464,9 @@ fi
fi fi
fi
fi fi
fi fi
...@@ -11192,6 +11335,7 @@ then ...@@ -11192,6 +11335,7 @@ then
BeOS*) DYNLOADFILE="dynload_beos.o";; BeOS*) DYNLOADFILE="dynload_beos.o";;
hp*|HP*) DYNLOADFILE="dynload_hpux.o";; hp*|HP*) DYNLOADFILE="dynload_hpux.o";;
Darwin/*) DYNLOADFILE="dynload_next.o";; Darwin/*) DYNLOADFILE="dynload_next.o";;
atheos*) DYNLOADFILE="dynload_atheos.o";;
*) *)
# use dynload_shlib.c and dlopen() if we have it; otherwise stub # use dynload_shlib.c and dlopen() if we have it; otherwise stub
# out any dynamic loading # out any dynamic loading
...@@ -16394,6 +16538,7 @@ s,@BLDSHARED@,$BLDSHARED,;t t ...@@ -16394,6 +16538,7 @@ s,@BLDSHARED@,$BLDSHARED,;t t
s,@CCSHARED@,$CCSHARED,;t t s,@CCSHARED@,$CCSHARED,;t t
s,@LINKFORSHARED@,$LINKFORSHARED,;t t s,@LINKFORSHARED@,$LINKFORSHARED,;t t
s,@CFLAGSFORSHARED@,$CFLAGSFORSHARED,;t t s,@CFLAGSFORSHARED@,$CFLAGSFORSHARED,;t t
s,@SHLIBS@,$SHLIBS,;t t
s,@USE_SIGNAL_MODULE@,$USE_SIGNAL_MODULE,;t t s,@USE_SIGNAL_MODULE@,$USE_SIGNAL_MODULE,;t t
s,@SIGNAL_OBJS@,$SIGNAL_OBJS,;t t s,@SIGNAL_OBJS@,$SIGNAL_OBJS,;t t
s,@USE_THREAD_MODULE@,$USE_THREAD_MODULE,;t t s,@USE_THREAD_MODULE@,$USE_THREAD_MODULE,;t t
......
...@@ -81,6 +81,7 @@ then ...@@ -81,6 +81,7 @@ then
case $MACHDEP in case $MACHDEP in
cygwin*) MACHDEP="cygwin";; cygwin*) MACHDEP="cygwin";;
darwin*) MACHDEP="darwin";; darwin*) MACHDEP="darwin";;
atheos*) MACHDEP="atheos";;
'') MACHDEP="unknown";; '') MACHDEP="unknown";;
esac esac
fi fi
...@@ -328,7 +329,7 @@ AC_ARG_ENABLE(shared, ...@@ -328,7 +329,7 @@ AC_ARG_ENABLE(shared,
if test -z "$enable_shared" if test -z "$enable_shared"
then then
case $ac_sys_system in case $ac_sys_system in
CYGWIN*) CYGWIN* | atheos*)
enable_shared="yes";; enable_shared="yes";;
*) *)
enable_shared="no";; enable_shared="no";;
...@@ -385,6 +386,11 @@ if test $enable_shared = "yes"; then ...@@ -385,6 +386,11 @@ if test $enable_shared = "yes"; then
BLDLIBRARY='-rpath $(LIBDIR) -L. -lpython$(VERSION)' BLDLIBRARY='-rpath $(LIBDIR) -L. -lpython$(VERSION)'
RUNSHARED=LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH RUNSHARED=LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
;; ;;
atheos*)
LDLIBRARY='libpython$(VERSION).so'
BLDLIBRARY='-L. -lpython$(VERSION)'
RUNSHARED=DLL_PATH=`pwd`:${DLL_PATH:-/atheos/sys/libs:/atheos/autolnk/lib}
;;
esac esac
# DG/UX requires some fancy ld contortions to produce a .so from an .a # DG/UX requires some fancy ld contortions to produce a .so from an .a
case $MACHDEP in case $MACHDEP in
...@@ -417,6 +423,7 @@ if test -z "$LN" ; then ...@@ -417,6 +423,7 @@ if test -z "$LN" ; then
case $ac_sys_system in case $ac_sys_system in
BeOS*) LN="ln -s";; BeOS*) LN="ln -s";;
CYGWIN*) LN="ln -s";; CYGWIN*) LN="ln -s";;
atheos*) LN="ln -s";;
*) LN=ln;; *) LN=ln;;
esac esac
fi fi
...@@ -906,6 +913,7 @@ then ...@@ -906,6 +913,7 @@ then
SCO_SV*) LDSHARED="cc -G -KPIC -Ki486 -belf -Wl,-Bexport";; SCO_SV*) LDSHARED="cc -G -KPIC -Ki486 -belf -Wl,-Bexport";;
Monterey*) LDSHARED="cc -G -dy -Bdynamic -Bexport -L/usr/lib/ia64l64";; Monterey*) LDSHARED="cc -G -dy -Bdynamic -Bexport -L/usr/lib/ia64l64";;
CYGWIN*) LDSHARED="gcc -shared -Wl,--enable-auto-image-base";; CYGWIN*) LDSHARED="gcc -shared -Wl,--enable-auto-image-base";;
atheos*) LDSHARED="gcc -shared";;
*) LDSHARED="ld";; *) LDSHARED="ld";;
esac esac
fi fi
...@@ -939,6 +947,7 @@ then ...@@ -939,6 +947,7 @@ then
*) CCSHARED="";; *) CCSHARED="";;
esac;; esac;;
CYGWIN*) CCSHARED="-DUSE_DL_IMPORT";; CYGWIN*) CCSHARED="-DUSE_DL_IMPORT";;
atheos*) CCSHARED="-fPIC";;
esac esac
fi fi
AC_MSG_RESULT($CCSHARED) AC_MSG_RESULT($CCSHARED)
...@@ -1003,6 +1012,21 @@ then ...@@ -1003,6 +1012,21 @@ then
fi fi
AC_MSG_RESULT($CFLAGSFORSHARED) AC_MSG_RESULT($CFLAGSFORSHARED)
# SHLIBS are libraries (except -lc and -lm) to link to the python shared
# library (with --enable-shared).
# For platforms on which shared libraries are not allowed to have unresolved
# symbols, this must be set to $(LIBS) (expanded by make).
AC_SUBST(SHLIBS)
AC_MSG_CHECKING(SHLIBS)
case "$ac_sys_system" in
atheos*)
SHLIBS='$(LIBS)';;
*)
SHLIBS='';;
esac
AC_MSG_RESULT($SHLIBS)
# checks for libraries # checks for libraries
AC_CHECK_LIB(dl, dlopen) # Dynamic linking for SunOS/Solaris and SYSV AC_CHECK_LIB(dl, dlopen) # Dynamic linking for SunOS/Solaris and SYSV
AC_CHECK_LIB(dld, shl_load) # Dynamic linking for HP-UX AC_CHECK_LIB(dld, shl_load) # Dynamic linking for HP-UX
...@@ -1177,6 +1201,10 @@ pthread_create (NULL, NULL, start_routine, NULL)], [ ...@@ -1177,6 +1201,10 @@ pthread_create (NULL, NULL, start_routine, NULL)], [
AC_CHECK_FUNC(pthread_detach, [AC_DEFINE(WITH_THREAD) AC_CHECK_FUNC(pthread_detach, [AC_DEFINE(WITH_THREAD)
posix_threads=yes posix_threads=yes
THREADOBJ="Python/thread.o"],[ THREADOBJ="Python/thread.o"],[
AC_CHECK_HEADER(atheos/threads.h, [AC_DEFINE(WITH_THREAD)
AC_DEFINE(ATHEOS_THREADS, 1,
[Define this if you have AtheOS threads.])
THREADOBJ="Python/thread.o"],[
AC_CHECK_HEADER(kernel/OS.h, [AC_DEFINE(WITH_THREAD) AC_CHECK_HEADER(kernel/OS.h, [AC_DEFINE(WITH_THREAD)
AC_DEFINE(BEOS_THREADS, 1, AC_DEFINE(BEOS_THREADS, 1,
[Define this if you have BeOS threads.]) [Define this if you have BeOS threads.])
...@@ -1202,7 +1230,7 @@ pthread_create (NULL, NULL, start_routine, NULL)], [ ...@@ -1202,7 +1230,7 @@ pthread_create (NULL, NULL, start_routine, NULL)], [
LIBS="$LIBS -lcma" LIBS="$LIBS -lcma"
THREADOBJ="Python/thread.o"],[ THREADOBJ="Python/thread.o"],[
USE_THREAD_MODULE="#"]) USE_THREAD_MODULE="#"])
])])])])])])])])])]) ])])])])])])])])])])])
if test "$posix_threads" = "yes"; then if test "$posix_threads" = "yes"; then
if test "$unistd_defines_pthreads" = "no"; then if test "$unistd_defines_pthreads" = "no"; then
...@@ -1560,6 +1588,7 @@ then ...@@ -1560,6 +1588,7 @@ then
BeOS*) DYNLOADFILE="dynload_beos.o";; BeOS*) DYNLOADFILE="dynload_beos.o";;
hp*|HP*) DYNLOADFILE="dynload_hpux.o";; hp*|HP*) DYNLOADFILE="dynload_hpux.o";;
Darwin/*) DYNLOADFILE="dynload_next.o";; Darwin/*) DYNLOADFILE="dynload_next.o";;
atheos*) DYNLOADFILE="dynload_atheos.o";;
*) *)
# use dynload_shlib.c and dlopen() if we have it; otherwise stub # use dynload_shlib.c and dlopen() if we have it; otherwise stub
# out any dynamic loading # out any dynamic loading
......
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
support for AIX C++ shared extension modules. */ support for AIX C++ shared extension modules. */
#undef AIX_GENUINE_CPLUSPLUS #undef AIX_GENUINE_CPLUSPLUS
/* Define this if you have AtheOS threads. */
#undef ATHEOS_THREADS
/* Define if your <unistd.h> contains bad prototypes for exec*() (as it does /* Define if your <unistd.h> contains bad prototypes for exec*() (as it does
on SGI IRIX 4.x) */ on SGI IRIX 4.x) */
#undef BAD_EXEC_PROTOTYPES #undef BAD_EXEC_PROTOTYPES
......
...@@ -214,6 +214,8 @@ class PyBuildExt(build_ext): ...@@ -214,6 +214,8 @@ class PyBuildExt(build_ext):
platform = 'beos' platform = 'beos'
elif platform[:6] == 'darwin': elif platform[:6] == 'darwin':
platform = 'darwin' platform = 'darwin'
elif platform[:6] == 'atheos':
platform = 'atheos'
return platform return platform
...@@ -242,6 +244,13 @@ class PyBuildExt(build_ext): ...@@ -242,6 +244,13 @@ class PyBuildExt(build_ext):
platform = self.get_platform() platform = self.get_platform()
(srcdir,) = sysconfig.get_config_vars('srcdir') (srcdir,) = sysconfig.get_config_vars('srcdir')
# Check for AtheOS which has libraries in non-standard locations
if platform == 'atheos':
lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
inc_dirs += ['/system/include', '/atheos/autolnk/include']
inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
# Check for MacOS X, which doesn't need libm.a at all # Check for MacOS X, which doesn't need libm.a at all
math_libs = ['m'] math_libs = ['m']
if platform in ['darwin', 'beos']: if platform in ['darwin', 'beos']:
...@@ -323,7 +332,8 @@ class PyBuildExt(build_ext): ...@@ -323,7 +332,8 @@ class PyBuildExt(build_ext):
exts.append( Extension('cPickle', ['cPickle.c']) ) exts.append( Extension('cPickle', ['cPickle.c']) )
# Memory-mapped files (also works on Win32). # Memory-mapped files (also works on Win32).
exts.append( Extension('mmap', ['mmapmodule.c']) ) if platform not in ['atheos']:
exts.append( Extension('mmap', ['mmapmodule.c']) )
# Lance Ellinghaus's modules: # Lance Ellinghaus's modules:
# enigma-inspired encryption # enigma-inspired encryption
...@@ -479,10 +489,11 @@ class PyBuildExt(build_ext): ...@@ -479,10 +489,11 @@ class PyBuildExt(build_ext):
# Steen Lumholt's termios module # Steen Lumholt's termios module
exts.append( Extension('termios', ['termios.c']) ) exts.append( Extension('termios', ['termios.c']) )
# Jeremy Hylton's rlimit interface # Jeremy Hylton's rlimit interface
exts.append( Extension('resource', ['resource.c']) ) if platform not in ['atheos']:
exts.append( Extension('resource', ['resource.c']) )
# Sun yellow pages. Some systems have the functions in libc. # Sun yellow pages. Some systems have the functions in libc.
if platform not in ['cygwin']: if platform not in ['cygwin', 'atheos']:
if (self.compiler.find_library_file(lib_dirs, 'nsl')): if (self.compiler.find_library_file(lib_dirs, 'nsl')):
libs = ['nsl'] libs = ['nsl']
else: else:
...@@ -593,7 +604,7 @@ class PyBuildExt(build_ext): ...@@ -593,7 +604,7 @@ class PyBuildExt(build_ext):
# Dynamic loading module # Dynamic loading module
dl_inc = find_file('dlfcn.h', [], inc_dirs) dl_inc = find_file('dlfcn.h', [], inc_dirs)
if dl_inc is not None: if (dl_inc is not None) and (platform not in ['atheos']):
exts.append( Extension('dl', ['dlmodule.c']) ) exts.append( Extension('dl', ['dlmodule.c']) )
# Platform-specific libraries # Platform-specific libraries
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment