diff options
-rwxr-xr-x | Configure | 8 | ||||
-rw-r--r-- | MANIFEST | 7 | ||||
-rw-r--r-- | README.haiku | 64 | ||||
-rw-r--r-- | ext/Errno/Errno_pm.PL | 2 | ||||
-rw-r--r-- | ext/Time/HiRes/t/HiRes.t | 3 | ||||
-rw-r--r-- | haiku/Haiku/Haiku.pm | 54 | ||||
-rw-r--r-- | haiku/Haiku/Haiku.xs | 137 | ||||
-rw-r--r-- | haiku/Haiku/Makefile.PL | 20 | ||||
-rw-r--r-- | haiku/haikuish.h | 11 | ||||
-rw-r--r-- | lib/CPANPLUS/Internals/Constants/Report.pm | 1 | ||||
-rw-r--r-- | lib/ExtUtils/CBuilder.pm | 1 | ||||
-rw-r--r-- | lib/ExtUtils/MM.pm | 1 | ||||
-rw-r--r-- | lib/Module/Build.pm | 1 | ||||
-rw-r--r-- | perl.h | 18 | ||||
-rw-r--r-- | pod/perlport.pod | 1 | ||||
-rwxr-xr-x | t/io/fs.t | 2 |
16 files changed, 319 insertions, 12 deletions
@@ -25,7 +25,7 @@ # $Id: Head.U 6 2006-08-25 22:21:46Z rmanfredi $ # -# Generated on Tue Oct 28 18:51:20 CET 2008 [metaconfig 3.5 PL0] +# Generated on Wed Oct 29 09:08:09 CET 2008 [metaconfig 3.5 PL0] # (with additional metaconfig patches by perlbug@perl.org) cat >c1$$ <<EOF @@ -8014,6 +8014,7 @@ EOM case "$lddlflags" in '') case "$osname" in beos) dflt='-nostart' ;; + haiku) dflt='-shared' ;; hpux) dflt='-b'; case "$gccversion" in '') dflt="$dflt +vnocompatwarnings" ;; @@ -8107,7 +8108,7 @@ $undef) ;; *) case "$useshrplib" in '') case "$osname" in - svr4*|nonstopux|dgux|dynixptx|esix|powerux|beos|cygwin*) + svr4*|nonstopux|dgux|dynixptx|esix|powerux|beos|haiku|cygwin*) dflt=y also='Building a shared libperl is required for dynamic loading to work on your system.' ;; @@ -8274,6 +8275,9 @@ if "$useshrplib"; then beos) # beos doesn't like the default, either. ;; + haiku) + # Haiku doesn't like the default, either. + ;; hpux*) # hpux doesn't like the default, either. tmp_shrpenv="env LDOPTS=\"+s +b${shrpdir}\"" @@ -1478,6 +1478,10 @@ h2pl/mkvars Program to make .pl from .ph files h2pl/README How to turn .ph files into .pl files h2pl/tcbreak cbreak test routine using .ph h2pl/tcbreak2 cbreak test routine using .pl +haiku/haikuish.h Header for the Haiku port +haiku/Haiku/Haiku.pm Haiku extension Perl module +haiku/Haiku/Haiku.xs Haiku extension external subroutines +haiku/Haiku/Makefile.PL Haiku extension makefile writer handy.h Handy definitions hints/3b1cc Hints for named architecture hints/3b1.sh Hints for named architecture @@ -1513,6 +1517,7 @@ hints/gnukfreebsd.sh Hints for named architecture hints/gnuknetbsd.sh Hints for named architecture hints/gnu.sh Hints for named architecture hints/greenhills.sh Hints for named architecture +hints/haiku.sh Hints for named architecture hints/hpux.sh Hints for named architecture hints/i386.sh Hints for named architecture hints/interix.sh Hints for named architecture @@ -1982,6 +1987,7 @@ lib/ExtUtils/MM_BeOS.pm MakeMaker methods for BeOS lib/ExtUtils/MM_Cygwin.pm MakeMaker methods for Cygwin lib/ExtUtils/MM_Darwin.pm MakeMaker methods for Darwin lib/ExtUtils/MM_DOS.pm MakeMaker methods for DOS +lib/ExtUtils/MM_Haiku.pm MakeMaker methods for Haiku lib/ExtUtils/MM_MacOS.pm MakeMaker methods for MacOS lib/ExtUtils/MM_NW5.pm MakeMaker methods for NetWare lib/ExtUtils/MM_OS2.pm MakeMaker methods for OS/2 @@ -3535,6 +3541,7 @@ README.dgux Perl notes for DG/UX README.dos Perl notes for DOS README.epoc Perl notes for EPOC README.freebsd Perl notes for FreeBSD +README.haiku Perl notes for Haiku README.hpux Perl notes for HP-UX README.hurd Perl notes for Hurd README.irix Perl notes for Irix diff --git a/README.haiku b/README.haiku new file mode 100644 index 0000000000..ead9144348 --- /dev/null +++ b/README.haiku @@ -0,0 +1,64 @@ +If you read this file _as_is_, just ignore the funny characters you see. +It is written in the POD format (see pod/perlpod.pod) which is specially +designed to be readable as is. + +=head1 NAME + +README.haiku - Perl version 5.10+ on Haiku + +=head1 DESCRIPTION + +This file contains instructions how to build Perl for Haiku and lists +known problems. + +=head1 BUILD AND INSTALL + +The build procedure is completely standard: + + ./Configure -de + make + make install + +Make perl executable and create a symlink for libperl: + + chmod a+x /boot/common/bin/perl + cd /boot/common/lib; ln -s perl5/5.10.0/BePC-haiku/CORE/libperl.so . + +Replace C<5.10.0> with your respective version of Perl. + +=head1 KNOWN PROBLEMS + +The following problems are encountered with Haiku revision 28311: + +=over 4 + +=item * + +Perl cannot be compiled with threading support ATM. + +=item * + +The C<ext/Socket/t/socketpair.t> test fails. More precisely: the subtests +using datagram sockets fail. Unix datagram sockets aren't implemented in +Haiku yet. + +=item * + +A subtest of the C<ext/Sys/Syslog/t/syslog.t> test fails. This is due to Haiku +not implementing C</dev/log> support yet. + +=item * + +The tests C<lib/Net/Ping/t/450_service.t> and C<lib/Net/Ping/t/510_ping_udp.t> +fail. This is due to bugs in Haiku's network stack implementation. + +=back + +=head1 CONTACT + +For Haiku specific problems contact the HaikuPorts developers: +http://ports.haiku-files.org/ + +The initial Haiku port was done by Ingo Weinhold <ingo_weinhold@gmx.de>. + +Last update: 2008-10-29 diff --git a/ext/Errno/Errno_pm.PL b/ext/Errno/Errno_pm.PL index 6f20c5e3e2..802e6386bd 100644 --- a/ext/Errno/Errno_pm.PL +++ b/ext/Errno/Errno_pm.PL @@ -155,7 +155,7 @@ sub get_files { # we might miss out on compiler-specific ones $file{"$ENV{GUSI}include:sys:errno.h"} = 1; - } elsif ($^O eq 'beos') { + } elsif ($^O eq 'beos' || $^O eq 'haiku') { # hidden in a special place $file{'/boot/develop/headers/posix/errno.h'} = 1; diff --git a/ext/Time/HiRes/t/HiRes.t b/ext/Time/HiRes/t/HiRes.t index fbb0d6d965..d967348daf 100644 --- a/ext/Time/HiRes/t/HiRes.t +++ b/ext/Time/HiRes/t/HiRes.t @@ -337,7 +337,8 @@ unless ( defined &Time::HiRes::setitimer && defined &Time::HiRes::getitimer && has_symbol('ITIMER_VIRTUAL') && $Config{sig_name} =~ m/\bVTALRM\b/ - && $^O !~ /^(nto)$/) { # nto: QNX 6 has the API but no implementation + && $^O !~ /^(nto)$/ # nto: QNX 6 has the API but no implementation + && $^O ne 'haiku') { # same for Haiku for (18..19) { print "ok $_ # Skip: no virtual interval timers\n"; } diff --git a/haiku/Haiku/Haiku.pm b/haiku/Haiku/Haiku.pm new file mode 100644 index 0000000000..2577bec496 --- /dev/null +++ b/haiku/Haiku/Haiku.pm @@ -0,0 +1,54 @@ +package Haiku; + +BEGIN { + use strict; + use vars qw|$VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK|; + + require Exporter; + require DynaLoader; + + @ISA = qw|Exporter DynaLoader|; + $VERSION = '0.34'; + $XS_VERSION = $VERSION; + $VERSION = eval $VERSION; + + @EXPORT = qw( + ); + @EXPORT_OK = qw( + ); +} + +bootstrap Haiku; + +1; + +__END__ + +=head1 NAME + +Haiku - Interfaces to some Haiku API Functions + +=head1 DESCRIPTION + +The Haiku module contains functions to access Haiku APIs. + +=head2 Alphabetical Listing of Haiku Functions + +=over + +=item Haiku::debug_printf(FORMAT,...) + +Similar to printf, but prints to system debug output. + +=item Haiku::debugger(FORMAT,...) + +Drops the program into the debugger. The printf like arguments define the +debugger message. + +=item Haiku::ktrace_printf(FORMAT,...) + +Similar to printf, but prints to a kernel tracing entry. + +=back + +=cut diff --git a/haiku/Haiku/Haiku.xs b/haiku/Haiku/Haiku.xs new file mode 100644 index 0000000000..c5a121dad1 --- /dev/null +++ b/haiku/Haiku/Haiku.xs @@ -0,0 +1,137 @@ +#define PERL_NO_GET_CONTEXT +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#include <stdarg.h> + +#include <OS.h> + +static void +haiku_do_debugger(const char* format,...) +{ + char buffer[1024]; + va_list args; + va_start(args, format); + my_vsnprintf(buffer, sizeof(buffer), format, args); + va_end(args); + + debugger(buffer); +} + +static void +haiku_do_debug_printf(pTHX_ register SV *sv, + void (*printfFunc)(const char*,...)) +{ + dVAR; + + if (!sv) + return; + if (SvTYPE(sv) == SVt_IV && SvIOK(sv)) { + assert(!SvGMAGICAL(sv)); + if (SvIsUV(sv)) + (*printfFunc)("%"UVuf, (UV)SvUVX(sv)); + else + (*printfFunc)("%"IVdf, (IV)SvIVX(sv)); + return; + } + else { + STRLEN len; + /* Do this first to trigger any overloading. */ + const char *tmps = SvPV_const(sv, len); + U8 *tmpbuf = NULL; + + if (!SvUTF8(sv)) { + /* We don't modify the original scalar. */ + tmpbuf = bytes_to_utf8((const U8*) tmps, &len); + tmps = (char *) tmpbuf; + } + + if (len) + (*printfFunc)("%.*s", (int)len, tmps); + Safefree(tmpbuf); + } +} + +XS(haiku_debug_printf) +{ + dVAR; + dXSARGS; + dORIGMARK; + SV *sv; + + if (items < 1) + Perl_croak(aTHX_ "usage: Haiku::debug_printf($format,...)"); + + sv = newSV(0); + + if (SvTAINTED(MARK[1])) + TAINT_PROPER("debug_printf"); + do_sprintf(sv, SP - MARK, MARK + 1); + + haiku_do_debug_printf(sv, &debug_printf); + + SvREFCNT_dec(sv); + SP = ORIGMARK; + PUSHs(&PL_sv_yes); +} + +XS(haiku_ktrace_printf) +{ + dVAR; + dXSARGS; + dORIGMARK; + SV *sv; + + if (items < 1) + Perl_croak(aTHX_ "usage: Haiku::debug_printf($format,...)"); + + sv = newSV(0); + + if (SvTAINTED(MARK[1])) + TAINT_PROPER("ktrace_printf"); + do_sprintf(sv, SP - MARK, MARK + 1); + + haiku_do_debug_printf(sv, &ktrace_printf); + + SvREFCNT_dec(sv); + SP = ORIGMARK; + PUSHs(&PL_sv_yes); +} + +XS(haiku_debugger) +{ + dVAR; + dXSARGS; + dORIGMARK; + SV *sv; + + if (items < 1) + Perl_croak(aTHX_ "usage: Haiku::debugger($format,...)"); + + sv = newSV(0); + + if (SvTAINTED(MARK[1])) + TAINT_PROPER("debugger"); + do_sprintf(sv, SP - MARK, MARK + 1); + + haiku_do_debug_printf(sv, &haiku_do_debugger); + + SvREFCNT_dec(sv); + SP = ORIGMARK; + PUSHs(&PL_sv_yes); +} + +MODULE = Haiku PACKAGE = Haiku + +PROTOTYPES: DISABLE + +BOOT: +{ + char *file = __FILE__; + + newXS("Haiku::debug_printf", haiku_debug_printf, file); + newXS("Haiku::ktrace_printf", haiku_ktrace_printf, file); + newXS("Haiku::debugger", haiku_debugger, file); + XSRETURN_YES; +} diff --git a/haiku/Haiku/Makefile.PL b/haiku/Haiku/Makefile.PL new file mode 100644 index 0000000000..dacf230201 --- /dev/null +++ b/haiku/Haiku/Makefile.PL @@ -0,0 +1,20 @@ +use 5.006; +use ExtUtils::MakeMaker; + +unless ($^O eq "haiku") { + die "OS unsupported\n"; +} + +#my @libs; +#push @libs, '-L/lib/w32api -lole32 -lversion' if $^O eq "cygwin"; + +WriteMakefile( + NAME => 'Haiku', + VERSION_FROM => 'Haiku.pm', +# LIBS => \@libs, + INSTALLDIRS => ($] >= 5.008004 ? 'perl' : 'site'), + NO_META => 1, + + AUTHOR => 'Ingo Weinhold <ingo_weinhold@gmx.de>', + ABSTRACT_FROM => 'Haiku.pm', +); diff --git a/haiku/haikuish.h b/haiku/haikuish.h new file mode 100644 index 0000000000..55869b4941 --- /dev/null +++ b/haiku/haikuish.h @@ -0,0 +1,11 @@ +#ifndef PERL_HAIKU_HAIKUISH_H +#define PERL_HAIKU_HAIKUISH_H + +#include "../unixish.h" + +/* We need <sys/wait.h> or else the W* macros aren't defined in perl.h. */ + +#include <sys/wait.h> + +#endif + diff --git a/lib/CPANPLUS/Internals/Constants/Report.pm b/lib/CPANPLUS/Internals/Constants/Report.pm index 027da44eb8..adde170b9b 100644 --- a/lib/CPANPLUS/Internals/Constants/Report.pm +++ b/lib/CPANPLUS/Internals/Constants/Report.pm @@ -29,6 +29,7 @@ my %OS = ( Cygwin => 'cygwin', Darwin => 'darwin', EBCDIC => 'os390|os400|posix-bc|vmesa', + Haiku => 'haiku', HPUX => 'hpux', Linux => 'linux', MSDOS => 'dos|os2|MSWin32|cygwin', diff --git a/lib/ExtUtils/CBuilder.pm b/lib/ExtUtils/CBuilder.pm index 099761c0a7..851fdaf4bf 100644 --- a/lib/ExtUtils/CBuilder.pm +++ b/lib/ExtUtils/CBuilder.pm @@ -38,6 +38,7 @@ my %OSTYPES = qw( os2 Unix gnu Unix gnukfreebsd Unix + haiku Unix dos Windows MSWin32 Windows diff --git a/lib/ExtUtils/MM.pm b/lib/ExtUtils/MM.pm index 04195ee030..fc7aac56eb 100644 --- a/lib/ExtUtils/MM.pm +++ b/lib/ExtUtils/MM.pm @@ -68,6 +68,7 @@ $Is{VOS} = $^O eq 'vos'; $Is{QNX} = $^O eq 'qnx'; $Is{AIX} = $^O eq 'aix'; $Is{Darwin} = $^O eq 'darwin'; +$Is{Haiku} = $^O eq 'haiku'; $Is{Unix} = !grep { $_ } values %Is; diff --git a/lib/Module/Build.pm b/lib/Module/Build.pm index e435c8a4a2..b0430b6b14 100644 --- a/lib/Module/Build.pm +++ b/lib/Module/Build.pm @@ -30,6 +30,7 @@ my %OSTYPES = qw( dynixptx Unix freebsd Unix linux Unix + haiku Unix hpux Unix irix Unix darwin Unix @@ -1539,15 +1539,15 @@ EXTERN_C char *crypt(const char *, const char *); # define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH) #endif -/* BeOS 5.0 seems to define S_IREAD and S_IWRITE in <posix/fcntl.h> +/* BeOS 5.0 and Haiku R1 seem to define S_IREAD and S_IWRITE in <posix/fcntl.h> * which would get included through <sys/file.h >, but that is 3000 * lines in the future. --jhi */ -#if !defined(S_IREAD) && !defined(__BEOS__) +#if !defined(S_IREAD) && !(defined(__BEOS__) || defined(__HAIKU__)) # define S_IREAD S_IRUSR #endif -#if !defined(S_IWRITE) && !defined(__BEOS__) +#if !defined(S_IWRITE) && !(defined(__BEOS__) || defined(__HAIKU__)) # define S_IWRITE S_IWUSR #endif @@ -2571,7 +2571,10 @@ typedef struct clone_params CLONE_PARAMS; # define ISHISH "macos classic" #endif -#if defined(__BEOS__) +#if defined(__HAIKU__) +# include "haiku/haikuish.h" +# define ISHISH "haiku" +#elif defined(__BEOS__) # include "beos/beosish.h" # define ISHISH "beos" #endif @@ -5690,9 +5693,10 @@ int flock(int fd, int op); #if O_TEXT != O_BINARY /* If you have different O_TEXT and O_BINARY and you are a CLRF shop, * that is, you are somehow DOSish. */ -# if defined(__BEOS__) || defined(__VOS__) || defined(__CYGWIN__) - /* BeOS has O_TEXT != O_BINARY but O_TEXT and O_BINARY have no effect; - * BeOS is always UNIXoid (LF), not DOSish (CRLF). */ +# if defined(__BEOS__) || defined(__HAIKU__) || defined(__VOS__) || \ + defined(__CYGWIN__) + /* BeOS/Haiku has O_TEXT != O_BINARY but O_TEXT and O_BINARY have no effect; + * BeOS/Haiku is always UNIXoid (LF), not DOSish (CRLF). */ /* VOS has O_TEXT != O_BINARY, and they have effect, * but VOS always uses LF, never CRLF. */ /* If you have O_TEXT different from your O_BINARY but you still are diff --git a/pod/perlport.pod b/pod/perlport.pod index f8fb1fea0e..35635a0468 100644 --- a/pod/perlport.pod +++ b/pod/perlport.pod @@ -815,6 +815,7 @@ are a few of the more popular Unix flavors: dgux dgux AViiON-dgux DYNIX/ptx dynixptx i386-dynixptx FreeBSD freebsd freebsd-i386 + Haiku haiku BePC-haiku Linux linux arm-linux Linux linux i386-linux Linux linux i586-linux @@ -281,7 +281,7 @@ sub check_utime_result { is( $atime, 500000001, 'atime' ); is( $mtime, 500000000 + $delta, 'mtime' ); } - elsif ($^O eq 'beos') { + elsif ($^O eq 'beos' || $^O eq 'haiku') { SKIP: { skip "atime not updated", 1; } |