From f90ae20354ceb501f0ba0b6459df17f1a8005a47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Tue, 11 Jun 2002 06:22:31 +0000 Subject: [PATCH] Patch #488073: AtheOS port. --- Lib/distutils/command/build_ext.py | 20 +- Lib/plat-atheos/IN.py | 945 +++++++++++++++++++++++++++++ Lib/plat-atheos/TYPES.py | 143 +++++ Lib/plat-atheos/regen | 3 + Lib/test/regrtest.py | 28 + Lib/test/test_fcntl.py | 3 + Lib/test/test_file.py | 7 +- Lib/test/test_mhlib.py | 2 +- Lib/test/test_os.py | 8 +- Lib/test/test_popen2.py | 5 +- Makefile.pre.in | 3 +- Misc/ACKS | 1 + Misc/AtheOS-NOTES | 68 +++ Misc/NEWS | 2 + Modules/cryptmodule.c | 4 +- Python/dynload_atheos.c | 47 ++ Python/thread.c | 4 + Python/thread_atheos.h | 300 +++++++++ Tools/scripts/h2py.py | 2 + configure | 149 ++++- configure.in | 33 +- pyconfig.h.in | 3 + setup.py | 19 +- 23 files changed, 1782 insertions(+), 17 deletions(-) create mode 100644 Lib/plat-atheos/IN.py create mode 100644 Lib/plat-atheos/TYPES.py create mode 100644 Lib/plat-atheos/regen create mode 100644 Misc/AtheOS-NOTES create mode 100644 Python/dynload_atheos.c create mode 100644 Python/thread_atheos.h diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py index 89ca1dc9b84..d8f3dc8a7ac 100644 --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -178,9 +178,9 @@ def finalize_options (self): 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 @@ def get_libraries (self, ext): # 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 00000000000..a386a21c28c --- /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 00000000000..81661089dd5 --- /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 00000000000..7c002c36740 --- /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 ec72557ff5a..77ae9c5c466 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -721,6 +721,34 @@ def tolist(self, sorted=1): 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 c4e47adb882..cc4f2134b31 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 71222c173f6..261db2ccb62 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 @@ class NonString: pass 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 91c1a1a7865..ef5877de035 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 12c016b4c6a..735d4cb253a 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -139,7 +139,13 @@ def test_statvfs_attributes(self): 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 799df4ac4dd..c67dd712d9a 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 ad11ff8949f..0590fa87390 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -146,6 +146,7 @@ LIBS= @LIBS@ LIBM= @LIBM@ LIBC= @LIBC@ SYSLIBS= $(LIBM) $(LIBC) +SHLIBS= @SHLIBS@ MAINOBJ= @MAINOBJ@ THREADOBJ= @THREADOBJ@ @@ -341,7 +342,7 @@ $(LIBRARY): $(LIBRARY_OBJS) $(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 51807a7c5d0..4f6558389fe 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -78,6 +78,7 @@ Mike Carlton 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 00000000000..8138f7ac38a --- /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 diff --git a/Misc/NEWS b/Misc/NEWS index 0c167a0cd96..752082bc6a3 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -311,6 +311,8 @@ C API New platforms +- AtheOS is now supported. + - GNU/Hurd is now supported. Tests diff --git a/Modules/cryptmodule.c b/Modules/cryptmodule.c index b1c8f5edd9c..5c4ee2fa81e 100644 --- a/Modules/cryptmodule.c +++ b/Modules/cryptmodule.c @@ -17,7 +17,9 @@ static PyObject *crypt_crypt(PyObject *self, PyObject *args) 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 00000000000..6f4df73c3b9 --- /dev/null +++ b/Python/dynload_atheos.c @@ -0,0 +1,47 @@ + +/* Support for dynamic loading of extension modules */ + +#include +#include + +#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 b35a48b2eb3..1c5e685e9af 100644 --- a/Python/thread.c +++ b/Python/thread.c @@ -133,6 +133,10 @@ void PyThread_init_thread(void) #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 00000000000..c9f5e23189f --- /dev/null +++ b/Python/thread_atheos.h @@ -0,0 +1,300 @@ +/* Threading for AtheOS. + Based on thread_beos.h. */ + +#include +#include +#include +#include +#include + +/* 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 055e381226a..393a4adc098 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 b08af5d62d8..92bf5f6bc5b 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 @@ then case $MACHDEP in cygwin*) MACHDEP="cygwin";; darwin*) MACHDEP="darwin";; + atheos*) MACHDEP="atheos";; '') MACHDEP="unknown";; esac fi @@ -3072,7 +3073,7 @@ fi; if test -z "$enable_shared" then case $ac_sys_system in - CYGWIN*) + CYGWIN* | atheos*) enable_shared="yes";; *) enable_shared="no";; @@ -3131,6 +3132,11 @@ if test $enable_shared = "yes"; then 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 @@ if test -z "$LN" ; then 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 @@ then 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 @@ then *) CCSHARED="";; esac;; CYGWIN*) CCSHARED="-DUSE_DL_IMPORT";; + atheos*) CCSHARED="-fPIC";; esac fi echo "$as_me:$LINENO: result: $CCSHARED" >&5 @@ -8883,6 +8892,23 @@ fi 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 @@ _ACEOF 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 +_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 +_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 @@ -10324,6 +10464,9 @@ fi fi +fi + + fi fi @@ -11192,6 +11335,7 @@ then 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,@BLDSHARED@,$BLDSHARED,;t t 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 55f1f5522ce..88025bc78a3 100644 --- a/configure.in +++ b/configure.in @@ -81,6 +81,7 @@ then case $MACHDEP in cygwin*) MACHDEP="cygwin";; darwin*) MACHDEP="darwin";; + atheos*) MACHDEP="atheos";; '') MACHDEP="unknown";; esac fi @@ -328,7 +329,7 @@ AC_ARG_ENABLE(shared, if test -z "$enable_shared" then case $ac_sys_system in - CYGWIN*) + CYGWIN* | atheos*) enable_shared="yes";; *) enable_shared="no";; @@ -385,6 +386,11 @@ if test $enable_shared = "yes"; then 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 @@ if test -z "$LN" ; then 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 @@ then 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 @@ then *) CCSHARED="";; esac;; CYGWIN*) CCSHARED="-DUSE_DL_IMPORT";; + atheos*) CCSHARED="-fPIC";; esac fi AC_MSG_RESULT($CCSHARED) @@ -1003,6 +1012,21 @@ then 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 @@ pthread_create (NULL, NULL, start_routine, NULL)], [ 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 @@ pthread_create (NULL, NULL, start_routine, NULL)], [ 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 @@ then 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 02ef48012b4..87b79ae9b65 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 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 929f2e673b3..dcca2003fa1 100644 --- a/setup.py +++ b/setup.py @@ -214,6 +214,8 @@ def get_platform (self): platform = 'beos' elif platform[:6] == 'darwin': platform = 'darwin' + elif platform[:6] == 'atheos': + platform = 'atheos' return platform @@ -242,6 +244,13 @@ def detect_modules(self): 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 @@ def detect_modules(self): 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 @@ def detect_modules(self): # 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 @@ def detect_modules(self): # 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