summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIngo Weinhold <ingo_weinhold@gmx.de>2008-10-29 03:25:44 +0100
committerH.Merijn Brand <h.m.brand@xs4all.nl>2008-10-29 08:09:06 +0000
commitdf00ff3beeb297b9622f8acbed9c80d320c87580 (patch)
tree271bdce6a5b597e9fc3291185f707887c806e9cb
parent85fbaab29c398adbb5b4445d3ed41e0a96364ce4 (diff)
downloadperl-df00ff3beeb297b9622f8acbed9c80d320c87580.tar.gz
Haiku Port
Message-Id: <20081029022544.413.1@knochen-vm.localdomain> p4raw-id: //depot/perl@34630
-rwxr-xr-xConfigure8
-rw-r--r--MANIFEST7
-rw-r--r--README.haiku64
-rw-r--r--ext/Errno/Errno_pm.PL2
-rw-r--r--ext/Time/HiRes/t/HiRes.t3
-rw-r--r--haiku/Haiku/Haiku.pm54
-rw-r--r--haiku/Haiku/Haiku.xs137
-rw-r--r--haiku/Haiku/Makefile.PL20
-rw-r--r--haiku/haikuish.h11
-rw-r--r--lib/CPANPLUS/Internals/Constants/Report.pm1
-rw-r--r--lib/ExtUtils/CBuilder.pm1
-rw-r--r--lib/ExtUtils/MM.pm1
-rw-r--r--lib/Module/Build.pm1
-rw-r--r--perl.h18
-rw-r--r--pod/perlport.pod1
-rwxr-xr-xt/io/fs.t2
16 files changed, 319 insertions, 12 deletions
diff --git a/Configure b/Configure
index dc27345002..aa005d5095 100755
--- a/Configure
+++ b/Configure
@@ -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}\""
diff --git a/MANIFEST b/MANIFEST
index 71715c4ecb..224474c030 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -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
diff --git a/perl.h b/perl.h
index 39414e729f..a3272bc78e 100644
--- a/perl.h
+++ b/perl.h
@@ -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
diff --git a/t/io/fs.t b/t/io/fs.t
index cd8bd557d9..8c45c8d9f4 100755
--- a/t/io/fs.t
+++ b/t/io/fs.t
@@ -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;
}