From 64fc597de292228b244a3ab18a33bcd8488e09d6 Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Mon, 15 Sep 2008 17:53:28 -0400 Subject: ENH: add initial support for HAIKU OS from bug# 7425 --- Modules/CMakeFortranCompilerId.F90.in | 4 ++++ Modules/CMakePlatformId.h.in | 6 ++++++ Modules/CheckForPthreads.c | 2 +- Modules/Platform/Haiku.cmake | 14 ++++++++++++++ Source/CTest/cmCTestTestHandler.cxx | 10 ++++++++++ Source/cmCTest.cxx | 9 +++++++-- Source/cmDependsJavaLexer.cxx | 2 +- Source/cmDependsJavaLexer.h | 2 +- Source/cmSystemTools.cxx | 5 ++++- Source/kwsys/DynamicLoader.cxx | 14 ++++++++++++-- Source/kwsys/ProcessUNIX.c | 2 +- Source/kwsys/SystemTools.cxx | 7 ++++++- Source/kwsys/testDynamicLoader.cxx | 6 +++++- Source/kwsys/testProcess.c | 2 +- Utilities/cmcurl/CMake/CurlTests.c | 2 +- Utilities/cmcurl/CMakeLists.txt | 2 ++ Utilities/cmcurl/curl/curl.h | 2 +- Utilities/cmzlib/zconf.h | 2 +- Utilities/cmzlib/zutil.h | 8 +++++++- bootstrap | 12 ++++++++++++ 20 files changed, 97 insertions(+), 16 deletions(-) create mode 100644 Modules/Platform/Haiku.cmake diff --git a/Modules/CMakeFortranCompilerId.F90.in b/Modules/CMakeFortranCompilerId.F90.in index 0949b50..c7facb5 100644 --- a/Modules/CMakeFortranCompilerId.F90.in +++ b/Modules/CMakeFortranCompilerId.F90.in @@ -50,6 +50,10 @@ PROGRAM CMakeFortranCompilerId PRINT *, 'INFO:platform[IRIX]' #elif defined(__hpux) || defined(__hpux__) PRINT *, 'INFO:platform[HP-UX]' +#elif defined(__HAIKU) || defined(__HAIKU__) || defined(_HAIKU) + PRINT *, 'INFO:platform[Haiku]' +! Haiku also defines __BEOS__ so we must +! put it prior to the check for __BEOS__ #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) PRINT *, 'INFO:platform[BeOS]' #elif defined(__QNX__) || defined(__QNXNTO__) diff --git a/Modules/CMakePlatformId.h.in b/Modules/CMakePlatformId.h.in index 1f1fca6..8e786ba 100644 --- a/Modules/CMakePlatformId.h.in +++ b/Modules/CMakePlatformId.h.in @@ -35,6 +35,12 @@ #elif defined(__hpux) || defined(__hpux__) # define PLATFORM_ID "HP-UX" +#elif defined(__HAIKU) || defined(__HAIKU__) || defined(_HAIKU) +# define PLATFORM_ID "Haiku" +/* Haiku also defines __BEOS__ so we must + put it prior to the check for __BEOS__ +*/ + #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) # define PLATFORM_ID "BeOS" diff --git a/Modules/CheckForPthreads.c b/Modules/CheckForPthreads.c index a846567..d831078 100644 --- a/Modules/CheckForPthreads.c +++ b/Modules/CheckForPthreads.c @@ -16,7 +16,7 @@ int main(int ac, char*av[]){ pthread_create(&tid[0], 0, runner, (void*)1); pthread_create(&tid[1], 0, runner, (void*)2); -#if defined(__BEOS__) && !defined(__ZETA__) // (no usleep on BeOS 5.) +#if defined(__BEOS__) && !defined(__ZETA__) && !defined(__HAIKU__) // (no usleep on BeOS 5.) usleep(1); // for strange behavior on single-processor sun #endif diff --git a/Modules/Platform/Haiku.cmake b/Modules/Platform/Haiku.cmake new file mode 100644 index 0000000..b3c2ea3 --- /dev/null +++ b/Modules/Platform/Haiku.cmake @@ -0,0 +1,14 @@ +SET(BEOS 1) + +# GCC is the default compiler on Haiku. +INCLUDE(${CMAKE_ROOT}/Modules/Platform/gcc.cmake) + +SET(CMAKE_DL_LIBS root be) +SET(CMAKE_SHARED_LIBRARY_C_FLAGS "-fPIC") +SET(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-nostart") +SET(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,") +SET(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG_SEP ":") +SET(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-soname,") +SET(CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG "-Wl,-soname,") + +INCLUDE(Platform/UnixPaths) diff --git a/Source/CTest/cmCTestTestHandler.cxx b/Source/CTest/cmCTestTestHandler.cxx index 90a33cb..83d882b 100644 --- a/Source/CTest/cmCTestTestHandler.cxx +++ b/Source/CTest/cmCTestTestHandler.cxx @@ -1052,7 +1052,17 @@ bool cmCTestTestHandler::GetValue(const char* tag, bool ret = true; if(line == tag) { +#ifdef __HAIKU__ + int tmp = 0; + fin >> tmp; + value = false; + if(tmp) + { + value = true; + } +#else fin >> value; +#endif ret = cmSystemTools::GetLineFromStream(fin, line); // read blank line } else diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx index 77bf102..012571f 100644 --- a/Source/cmCTest.cxx +++ b/Source/cmCTest.cxx @@ -49,10 +49,15 @@ #include // auto_ptr -#if defined(__BEOS__) +#if defined(__BEOS__) && !defined(__HAIKU__) #include /* disable_debugger() API. */ #endif +#if defined(__HAIKU__) +#include /* disable_debugger() API. */ +#endif + + #define DEBUGOUT std::cout << __LINE__ << " "; std::cout #define DEBUGERR std::cerr << __LINE__ << " "; std::cerr @@ -610,7 +615,7 @@ void cmCTest::BlockTestErrorDiagnostics() cmSystemTools::PutEnv("DASHBOARD_TEST_FROM_CTEST=" CMake_VERSION); #if defined(_WIN32) SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); -#elif defined(__BEOS__) +#elif defined(__BEOS__) || defined(__HAIKU__) disable_debugger(1); #endif } diff --git a/Source/cmDependsJavaLexer.cxx b/Source/cmDependsJavaLexer.cxx index 3af688a..1a5907f 100644 --- a/Source/cmDependsJavaLexer.cxx +++ b/Source/cmDependsJavaLexer.cxx @@ -23,7 +23,7 @@ #include #include -#if defined(__BEOS__) +#if defined(__BEOS__) || defined (__HAIKU__) #include /* prevents a conflict with a #define later on... */ #endif diff --git a/Source/cmDependsJavaLexer.h b/Source/cmDependsJavaLexer.h index 78ee089..df7cffd 100644 --- a/Source/cmDependsJavaLexer.h +++ b/Source/cmDependsJavaLexer.h @@ -38,7 +38,7 @@ #include #include -#if defined(__BEOS__) +#if defined(__BEOS__) || defined(__HAIKU__) #include /* prevents a conflict with a #define later on... */ #endif diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 1d2a0cf..298d779 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -932,6 +932,7 @@ bool RunCommandViaPopen(const char* command, cmSystemTools::Stdout(buffer); } output += buffer; + buffer[0] = 0; fgets(buffer, BUFFER_SIZE, cpipe); } @@ -971,11 +972,13 @@ bool RunCommandViaPopen(const char* command, error << "SIGFPE"; break; #endif +#ifndef __HAIKU__ #ifdef SIGBUS case SIGBUS: error << "SIGBUS"; break; #endif +#endif #ifdef SIGSEGV case SIGSEGV: error << "SIGSEGV"; @@ -1698,7 +1701,7 @@ int cmSystemToolsGZStructOpen(void* call_data, const char *pathname, } // no fchmod on BeOS 5...do pathname instead. -#if defined(__BEOS__) && !defined(__ZETA__) +#if defined(__BEOS__) && !defined(__ZETA__) && !defined(__HAIKU__) if ((oflags & O_CREAT) && chmod(pathname, mode)) { return -1; diff --git a/Source/kwsys/DynamicLoader.cxx b/Source/kwsys/DynamicLoader.cxx index 1fdcaf0..9ca9146 100644 --- a/Source/kwsys/DynamicLoader.cxx +++ b/Source/kwsys/DynamicLoader.cxx @@ -335,11 +335,21 @@ const char* DynamicLoader::LastError() #endif //_WIN32 // --------------------------------------------------------------- -// 4. Implementation for BeOS -#ifdef __BEOS__ +// 4. Implementation for BeOS / Haiku +#if defined __BEOS__ || defined(__HAIKU__) + #include // for strerror() + +#ifdef __BEOS__ #include #include +#endif + +#ifdef __HAIKU__ +#include +#include +#endif + #define DYNAMICLOADER_DEFINED 1 namespace KWSYS_NAMESPACE diff --git a/Source/kwsys/ProcessUNIX.c b/Source/kwsys/ProcessUNIX.c index 515bceb..32b4d9e 100644 --- a/Source/kwsys/ProcessUNIX.c +++ b/Source/kwsys/ProcessUNIX.c @@ -75,7 +75,7 @@ typedef ssize_t kwsysProcess_ssize_t; typedef int kwsysProcess_ssize_t; #endif -#if defined(__BEOS__) && !defined(__ZETA__) +#if defined(__BEOS__) && !defined(__ZETA__) /* BeOS 5 doesn't have usleep(), but it has snooze(), which is identical. */ # include static inline void kwsysProcess_usleep(unsigned int msec) diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx index 1277d71..d4a8174 100644 --- a/Source/kwsys/SystemTools.cxx +++ b/Source/kwsys/SystemTools.cxx @@ -131,7 +131,12 @@ public: #define _chdir chdir #endif -#if defined(__BEOS__) && !defined(__ZETA__) +#if defined(__HAIKU__) +#include +#include +#endif + +#if defined(__BEOS__) && !defined(__ZETA__) && !defined(__HAIKU__) #include #include diff --git a/Source/kwsys/testDynamicLoader.cxx b/Source/kwsys/testDynamicLoader.cxx index 9021239..e2ab12a 100644 --- a/Source/kwsys/testDynamicLoader.cxx +++ b/Source/kwsys/testDynamicLoader.cxx @@ -17,10 +17,14 @@ #include KWSYS_HEADER(ios/iostream) #include KWSYS_HEADER(stl/string) -#if defined(__BEOS__) +#if defined(__BEOS__) && !defined(__HAIKU__) #include /* disable_debugger() API. */ #endif +#if defined(__HAIKU__) +#include /* disable_debugger() API. */ +#endif + // Work-around CMake dependency scanning limitation. This must // duplicate the above list of headers. #if 0 diff --git a/Source/kwsys/testProcess.c b/Source/kwsys/testProcess.c index 8ca56ed..9002035 100644 --- a/Source/kwsys/testProcess.c +++ b/Source/kwsys/testProcess.c @@ -34,7 +34,7 @@ # pragma warn -8060 /* possibly incorrect assignment */ #endif -#if defined(__BEOS__) && !defined(__ZETA__) +#if defined(__BEOS__) && !defined(__ZETA__) && !defined(__HAIKU__) /* BeOS 5 doesn't have usleep(), but it has snooze(), which is identical. */ # include static inline void testProcess_usleep(unsigned int msec) diff --git a/Utilities/cmcurl/CMake/CurlTests.c b/Utilities/cmcurl/CMake/CurlTests.c index c5ba7c2..d74a4f0 100644 --- a/Utilities/cmcurl/CMake/CurlTests.c +++ b/Utilities/cmcurl/CMake/CurlTests.c @@ -38,7 +38,7 @@ main () # define PLATFORM_AIX_V3 #endif -#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__) +#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || (defined(__BEOS__) && !defined(__HAIKU__)) #error "O_NONBLOCK does not work on this platform" #endif int socket; diff --git a/Utilities/cmcurl/CMakeLists.txt b/Utilities/cmcurl/CMakeLists.txt index d2f319d..bd5ddfb 100644 --- a/Utilities/cmcurl/CMakeLists.txt +++ b/Utilities/cmcurl/CMakeLists.txt @@ -165,6 +165,8 @@ IF(BEOS) CHECK_LIBRARY_EXISTS_CONCAT("bnetapi" closesocket HAVE_LIBBNETAPI) ENDIF(BEOS) +CHECK_LIBRARY_EXISTS_CONCAT("network" recv HAVE_LIBNETWORK) + IF(NOT NOT_NEED_LIBNSL) CHECK_LIBRARY_EXISTS_CONCAT("nsl" gethostbyname HAVE_LIBNSL) ENDIF(NOT NOT_NEED_LIBNSL) diff --git a/Utilities/cmcurl/curl/curl.h b/Utilities/cmcurl/curl/curl.h index f6dad45..157c634 100644 --- a/Utilities/cmcurl/curl/curl.h +++ b/Utilities/cmcurl/curl/curl.h @@ -1133,7 +1133,7 @@ typedef enum { } #endif -#ifdef __BEOS__ +#if defined __BEOS__ || defined __HAIKU__ #include #endif diff --git a/Utilities/cmzlib/zconf.h b/Utilities/cmzlib/zconf.h index 7a3b6fd..6eb52d1 100644 --- a/Utilities/cmzlib/zconf.h +++ b/Utilities/cmzlib/zconf.h @@ -237,7 +237,7 @@ # endif #endif -#if defined (__BEOS__) +#if defined (__BEOS__) && !defined (__HAIKU__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) diff --git a/Utilities/cmzlib/zutil.h b/Utilities/cmzlib/zutil.h index b7d5eff..74ef1f8 100644 --- a/Utilities/cmzlib/zutil.h +++ b/Utilities/cmzlib/zutil.h @@ -147,7 +147,13 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define OS_CODE 0x0f #endif -#if defined(_BEOS_) || defined(RISCOS) +/* Haiku defines both __HAIKU__ and __BEOS__ (for now) */ +/* many BeOS workarounds are no longer needed in Haiku */ +#if defined(__HAIKU__) && defined(__BEOS__) +#undef __BEOS__ +#endif + +#if defined(_BEOS_) || defined(RISCOS) # define fdopen(fd,mode) NULL /* No fdopen() */ #endif diff --git a/bootstrap b/bootstrap index 1dd0a65..3008d07 100755 --- a/bootstrap +++ b/bootstrap @@ -73,6 +73,13 @@ else cmake_system_beos=false fi +# Determine whether this is Haiku +if echo "${cmake_system}" | grep Haiku >/dev/null 2>&1; then + cmake_system_haiku=true +else + cmake_system_haiku=false +fi + # Choose the generator to use for bootstrapping. if ${cmake_system_mingw}; then # Bootstrapping from an MSYS prompt. @@ -603,6 +610,11 @@ if ${cmake_system_beos}; then cmake_ld_flags="${LDFLAGS} -lroot -lbe" fi +# Add Haiku toolkits... +if ${cmake_system_haiku}; then + cmake_ld_flags="${LDFLAGS} -lroot -lbe" +fi + # Test C compiler cmake_c_compiler= -- cgit v0.12