Patch #488073: AtheOS port.
diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py
index 89ca1dc..d8f3dc8 100644
--- a/Lib/distutils/command/build_ext.py
+++ b/Lib/distutils/command/build_ext.py
@@ -178,9 +178,9 @@
if os.name == 'os2':
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
- if sys.platform[:6] == 'cygwin':
+ if sys.platform[:6] == 'cygwin' or sys.platform[:6] == 'atheos':
if string.find(sys.executable, sys.exec_prefix) != -1:
# building third party extensions
self.library_dirs.append(os.path.join(sys.prefix, "lib",
@@ -656,6 +656,22 @@
# don't extend ext.libraries, it may be shared with other
# extensions, it is a reference to the original list
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:
return ext.libraries
diff --git a/Lib/plat-atheos/IN.py b/Lib/plat-atheos/IN.py
new file mode 100644
index 0000000..a386a21
--- /dev/null
+++ b/Lib/plat-atheos/IN.py
@@ -0,0 +1,945 @@
+# Generated by h2py from /include/netinet/in.h
+_NETINET_IN_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 limits.h
+_LIBC_LIMITS_H_ = 1
+
+# Included from bits/posix1_lim.h
+_BITS_POSIX1_LIM_H = 1
+_POSIX_AIO_LISTIO_MAX = 2
+_POSIX_AIO_MAX = 1
+_POSIX_ARG_MAX = 4096
+_POSIX_CHILD_MAX = 6
+_POSIX_DELAYTIMER_MAX = 32
+_POSIX_LINK_MAX = 8
+_POSIX_MAX_CANON = 255
+_POSIX_MAX_INPUT = 255
+_POSIX_MQ_OPEN_MAX = 8
+_POSIX_MQ_PRIO_MAX = 32
+_POSIX_NGROUPS_MAX = 0
+_POSIX_OPEN_MAX = 16
+_POSIX_FD_SETSIZE = _POSIX_OPEN_MAX
+_POSIX_NAME_MAX = 14
+_POSIX_PATH_MAX = 255
+_POSIX_PIPE_BUF = 512
+_POSIX_RTSIG_MAX = 8
+_POSIX_SEM_NSEMS_MAX = 256
+_POSIX_SEM_VALUE_MAX = 32767
+_POSIX_SIGQUEUE_MAX = 32
+_POSIX_SSIZE_MAX = 32767
+_POSIX_STREAM_MAX = 8
+_POSIX_TZNAME_MAX = 3
+_POSIX_QLIMIT = 1
+_POSIX_HIWAT = _POSIX_PIPE_BUF
+_POSIX_UIO_MAXIOV = 16
+_POSIX_TTY_NAME_MAX = 9
+_POSIX_TIMER_MAX = 32
+_POSIX_LOGIN_NAME_MAX = 9
+_POSIX_CLOCKRES_MIN = 20000000
+
+# Included from bits/local_lim.h
+
+# Included from posix/limits.h
+CHAR_BIT = 8
+CHAR_MAX = 127
+CHAR_MIN = (-128)
+INT_MAX = 2147483647
+INT_MIN = (-2147483647-1)
+LONG_MAX = 2147483647L
+LONG_MIN = (-2147483647L-1L)
+SCHAR_MAX = 127
+SCHAR_MIN = (-128)
+SHRT_MAX = 32767
+SHRT_MIN = (-32768)
+UCHAR_MAX = 255
+USHRT_MAX = 65535
+_POSIX_ARG_MAX = 131072
+_POSIX_CHILD_MAX = 4096
+_POSIX_LINK_MAX = 1
+_POSIX_MAX_CANON = 126
+_POSIX_MAX_INPUT = 126
+_POSIX_NAME_MAX = 256
+_POSIX_NGROUPS_MAX = 32
+_POSIX_OPEN_MAX = 256
+_POSIX_PATH_MAX = 255
+_POSIX_PIPE_BUF = 512
+_POSIX_SSIZE_MAX = 2147483647
+_POSIX_STREAM_MAX = 256
+_POSIX_TZNAME_MAX = 5
+NGROUPS_MAX = 32
+ARG_MAX = 131072
+CHILD_MAX = 4096
+OPEN_MAX = 256
+LINK_MAX = 1
+MAX_CANON = 126
+MAX_INPUT = 126
+NAME_MAX = 255
+PATH_MAX = 4096
+PIPE_BUF = 4096
+SSIZE_MAX = 2147483647
+MAXSYMLINKS = 16
+AIO_PRIO_DELTA_MAX = 20
+SSIZE_MAX = INT_MAX
+NGROUPS_MAX = _POSIX_NGROUPS_MAX
+
+# Included from bits/posix2_lim.h
+_BITS_POSIX2_LIM_H = 1
+_POSIX2_BC_BASE_MAX = 99
+_POSIX2_BC_DIM_MAX = 2048
+_POSIX2_BC_SCALE_MAX = 99
+_POSIX2_BC_STRING_MAX = 1000
+_POSIX2_COLL_WEIGHTS_MAX = 255
+_POSIX2_EQUIV_CLASS_MAX = 255
+_POSIX2_EXPR_NEST_MAX = 32
+_POSIX2_LINE_MAX = 2048
+_POSIX2_RE_DUP_MAX = 255
+_POSIX2_CHARCLASS_NAME_MAX = 2048
+BC_BASE_MAX = _POSIX2_BC_BASE_MAX
+BC_DIM_MAX = _POSIX2_BC_DIM_MAX
+BC_SCALE_MAX = _POSIX2_BC_SCALE_MAX
+BC_STRING_MAX = _POSIX2_BC_STRING_MAX
+COLL_WEIGHTS_MAX = _POSIX2_COLL_WEIGHTS_MAX
+EQUIV_CLASS_MAX = _POSIX2_EQUIV_CLASS_MAX
+EXPR_NEST_MAX = _POSIX2_EXPR_NEST_MAX
+LINE_MAX = _POSIX2_LINE_MAX
+RE_DUP_MAX = _POSIX2_RE_DUP_MAX
+CHARCLASS_NAME_MAX = _POSIX2_CHARCLASS_NAME_MAX
+
+# Included from bits/xopen_lim.h
+_XOPEN_LIM_H = 1
+
+# Included from bits/stdio_lim.h
+L_tmpnam = 20
+TMP_MAX = 238328
+FILENAME_MAX = 4096
+L_ctermid = 9
+L_cuserid = 9
+FOPEN_MAX = 256
+STREAM_MAX = FOPEN_MAX
+TZNAME_MAX = _POSIX_TZNAME_MAX
+_XOPEN_IOV_MAX = _POSIX_UIO_MAXIOV
+NL_ARGMAX = _POSIX_ARG_MAX
+NL_LANGMAX = _POSIX2_LINE_MAX
+NL_MSGMAX = INT_MAX
+NL_NMAX = INT_MAX
+NL_SETMAX = INT_MAX
+NL_TEXTMAX = INT_MAX
+NZERO = 20
+MB_LEN_MAX = 6
+_LIMITS_H = 1
+CHAR_BIT = 8
+SCHAR_MIN = (-128)
+SCHAR_MAX = 127
+UCHAR_MAX = 255
+CHAR_MIN = 0
+CHAR_MAX = UCHAR_MAX
+CHAR_MIN = SCHAR_MIN
+CHAR_MAX = SCHAR_MAX
+SHRT_MIN = (-32768)
+SHRT_MAX = 32767
+USHRT_MAX = 65535
+INT_MIN = (-INT_MAX - 1)
+INT_MAX = 2147483647
+UINT_MAX = 4294967295
+LONG_MAX = 9223372036854775807L
+LONG_MAX = 2147483647L
+LONG_MIN = (-LONG_MAX - 1L)
+ULONG_MAX = 4294967295L
+
+# Included from stdint.h
+_STDINT_H = 1
+
+# Included from bits/wordsize.h
+__WORDSIZE = 32
+def __INT64_C(c): return c ## L
+
+def __UINT64_C(c): return c ## UL
+
+def __INT64_C(c): return c ## LL
+
+def __UINT64_C(c): return c ## ULL
+
+INT8_MIN = (-128)
+INT16_MIN = (-32767-1)
+INT32_MIN = (-2147483647-1)
+INT64_MIN = (-__INT64_C(9223372036854775807)-1)
+INT8_MAX = (127)
+INT16_MAX = (32767)
+INT32_MAX = (2147483647)
+INT64_MAX = (__INT64_C(9223372036854775807))
+UINT64_MAX = (__UINT64_C(18446744073709551615))
+INT_LEAST8_MIN = (-128)
+INT_LEAST16_MIN = (-32767-1)
+INT_LEAST32_MIN = (-2147483647-1)
+INT_LEAST64_MIN = (-__INT64_C(9223372036854775807)-1)
+INT_LEAST8_MAX = (127)
+INT_LEAST16_MAX = (32767)
+INT_LEAST32_MAX = (2147483647)
+INT_LEAST64_MAX = (__INT64_C(9223372036854775807))
+UINT_LEAST64_MAX = (__UINT64_C(18446744073709551615))
+INT_FAST8_MIN = (-128)
+INT_FAST16_MIN = (-9223372036854775807L-1)
+INT_FAST32_MIN = (-9223372036854775807L-1)
+INT_FAST16_MIN = (-2147483647-1)
+INT_FAST32_MIN = (-2147483647-1)
+INT_FAST64_MIN = (-__INT64_C(9223372036854775807)-1)
+INT_FAST8_MAX = (127)
+INT_FAST16_MAX = (9223372036854775807L)
+INT_FAST32_MAX = (9223372036854775807L)
+INT_FAST16_MAX = (2147483647)
+INT_FAST32_MAX = (2147483647)
+INT_FAST64_MAX = (__INT64_C(9223372036854775807))
+UINT_FAST64_MAX = (__UINT64_C(18446744073709551615))
+INTPTR_MIN = (-9223372036854775807L-1)
+INTPTR_MAX = (9223372036854775807L)
+INTPTR_MIN = (-2147483647-1)
+INTPTR_MAX = (2147483647)
+INTMAX_MIN = (-__INT64_C(9223372036854775807)-1)
+INTMAX_MAX = (__INT64_C(9223372036854775807))
+UINTMAX_MAX = (__UINT64_C(18446744073709551615))
+PTRDIFF_MIN = (-9223372036854775807L-1)
+PTRDIFF_MAX = (9223372036854775807L)
+PTRDIFF_MIN = (-2147483647-1)
+PTRDIFF_MAX = (2147483647)
+SIG_ATOMIC_MIN = (-2147483647-1)
+SIG_ATOMIC_MAX = (2147483647)
+WCHAR_MIN = (-2147483647-1)
+WCHAR_MAX = (2147483647)
+WINT_MIN = (0)
+def INT8_C(c): return c
+
+def INT16_C(c): return c
+
+def INT32_C(c): return c
+
+def INT64_C(c): return c ## L
+
+def INT64_C(c): return c ## LL
+
+def UINT8_C(c): return c ## U
+
+def UINT16_C(c): return c ## U
+
+def UINT32_C(c): return c ## U
+
+def UINT64_C(c): return c ## UL
+
+def UINT64_C(c): return c ## ULL
+
+def INTMAX_C(c): return c ## L
+
+def UINTMAX_C(c): return c ## UL
+
+def INTMAX_C(c): return c ## LL
+
+def UINTMAX_C(c): return c ## ULL
+
+
+# Included from sys/types.h
+_SYS_TYPES_H = 1
+
+# 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))
+
+
+# Included from bits/socket.h
+PF_UNSPEC = 0
+PF_LOCAL = 1
+PF_UNIX = PF_LOCAL
+PF_FILE = PF_LOCAL
+PF_INET = 2
+PF_AX25 = 3
+PF_IPX = 4
+PF_APPLETALK = 5
+PF_NETROM = 6
+PF_BRIDGE = 7
+PF_ATMPVC = 8
+PF_X25 = 9
+PF_INET6 = 10
+PF_ROSE = 11
+PF_DECnet = 12
+PF_NETBEUI = 13
+PF_SECURITY = 14
+PF_KEY = 15
+PF_NETLINK = 16
+PF_ROUTE = PF_NETLINK
+PF_PACKET = 17
+PF_ASH = 18
+PF_ECONET = 19
+PF_ATMSVC = 20
+PF_SNA = 22
+PF_IRDA = 23
+PF_MAX = 32
+AF_UNSPEC = PF_UNSPEC
+AF_LOCAL = PF_LOCAL
+AF_UNIX = PF_UNIX
+AF_FILE = PF_FILE
+AF_INET = PF_INET
+AF_AX25 = PF_AX25
+AF_IPX = PF_IPX
+AF_APPLETALK = PF_APPLETALK
+AF_NETROM = PF_NETROM
+AF_BRIDGE = PF_BRIDGE
+AF_ATMPVC = PF_ATMPVC
+AF_X25 = PF_X25
+AF_INET6 = PF_INET6
+AF_ROSE = PF_ROSE
+AF_DECnet = PF_DECnet
+AF_NETBEUI = PF_NETBEUI
+AF_SECURITY = PF_SECURITY
+AF_KEY = PF_KEY
+AF_NETLINK = PF_NETLINK
+AF_ROUTE = PF_ROUTE
+AF_PACKET = PF_PACKET
+AF_ASH = PF_ASH
+AF_ECONET = PF_ECONET
+AF_ATMSVC = PF_ATMSVC
+AF_SNA = PF_SNA
+AF_IRDA = PF_IRDA
+AF_MAX = PF_MAX
+SOL_RAW = 255
+SOL_DECNET = 261
+SOL_X25 = 262
+SOL_PACKET = 263
+SOL_ATM = 264
+SOL_AAL = 265
+SOL_IRDA = 266
+SOMAXCONN = 128
+
+# Included from bits/sockaddr.h
+_BITS_SOCKADDR_H = 1
+def __SOCKADDR_COMMON(sa_prefix): return \
+
+_SS_SIZE = 128
+def CMSG_FIRSTHDR(mhdr): return \
+
+
+# Included from atheos/socket.h
+
+# Included from atheos/types.h
+OS_NAME_LENGTH = 64
+TRUE = 1
+FALSE = 0
+
+# Included from atheos/filesystem.h
+
+# Included from atheos/atomic.h
+
+# Included from atheos/typedefs.h
+
+# Included from atheos/fs_attribs.h
+
+# Included from atheos/kernel.h
+
+# Included from atheos/kdebug.h
+
+# Included from atheos/threads.h
+TF_DEADLOCK = 0x0001
+DB_PACKET_SIZE = 128
+DB_PORT_COUNT = 16
+DBP_PRINTK = 0
+DBP_DEBUGGER = 2
+
+# Included from atheos/stdlib.h
+
+# Included from atheos/string.h
+def COMMON(x): return \
+
+def COMMON(x): return \
+
+
+# Included from atheos/schedule.h
+
+# Included from atheos/timer.h
+
+# Included from posix/resource.h
+RUSAGE_SELF = 0
+RUSAGE_CHILDREN = -1
+RLIMIT_CPU = 0
+RLIMIT_FSIZE = 1
+RLIMIT_DATA = 2
+RLIMIT_STACK = 3
+RLIMIT_CORE = 4
+RLIMIT_RSS = 5
+RLIMIT_MEMLOCK = 6
+RLIMIT_NPROC = 7
+RLIMIT_NOFILE = 8
+RLIMIT_AS = 9
+RLIM_NLIMITS = 10
+
+# Included from atheos/v86.h
+
+# Included from atheos/areas.h
+MEMF_REAL = 0x00000002
+MEMF_USER = 0x00000004
+MEMF_BUFFER = 0x00000008
+MEMF_KERNEL = 0x00000010
+MEMF_OKTOFAILHACK = 0x00000020
+MEMF_PRI_MASK = 0x000000ff
+MEMF_NOBLOCK = 0x00000100
+MEMF_CLEAR = 0x00010000
+MEMF_LOCKED = 0x10000000
+PAGE_SHIFT = 12
+PGDIR_SHIFT = 22
+def PAGE_ALIGN(addr): return (((addr)+PAGE_SIZE-1)&PAGE_MASK)
+
+AREA_NO_LOCK = 0
+AREA_LAZY_LOCK = 1
+AREA_FULL_LOCK = 2
+AREA_CONTIGUOUS = 3
+AREA_READ = 0x00000001
+AREA_WRITE = 0x00000002
+AREA_EXEC = 0x00000004
+AREA_FULL_ACCESS = (AREA_READ | AREA_WRITE | AREA_EXEC)
+AREA_KERNEL = 0x00000008
+AREA_UNMAP_PHYS = 0x00000010
+AREA_ANY_ADDRESS = 0x00000000
+AREA_EXACT_ADDRESS = 0x00000100
+AREA_BASE_ADDRESS = 0x00000200
+AREA_CLONE_ADDRESS = 0x00000300
+AREA_ADDR_SPEC_MASK = 0x00000f00
+AREA_TOP_DOWN = 0x00001000
+AREA_REMAPPED = 0x0020
+AREA_SHARED = 0x0040
+AREA_GROWSDOWN = 0x0080
+AREA_FIRST_KERNEL_ADDRESS = 0x00100000
+AREA_LAST_KERNEL_ADDRESS = 0x7fffffff
+AREA_FIRST_USER_ADDRESS = 0x80000000
+AREA_LAST_USER_ADDRESS = 0xffffffff
+MAX_CPU_COUNT = 16
+def kfree(p): return kassertw( __kfree(p) == 0 )
+
+
+# Included from posix/dirent.h
+MAXNAMLEN = NAME_MAX
+MAXNAMLEN = 255
+
+# Included from dirent.h
+_DIRENT_H = 1
+
+# Included from bits/dirent.h
+def _D_ALLOC_NAMLEN(d): return (_D_EXACT_NAMLEN (d) + 1)
+
+def IFTODT(mode): return (((mode) & 0170000) >> 12)
+
+def DTTOIF(dirtype): return ((dirtype) << 12)
+
+def dirfd(dirp): return _DIR_dirfd (dirp)
+
+MAXNAMLEN = NAME_MAX
+MAXNAMLEN = 255
+
+# Included from posix/stat.h
+S_IFMT = 00170000
+S_IFSOCK = 0140000
+S_IFLNK = 0120000
+S_IFREG = 0100000
+S_IFBLK = 0060000
+S_IFDIR = 0040000
+S_IFCHR = 0020000
+S_IFIFO = 0010000
+S_ISUID = 0004000
+S_ISGID = 0002000
+S_ISVTX = 0001000
+def S_ISLNK(m): return (((m) & S_IFMT) == S_IFLNK)
+
+def S_ISREG(m): return (((m) & S_IFMT) == S_IFREG)
+
+def S_ISDIR(m): return (((m) & S_IFMT) == S_IFDIR)
+
+def S_ISCHR(m): return (((m) & S_IFMT) == S_IFCHR)
+
+def S_ISBLK(m): return (((m) & S_IFMT) == S_IFBLK)
+
+def S_ISFIFO(m): return (((m) & S_IFMT) == S_IFIFO)
+
+def S_ISSOCK(m): return (((m) & S_IFMT) == S_IFSOCK)
+
+S_IRWXU = 00700
+S_IRUSR = 00400
+S_IWUSR = 00200
+S_IXUSR = 00100
+S_IRWXG = 00070
+S_IRGRP = 00040
+S_IWGRP = 00020
+S_IXGRP = 00010
+S_IRWXO = 00007
+S_IROTH = 00004
+S_IWOTH = 00002
+S_IXOTH = 00001
+S_IRWXUGO = (S_IRWXU|S_IRWXG|S_IRWXO)
+S_IALLUGO = (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
+S_IRUGO = (S_IRUSR|S_IRGRP|S_IROTH)
+S_IWUGO = (S_IWUSR|S_IWGRP|S_IWOTH)
+S_IXUGO = (S_IXUSR|S_IXGRP|S_IXOTH)
+_STAT_VER_KERNEL = 0
+
+# Included from posix/fcntl.h
+O_ACCMODE = 0003
+O_RWMASK = O_ACCMODE
+O_RDONLY = 00
+O_WRONLY = 01
+O_RDWR = 02
+O_CREAT = 0100
+O_EXCL = 0200
+O_NOCTTY = 0400
+O_TRUNC = 01000
+O_APPEND = 02000
+O_NONBLOCK = 04000
+O_NDELAY = O_NONBLOCK
+O_SYNC = 010000
+O_FSYNC = O_SYNC
+O_ASYNC = 020000
+FASYNC = O_ASYNC
+O_DIRECTORY = 040000
+O_NOTRAVERSE = 0100000
+O_NOFOLLOW = O_NOTRAVERSE
+F_DUPFD = 0
+F_GETFD = 1
+F_SETFD = 2
+F_GETFL = 3
+F_SETFL = 4
+F_GETLK = 5
+F_SETLK = 6
+F_SETLKW = 7
+F_SETOWN = 8
+F_GETOWN = 9
+F_SETSIG = 10
+F_GETSIG = 11
+F_COPYFD = 12
+FD_CLOEXEC = 1
+F_RDLCK = 0
+F_WRLCK = 1
+F_UNLCK = 2
+F_EXLCK = 4
+F_SHLCK = 8
+LOCK_SH = 1
+LOCK_EX = 2
+LOCK_NB = 4
+LOCK_UN = 8
+
+# Included from posix/uio.h
+UIO_FASTIOV = 8
+UIO_MAXIOV = 1024
+MNTF_READONLY = 0x0001
+FS_IS_READONLY = 0x00000001
+FS_IS_REMOVABLE = 0x00000002
+FS_IS_PERSISTENT = 0x00000004
+FS_IS_SHARED = 0x00000008
+FS_IS_BLOCKBASED = 0x00000010
+FS_CAN_MOUNT = 0x00000020
+FS_HAS_MIME = 0x00010000
+FS_HAS_ATTR = 0x00020000
+FS_HAS_QUERY = 0x00040000
+FSINFO_VERSION = 1
+WSTAT_MODE = 0x0001
+WSTAT_UID = 0x0002
+WSTAT_GID = 0x0004
+WSTAT_SIZE = 0x0008
+WSTAT_ATIME = 0x0010
+WSTAT_MTIME = 0x0020
+WSTAT_CTIME = 0x0040
+WFSSTAT_NAME = 0x0001
+FSDRIVER_API_VERSION = 1
+
+# Included from net/nettypes.h
+IP_ADR_LEN = 4
+INADDR_ANY = 0x00000000
+INADDR_BROADCAST = 0xffffffff
+INADDR_LOOPBACK = 0x7f000001
+def CMSG_ALIGN(len): return ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
+
+PROT_SOCK = 1024
+SHUTDOWN_MASK = 3
+RCV_SHUTDOWN = 1
+SEND_SHUTDOWN = 2
+SOCK_STREAM = 1
+SOCK_DGRAM = 2
+SOCK_RAW = 3
+SOCK_RDM = 4
+SOCK_SEQPACKET = 5
+SOCK_PACKET = 10
+PF_UNSPEC = 0
+PF_LOCAL = 1
+PF_UNIX = PF_LOCAL
+PF_FILE = PF_LOCAL
+PF_INET = 2
+PF_AX25 = 3
+PF_IPX = 4
+PF_APPLETALK = 5
+PF_NETROM = 6
+PF_BRIDGE = 7
+PF_ATMPVC = 8
+PF_X25 = 9
+PF_INET6 = 10
+PF_ROSE = 11
+PF_DECnet = 12
+PF_NETBEUI = 13
+PF_SECURITY = 14
+PF_KEY = 15
+PF_NETLINK = 16
+PF_ROUTE = PF_NETLINK
+PF_PACKET = 17
+PF_ASH = 18
+PF_ECONET = 19
+PF_ATMSVC = 20
+PF_SNA = 22
+PF_IRDA = 23
+PF_MAX = 32
+AF_UNSPEC = PF_UNSPEC
+AF_LOCAL = PF_LOCAL
+AF_UNIX = PF_UNIX
+AF_FILE = PF_FILE
+AF_INET = PF_INET
+AF_AX25 = PF_AX25
+AF_IPX = PF_IPX
+AF_APPLETALK = PF_APPLETALK
+AF_NETROM = PF_NETROM
+AF_BRIDGE = PF_BRIDGE
+AF_ATMPVC = PF_ATMPVC
+AF_X25 = PF_X25
+AF_INET6 = PF_INET6
+AF_ROSE = PF_ROSE
+AF_DECnet = PF_DECnet
+AF_NETBEUI = PF_NETBEUI
+AF_SECURITY = PF_SECURITY
+AF_KEY = PF_KEY
+AF_NETLINK = PF_NETLINK
+AF_ROUTE = PF_ROUTE
+AF_PACKET = PF_PACKET
+AF_ASH = PF_ASH
+AF_ECONET = PF_ECONET
+AF_ATMSVC = PF_ATMSVC
+AF_SNA = PF_SNA
+AF_IRDA = PF_IRDA
+AF_MAX = PF_MAX
+PF_UNIX = 1
+AF_UNIX = PF_UNIX
+PF_INET = 2
+AF_INET = PF_INET
+SOMAXCONN = 128
+MSG_OOB = 1
+MSG_PEEK = 2
+MSG_DONTROUTE = 4
+MSG_PROXY = 16
+SOL_SOCKET = 1
+SO_DEBUG = 1
+SO_REUSEADDR = 2
+SO_TYPE = 3
+SO_ERROR = 4
+SO_DONTROUTE = 5
+SO_BROADCAST = 6
+SO_SNDBUF = 7
+SO_RCVBUF = 8
+SO_KEEPALIVE = 9
+SO_OOBINLINE = 10
+SO_NO_CHECK = 11
+SO_PRIORITY = 12
+SO_LINGER = 13
+SO_BSDCOMPAT = 14
+SOL_IP = 0
+SOL_IPX = 256
+SOL_AX25 = 257
+SOL_ATALK = 258
+SOL_NETROM = 259
+SOL_TCP = 6
+SOL_UDP = 17
+IP_TOS = 1
+IPTOS_LOWDELAY = 0x10
+IPTOS_THROUGHPUT = 0x08
+IPTOS_RELIABILITY = 0x04
+IPTOS_MINCOST = 0x02
+IP_TTL = 2
+IP_HDRINCL = 3
+IP_OPTIONS = 4
+IP_MULTICAST_IF = 32
+IP_MULTICAST_TTL = 33
+IP_MULTICAST_LOOP = 34
+IP_ADD_MEMBERSHIP = 35
+IP_DROP_MEMBERSHIP = 36
+TCP_NODELAY = 0x01
+TCP_MAXSEG = 0x02
+def IN_CLASSA(a): return ((( (a)) & 0x80000000) == 0)
+
+IN_CLASSA_NET = 0xff000000
+IN_CLASSA_NSHIFT = 24
+IN_CLASSA_HOST = (0xffffffff & ~IN_CLASSA_NET)
+IN_CLASSA_MAX = 128
+def IN_CLASSB(a): return ((( (a)) & 0xc0000000) == 0x80000000)
+
+IN_CLASSB_NET = 0xffff0000
+IN_CLASSB_NSHIFT = 16
+IN_CLASSB_HOST = (0xffffffff & ~IN_CLASSB_NET)
+IN_CLASSB_MAX = 65536
+def IN_CLASSC(a): return ((( (a)) & 0xe0000000) == 0xc0000000)
+
+IN_CLASSC_NET = 0xffffff00
+IN_CLASSC_NSHIFT = 8
+IN_CLASSC_HOST = (0xffffffff & ~IN_CLASSC_NET)
+def IN_CLASSD(a): return ((( (a)) & 0xf0000000) == 0xe0000000)
+
+def IN_MULTICAST(a): return IN_CLASSD(a)
+
+def IN_EXPERIMENTAL(a): return ((( (a)) & 0xe0000000) == 0xe0000000)
+
+def IN_BADCLASS(a): return ((( (a)) & 0xf0000000) == 0xf0000000)
+
+INADDR_ANY = ( 0x00000000)
+INADDR_BROADCAST = ( 0xffffffff)
+INADDR_NONE = ( 0xffffffff)
+IN_LOOPBACKNET = 127
+INADDR_LOOPBACK = ( 0x7f000001)
+INADDR_UNSPEC_GROUP = ( 0xe0000000)
+INADDR_ALLHOSTS_GROUP = ( 0xe0000001)
+INADDR_ALLRTRS_GROUP = ( 0xe0000002)
+INADDR_MAX_LOCAL_GROUP = ( 0xe00000ff)
+INET_ADDRSTRLEN = 16
+INET6_ADDRSTRLEN = 46
+
+# Included from bits/in.h
+IP_TOS = 1
+IP_TTL = 2
+IP_HDRINCL = 3
+IP_OPTIONS = 4
+IP_ROUTER_ALERT = 5
+IP_RECVOPTS = 6
+IP_RETOPTS = 7
+IP_PKTINFO = 8
+IP_PKTOPTIONS = 9
+IP_PMTUDISC = 10
+IP_MTU_DISCOVER = 10
+IP_RECVERR = 11
+IP_RECVTTL = 12
+IP_RECVTOS = 13
+IP_MULTICAST_IF = 32
+IP_MULTICAST_TTL = 33
+IP_MULTICAST_LOOP = 34
+IP_ADD_MEMBERSHIP = 35
+IP_DROP_MEMBERSHIP = 36
+IP_RECVRETOPTS = IP_RETOPTS
+IP_PMTUDISC_DONT = 0
+IP_PMTUDISC_WANT = 1
+IP_PMTUDISC_DO = 2
+SOL_IP = 0
+SOL_SOCKET = 1
+IP_DEFAULT_MULTICAST_TTL = 1
+IP_DEFAULT_MULTICAST_LOOP = 1
+IP_MAX_MEMBERSHIPS = 20
+IPV6_ADDRFORM = 1
+IPV6_PKTINFO = 2
+IPV6_HOPOPTS = 3
+IPV6_DSTOPTS = 4
+IPV6_RXSRCRT = 5
+IPV6_PKTOPTIONS = 6
+IPV6_CHECKSUM = 7
+IPV6_HOPLIMIT = 8
+IPV6_NEXTHOP = 9
+IPV6_AUTHHDR = 10
+IPV6_UNICAST_HOPS = 16
+IPV6_MULTICAST_IF = 17
+IPV6_MULTICAST_HOPS = 18
+IPV6_MULTICAST_LOOP = 19
+IPV6_ADD_MEMBERSHIP = 20
+IPV6_DROP_MEMBERSHIP = 21
+IPV6_ROUTER_ALERT = 22
+SCM_SRCRT = IPV6_RXSRCRT
+IPV6_RXHOPOPTS = IPV6_HOPOPTS
+IPV6_RXDSTOPTS = IPV6_DSTOPTS
+IPV6_PMTUDISC_DONT = 0
+IPV6_PMTUDISC_WANT = 1
+IPV6_PMTUDISC_DO = 2
+SOL_IPV6 = 41
+SOL_ICMPV6 = 58
+
+# Included from bits/byteswap.h
+def __bswap_constant_16(x): return \
+
+def __bswap_16(x): return \
+
+def __bswap_16(x): return __bswap_constant_16 (x)
+
+def __bswap_constant_32(x): return \
+
+def __bswap_32(x): return \
+
+def __bswap_32(x): return \
+
+def __bswap_32(x): return __bswap_constant_32 (x)
+
+def __bswap_64(x): return \
+
+def ntohl(x): return (x)
+
+def ntohs(x): return (x)
+
+def htonl(x): return (x)
+
+def htons(x): return (x)
+
+def ntohl(x): return __bswap_32 (x)
+
+def ntohs(x): return __bswap_16 (x)
+
+def htonl(x): return __bswap_32 (x)
+
+def htons(x): return __bswap_16 (x)
+
+def IN6_IS_ADDR_UNSPECIFIED(a): return \
+
+def IN6_IS_ADDR_LOOPBACK(a): return \
+
+def IN6_IS_ADDR_LINKLOCAL(a): return \
+
+def IN6_IS_ADDR_SITELOCAL(a): return \
+
+def IN6_IS_ADDR_V4MAPPED(a): return \
+
+def IN6_IS_ADDR_V4COMPAT(a): return \
+
+def IN6_IS_ADDR_MC_NODELOCAL(a): return \
+
+def IN6_IS_ADDR_MC_LINKLOCAL(a): return \
+
+def IN6_IS_ADDR_MC_SITELOCAL(a): return \
+
+def IN6_IS_ADDR_MC_ORGLOCAL(a): return \
+
+def IN6_IS_ADDR_MC_GLOBAL(a): return \
+
diff --git a/Lib/plat-atheos/TYPES.py b/Lib/plat-atheos/TYPES.py
new file mode 100644
index 0000000..8166108
--- /dev/null
+++ b/Lib/plat-atheos/TYPES.py
@@ -0,0 +1,143 @@
+# 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))
+
diff --git a/Lib/plat-atheos/regen b/Lib/plat-atheos/regen
new file mode 100644
index 0000000..7c002c3
--- /dev/null
+++ b/Lib/plat-atheos/regen
@@ -0,0 +1,3 @@
+#! /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
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index ec72557..77ae9c5 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -721,6 +721,34 @@
test_zipfile
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:
diff --git a/Lib/test/test_fcntl.py b/Lib/test/test_fcntl.py
index c4e47ad..cc4f213 100755
--- a/Lib/test/test_fcntl.py
+++ b/Lib/test/test_fcntl.py
@@ -17,6 +17,9 @@
else:
start_len = "qq"
+if sys.platform.startswith('atheos'):
+ start_len = "qq"
+
if sys.platform in ('netbsd1', 'Darwin1.2', 'darwin',
'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5',
'bsdos2', 'bsdos3', 'bsdos4',
diff --git a/Lib/test/test_file.py b/Lib/test/test_file.py
index 71222c1..261db2c 100644
--- a/Lib/test/test_file.py
+++ b/Lib/test/test_file.py
@@ -1,3 +1,4 @@
+import sys
import os
from array import array
@@ -88,7 +89,11 @@
if not f.closed:
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)
try:
method()
diff --git a/Lib/test/test_mhlib.py b/Lib/test/test_mhlib.py
index 91c1a1a..ef5877d 100644
--- a/Lib/test/test_mhlib.py
+++ b/Lib/test/test_mhlib.py
@@ -12,7 +12,7 @@
import sys
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 +
"too many Unix assumptions")
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index 12c016b..735d4cb 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -139,7 +139,13 @@
return
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
self.assertEquals(result.f_bfree, result[statvfs.F_BFREE])
diff --git a/Lib/test/test_popen2.py b/Lib/test/test_popen2.py
index 799df4a..c67dd71 100644
--- a/Lib/test/test_popen2.py
+++ b/Lib/test/test_popen2.py
@@ -14,11 +14,12 @@
def main():
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
# to avoid mixing "posix" fork & exec with native threads, and
# 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:
from os import popen
except ImportError:
diff --git a/Makefile.pre.in b/Makefile.pre.in
index ad11ff8..0590fa8 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -146,6 +146,7 @@
LIBM= @LIBM@
LIBC= @LIBC@
SYSLIBS= $(LIBM) $(LIBC)
+SHLIBS= @SHLIBS@
MAINOBJ= @MAINOBJ@
THREADOBJ= @THREADOBJ@
@@ -341,7 +342,7 @@
$(RANLIB) $@
libpython$(VERSION).so: $(LIBRARY_OBJS)
- $(LDSHARED) -o $@ $(LIBRARY_OBJS) $(LIBC) $(LIBM)
+ $(LDSHARED) -o $@ $(LIBRARY_OBJS) $(SHLIBS) $(LIBC) $(LIBM)
libpython$(VERSION).sl: $(LIBRARY_OBJS)
$(LDSHARED) -o $@ $(LIBRARY_OBJS) $(LIBC) $(LIBM)
diff --git a/Misc/ACKS b/Misc/ACKS
index 51807a7..4f65583 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -78,6 +78,7 @@
Luke Kenneth Casson Leighton
Donn Cave
Per Cederqvist
+Octavian Cerna
Jeffrey Chang
Brad Chapman
Greg Chapman
diff --git a/Misc/AtheOS-NOTES b/Misc/AtheOS-NOTES
new file mode 100644
index 0000000..8138f7a
--- /dev/null
+++ b/Misc/AtheOS-NOTES
@@ -0,0 +1,68 @@
+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>
diff --git a/Misc/NEWS b/Misc/NEWS
index 0c167a0..752082b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -311,6 +311,8 @@
New platforms
+- AtheOS is now supported.
+
- GNU/Hurd is now supported.
Tests
diff --git a/Modules/cryptmodule.c b/Modules/cryptmodule.c
index b1c8f5e..5c4ee2f 100644
--- a/Modules/cryptmodule.c
+++ b/Modules/cryptmodule.c
@@ -17,7 +17,9 @@
if (!PyArg_ParseTuple(args, "ss:crypt", &word, &salt)) {
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));
}
diff --git a/Python/dynload_atheos.c b/Python/dynload_atheos.c
new file mode 100644
index 0000000..6f4df73
--- /dev/null
+++ b/Python/dynload_atheos.c
@@ -0,0 +1,47 @@
+
+/* 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;
+}
diff --git a/Python/thread.c b/Python/thread.c
index b35a48b..1c5e685 100644
--- a/Python/thread.c
+++ b/Python/thread.c
@@ -133,6 +133,10 @@
#include "thread_plan9.h"
#endif
+#ifdef ATHEOS_THREADS
+#include "thread_atheos.h"
+#endif
+
/*
#ifdef FOOBAR_THREADS
#include "thread_foobar.h"
diff --git a/Python/thread_atheos.h b/Python/thread_atheos.h
new file mode 100644
index 0000000..c9f5e23
--- /dev/null
+++ b/Python/thread_atheos.h
@@ -0,0 +1,300 @@
+/* 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
+}
diff --git a/Tools/scripts/h2py.py b/Tools/scripts/h2py.py
index 055e381..393a4ad 100755
--- a/Tools/scripts/h2py.py
+++ b/Tools/scripts/h2py.py
@@ -50,6 +50,8 @@
try:
if sys.platform.find("beos") == 0:
searchdirs=os.environ['BEINCLUDES'].split(';')
+ elif sys.platform.startswith("atheos"):
+ searchdirs=os.environ['C_INCLUDE_PATH'].split(':')
else:
raise KeyError
except KeyError:
diff --git a/configure b/configure
index b08af5d..92bf5f6 100755
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
#! /bin/sh
-# From configure.in Revision: 1.321 .
+# From configure.in Revision: 1.322 .
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.53.
#
@@ -1293,6 +1293,7 @@
case $MACHDEP in
cygwin*) MACHDEP="cygwin";;
darwin*) MACHDEP="darwin";;
+ atheos*) MACHDEP="atheos";;
'') MACHDEP="unknown";;
esac
fi
@@ -3072,7 +3073,7 @@
if test -z "$enable_shared"
then
case $ac_sys_system in
- CYGWIN*)
+ CYGWIN* | atheos*)
enable_shared="yes";;
*)
enable_shared="no";;
@@ -3131,6 +3132,11 @@
BLDLIBRARY='-rpath $(LIBDIR) -L. -lpython$(VERSION)'
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
# DG/UX requires some fancy ld contortions to produce a .so from an .a
case $MACHDEP in
@@ -3384,6 +3390,7 @@
case $ac_sys_system in
BeOS*) LN="ln -s";;
CYGWIN*) LN="ln -s";;
+ atheos*) LN="ln -s";;
*) LN=ln;;
esac
fi
@@ -8779,6 +8786,7 @@
SCO_SV*) LDSHARED="cc -G -KPIC -Ki486 -belf -Wl,-Bexport";;
Monterey*) LDSHARED="cc -G -dy -Bdynamic -Bexport -L/usr/lib/ia64l64";;
CYGWIN*) LDSHARED="gcc -shared -Wl,--enable-auto-image-base";;
+ atheos*) LDSHARED="gcc -shared";;
*) LDSHARED="ld";;
esac
fi
@@ -8814,6 +8822,7 @@
*) CCSHARED="";;
esac;;
CYGWIN*) CCSHARED="-DUSE_DL_IMPORT";;
+ atheos*) CCSHARED="-fPIC";;
esac
fi
echo "$as_me:$LINENO: result: $CCSHARED" >&5
@@ -8883,6 +8892,23 @@
echo "$as_me:$LINENO: result: $CFLAGSFORSHARED" >&5
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
echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
@@ -9870,6 +9896,120 @@
THREADOBJ="Python/thread.o"
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
echo "$as_me:$LINENO: checking for kernel/OS.h" >&5
echo $ECHO_N "checking for kernel/OS.h... $ECHO_C" >&6
@@ -10326,6 +10466,9 @@
fi
+
+fi
+
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi;
@@ -11192,6 +11335,7 @@
BeOS*) DYNLOADFILE="dynload_beos.o";;
hp*|HP*) DYNLOADFILE="dynload_hpux.o";;
Darwin/*) DYNLOADFILE="dynload_next.o";;
+ atheos*) DYNLOADFILE="dynload_atheos.o";;
*)
# use dynload_shlib.c and dlopen() if we have it; otherwise stub
# out any dynamic loading
@@ -16394,6 +16538,7 @@
s,@CCSHARED@,$CCSHARED,;t t
s,@LINKFORSHARED@,$LINKFORSHARED,;t t
s,@CFLAGSFORSHARED@,$CFLAGSFORSHARED,;t t
+s,@SHLIBS@,$SHLIBS,;t t
s,@USE_SIGNAL_MODULE@,$USE_SIGNAL_MODULE,;t t
s,@SIGNAL_OBJS@,$SIGNAL_OBJS,;t t
s,@USE_THREAD_MODULE@,$USE_THREAD_MODULE,;t t
diff --git a/configure.in b/configure.in
index 55f1f55..88025bc 100644
--- a/configure.in
+++ b/configure.in
@@ -81,6 +81,7 @@
case $MACHDEP in
cygwin*) MACHDEP="cygwin";;
darwin*) MACHDEP="darwin";;
+ atheos*) MACHDEP="atheos";;
'') MACHDEP="unknown";;
esac
fi
@@ -328,7 +329,7 @@
if test -z "$enable_shared"
then
case $ac_sys_system in
- CYGWIN*)
+ CYGWIN* | atheos*)
enable_shared="yes";;
*)
enable_shared="no";;
@@ -385,6 +386,11 @@
BLDLIBRARY='-rpath $(LIBDIR) -L. -lpython$(VERSION)'
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
# DG/UX requires some fancy ld contortions to produce a .so from an .a
case $MACHDEP in
@@ -417,6 +423,7 @@
case $ac_sys_system in
BeOS*) LN="ln -s";;
CYGWIN*) LN="ln -s";;
+ atheos*) LN="ln -s";;
*) LN=ln;;
esac
fi
@@ -906,6 +913,7 @@
SCO_SV*) LDSHARED="cc -G -KPIC -Ki486 -belf -Wl,-Bexport";;
Monterey*) LDSHARED="cc -G -dy -Bdynamic -Bexport -L/usr/lib/ia64l64";;
CYGWIN*) LDSHARED="gcc -shared -Wl,--enable-auto-image-base";;
+ atheos*) LDSHARED="gcc -shared";;
*) LDSHARED="ld";;
esac
fi
@@ -939,6 +947,7 @@
*) CCSHARED="";;
esac;;
CYGWIN*) CCSHARED="-DUSE_DL_IMPORT";;
+ atheos*) CCSHARED="-fPIC";;
esac
fi
AC_MSG_RESULT($CCSHARED)
@@ -1003,6 +1012,21 @@
fi
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
AC_CHECK_LIB(dl, dlopen) # Dynamic linking for SunOS/Solaris and SYSV
AC_CHECK_LIB(dld, shl_load) # Dynamic linking for HP-UX
@@ -1177,6 +1201,10 @@
AC_CHECK_FUNC(pthread_detach, [AC_DEFINE(WITH_THREAD)
posix_threads=yes
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_DEFINE(BEOS_THREADS, 1,
[Define this if you have BeOS threads.])
@@ -1202,7 +1230,7 @@
LIBS="$LIBS -lcma"
THREADOBJ="Python/thread.o"],[
USE_THREAD_MODULE="#"])
- ])])])])])])])])])])
+ ])])])])])])])])])])])
if test "$posix_threads" = "yes"; then
if test "$unistd_defines_pthreads" = "no"; then
@@ -1560,6 +1588,7 @@
BeOS*) DYNLOADFILE="dynload_beos.o";;
hp*|HP*) DYNLOADFILE="dynload_hpux.o";;
Darwin/*) DYNLOADFILE="dynload_next.o";;
+ atheos*) DYNLOADFILE="dynload_atheos.o";;
*)
# use dynload_shlib.c and dlopen() if we have it; otherwise stub
# out any dynamic loading
diff --git a/pyconfig.h.in b/pyconfig.h.in
index 02ef480..87b79ae 100644
--- a/pyconfig.h.in
+++ b/pyconfig.h.in
@@ -4,6 +4,9 @@
support for AIX C++ shared extension modules. */
#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
on SGI IRIX 4.x) */
#undef BAD_EXEC_PROTOTYPES
diff --git a/setup.py b/setup.py
index 929f2e6..dcca200 100644
--- a/setup.py
+++ b/setup.py
@@ -214,6 +214,8 @@
platform = 'beos'
elif platform[:6] == 'darwin':
platform = 'darwin'
+ elif platform[:6] == 'atheos':
+ platform = 'atheos'
return platform
@@ -242,6 +244,13 @@
platform = self.get_platform()
(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
math_libs = ['m']
if platform in ['darwin', 'beos']:
@@ -323,7 +332,8 @@
exts.append( Extension('cPickle', ['cPickle.c']) )
# 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:
# enigma-inspired encryption
@@ -479,10 +489,11 @@
# Steen Lumholt's termios module
exts.append( Extension('termios', ['termios.c']) )
# 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.
- if platform not in ['cygwin']:
+ if platform not in ['cygwin', 'atheos']:
if (self.compiler.find_library_file(lib_dirs, 'nsl')):
libs = ['nsl']
else:
@@ -593,7 +604,7 @@
# Dynamic loading module
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']) )
# Platform-specific libraries