ENH: merge in changes for beos support

This commit is contained in:
Bill Hoffman 2006-12-04 17:26:41 -05:00
parent de8ffcaef4
commit 3a32cec969
21 changed files with 247 additions and 13 deletions

View File

@ -59,6 +59,14 @@ IF(${CMAKE_GENERATOR} MATCHES "Visual Studio")
SET(CMAKE_COMPILER_IS_GNUCXX_RUN 1) SET(CMAKE_COMPILER_IS_GNUCXX_RUN 1)
ENDIF(${CMAKE_GENERATOR} MATCHES "Visual Studio") ENDIF(${CMAKE_GENERATOR} MATCHES "Visual Studio")
# The g++ that comes with BeOS 5 segfaults if you run "g++ -E"
# ("gcc -E" is fine), which throws up a system dialog box that hangs cmake
# until the user clicks "OK"...so for now, we just assume it's g++.
IF(BEOS)
SET(CMAKE_COMPILER_IS_GNUCXX 1)
SET(CMAKE_COMPILER_IS_GNUCXX_RUN 1)
ENDIF(BEOS)
IF(NOT CMAKE_COMPILER_IS_GNUCXX_RUN) IF(NOT CMAKE_COMPILER_IS_GNUCXX_RUN)
# test to see if the cxx compiler is gnu # test to see if the cxx compiler is gnu
SET(CMAKE_COMPILER_IS_GNUCXX_RUN 1) SET(CMAKE_COMPILER_IS_GNUCXX_RUN 1)

View File

@ -16,7 +16,10 @@ int main(int ac, char*av[]){
pthread_create(&tid[0], 0, runner, (void*)1); pthread_create(&tid[0], 0, runner, (void*)1);
pthread_create(&tid[1], 0, runner, (void*)2); pthread_create(&tid[1], 0, runner, (void*)2);
#if defined(__BEOS__) && !defined(__ZETA__) // (no usleep on BeOS 5.)
usleep(1); // for strange behavior on single-processor sun usleep(1); // for strange behavior on single-processor sun
#endif
pthread_join(tid[0], 0); pthread_join(tid[0], 0);
pthread_join(tid[1], 0); pthread_join(tid[1], 0);
if(ac > 1000){return *av[0];} if(ac > 1000){return *av[0];}

View File

@ -48,6 +48,10 @@
#include <memory> // auto_ptr #include <memory> // auto_ptr
#if defined(__BEOS__)
#include <be/kernel/OS.h> /* disable_debugger() API. */
#endif
#define DEBUGOUT std::cout << __LINE__ << " "; std::cout #define DEBUGOUT std::cout << __LINE__ << " "; std::cout
#define DEBUGERR std::cerr << __LINE__ << " "; std::cerr #define DEBUGERR std::cerr << __LINE__ << " "; std::cerr
@ -589,6 +593,8 @@ void cmCTest::BlockTestErrorDiagnostics()
cmSystemTools::PutEnv("DASHBOARD_TEST_FROM_CTEST=" CMake_VERSION); cmSystemTools::PutEnv("DASHBOARD_TEST_FROM_CTEST=" CMake_VERSION);
#if defined(_WIN32) #if defined(_WIN32)
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
#elif defined(__BEOS__)
disable_debugger(1);
#endif #endif
} }

View File

@ -23,6 +23,10 @@
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#if defined(__BEOS__)
#include <unistd.h> /* prevents a conflict with a #define later on... */
#endif
/* end standard C headers. */ /* end standard C headers. */
/* flex integer type definitions */ /* flex integer type definitions */

View File

@ -22,6 +22,10 @@
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#if defined(__BEOS__)
#include <unistd.h> /* prevents a conflict with a #define later on... */
#endif
/* end standard C headers. */ /* end standard C headers. */
/* flex integer type definitions */ /* flex integer type definitions */

View File

@ -1946,6 +1946,9 @@ void cmMakefile::AddDefaultDefinitions()
#if defined(__QNXNTO__) #if defined(__QNXNTO__)
this->AddDefinition("QNXNTO", "1"); this->AddDefinition("QNXNTO", "1");
#endif #endif
#if defined(__BEOS__)
this->AddDefinition("BEOS", "1");
#endif
char temp[1024]; char temp[1024];
sprintf(temp, "%d", cmVersion::GetMinorVersion()); sprintf(temp, "%d", cmVersion::GetMinorVersion());

View File

@ -1432,7 +1432,12 @@ int cmSystemToolsGZStructOpen(void* call_data, const char *pathname,
return -1; return -1;
} }
#if !defined(_WIN32) || defined(__CYGWIN__) #if defined(__BEOS__) && !defined(__ZETA__) // no fchmod on BeOS 5...do pathname instead.
if ((oflags & O_CREAT) && chmod(pathname, mode))
{
return -1;
}
#elif !defined(_WIN32) || defined(__CYGWIN__)
if ((oflags & O_CREAT) && fchmod(fd, mode)) if ((oflags & O_CREAT) && fchmod(fd, mode))
{ {
return -1; return -1;

View File

@ -319,7 +319,112 @@ const char* DynamicLoader::LastError()
#endif //_WIN32 #endif //_WIN32
// --------------------------------------------------------------- // ---------------------------------------------------------------
// 4. Implementation for default UNIX machines. // 4. Implementation for BeOS
#ifdef __BEOS__
#include <string.h> // for strerror()
#include <be/kernel/image.h>
#include <be/support/Errors.h>
#define DYNAMICLOADER_DEFINED 1
namespace KWSYS_NAMESPACE
{
static image_id last_dynamic_err = B_OK;
//----------------------------------------------------------------------------
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(const char* libname )
{
// image_id's are integers, errors are negative. Add one just in case we
// get a valid image_id of zero (is that even possible?).
image_id rc = load_add_on(libname);
if (rc < 0)
{
last_dynamic_err = rc;
return 0;
}
return rc+1;
}
//----------------------------------------------------------------------------
int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
{
if (!lib)
{
last_dynamic_err = B_BAD_VALUE;
return 0;
}
else
{
// The function dlclose() returns 0 on success, and non-zero on error.
status_t rc = unload_add_on(lib-1);
if (rc != B_OK)
{
last_dynamic_err = rc;
return 0;
}
}
return 1;
}
//----------------------------------------------------------------------------
DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
DynamicLoader::LibraryHandle lib, const char* sym)
{
// Hack to cast pointer-to-data to pointer-to-function.
union
{
void* pvoid;
DynamicLoader::SymbolPointer psym;
} result;
result.psym = NULL;
if (!lib)
{
last_dynamic_err = B_BAD_VALUE;
}
else
{
// !!! FIXME: BeOS can do function-only lookups...does this ever
// !!! FIXME: actually _want_ a data symbol lookup, or was this union
// !!! FIXME: a leftover of dlsym()? (s/ANY/TEXT for functions only).
status_t rc = get_image_symbol(lib-1,sym,B_SYMBOL_TYPE_ANY,&result.pvoid);
if (rc != B_OK)
{
last_dynamic_err = rc;
result.psym = NULL;
}
}
return result.psym;
}
//----------------------------------------------------------------------------
const char* DynamicLoader::LibPrefix()
{
return "lib";
}
//----------------------------------------------------------------------------
const char* DynamicLoader::LibExtension()
{
return ".so";
}
//----------------------------------------------------------------------------
const char* DynamicLoader::LastError()
{
const char *retval = strerror(last_dynamic_err);
last_dynamic_err = B_OK;
return retval;
}
} // namespace KWSYS_NAMESPACE
#endif
// ---------------------------------------------------------------
// 5. Implementation for default UNIX machines.
// if nothing has been defined then use this // if nothing has been defined then use this
#ifndef DYNAMICLOADER_DEFINED #ifndef DYNAMICLOADER_DEFINED
#define DYNAMICLOADER_DEFINED 1 #define DYNAMICLOADER_DEFINED 1

View File

@ -25,6 +25,8 @@
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1030 #if MAC_OS_X_VERSION_MAX_ALLOWED < 1030
#include <mach-o/dyld.h> #include <mach-o/dyld.h>
#endif #endif
#elif defined(__BEOS__)
#include <be/kernel/image.h>
#endif #endif
namespace @KWSYS_NAMESPACE@ namespace @KWSYS_NAMESPACE@
@ -62,6 +64,8 @@ public:
#else #else
typedef void* LibraryHandle; typedef void* LibraryHandle;
#endif #endif
#elif defined(__BEOS__)
typedef image_id LibraryHandle;
#else #else
typedef void* LibraryHandle; typedef void* LibraryHandle;
#endif #endif

View File

@ -108,6 +108,34 @@ public:
#define _chdir chdir #define _chdir chdir
#endif #endif
#if defined(__BEOS__) && !defined(__ZETA__)
#include <be/kernel/OS.h>
#include <be/storage/Path.h>
// BeOS 5 doesn't have usleep(), but it has snooze(), which is identical.
static inline void usleep(unsigned int msec)
{
::snooze(msec);
}
// BeOS 5 also doesn't have realpath(), but its C++ API offers something close.
static inline char *realpath(const char *path, char *resolved_path)
{
const size_t maxlen = KWSYS_SYSTEMTOOLS_MAXPATH;
snprintf(resolved_path, maxlen, "%s", path);
BPath normalized(resolved_path, NULL, true);
const char *resolved = normalized.Path();
if (resolved != NULL) // NULL == No such file.
{
if (snprintf(resolved_path, maxlen, "%s", resolved) < maxlen)
{
return resolved_path;
}
}
return NULL; // something went wrong.
}
#endif
#if defined(_WIN32) && (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__) || defined(__MINGW32__)) #if defined(_WIN32) && (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__) || defined(__MINGW32__))
inline int Mkdir(const char* dir) inline int Mkdir(const char* dir)
{ {
@ -291,7 +319,9 @@ void SystemTools::GetPath(kwsys_stl::vector<kwsys_stl::string>& path, const char
kwsys_stl::string::size_type endpos = pathEnv.find(pathSep, start); kwsys_stl::string::size_type endpos = pathEnv.find(pathSep, start);
if(endpos != kwsys_stl::string::npos) if(endpos != kwsys_stl::string::npos)
{ {
path.push_back(pathEnv.substr(start, endpos-start)); kwsys_stl::string convertedPath;
Realpath(pathEnv.substr(start, endpos-start).c_str(), convertedPath);
path.push_back(convertedPath);
start = endpos+1; start = endpos+1;
} }
else else

View File

@ -17,6 +17,10 @@
#include KWSYS_HEADER(ios/iostream) #include KWSYS_HEADER(ios/iostream)
#include KWSYS_HEADER(stl/string) #include KWSYS_HEADER(stl/string)
#if defined(__BEOS__)
#include <be/kernel/OS.h> /* disable_debugger() API. */
#endif
// Work-around CMake dependency scanning limitation. This must // Work-around CMake dependency scanning limitation. This must
// duplicate the above list of headers. // duplicate the above list of headers.
#if 0 #if 0
@ -88,6 +92,8 @@ int main(int argc, char *argv[])
{ {
#if defined(_WIN32) #if defined(_WIN32)
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
#elif defined(__BEOS__)
disable_debugger(1);
#endif #endif
int res; int res;
if( argc == 3 ) if( argc == 3 )

View File

@ -46,7 +46,9 @@ ADD_LIBRARY(CMakeTestModule MODULE moduleFile.c)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS")
ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c) ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c)
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR) SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR)
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES LINK_FLAGS "-lm") IF(NOT BEOS) # No libm on BeOS.
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES LINK_FLAGS "-lm")
ENDIF(NOT BEOS)
GET_TARGET_PROPERTY(FOO_BAR_VAR CMakeTestCLibraryShared FOO) GET_TARGET_PROPERTY(FOO_BAR_VAR CMakeTestCLibraryShared FOO)
IF(${FOO_BAR_VAR} MATCHES "BAR") IF(${FOO_BAR_VAR} MATCHES "BAR")
ELSE(${FOO_BAR_VAR} MATCHES "BAR") ELSE(${FOO_BAR_VAR} MATCHES "BAR")

View File

@ -46,7 +46,9 @@ ADD_LIBRARY(CMakeTestModule MODULE moduleFile.c)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS")
ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c) ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c)
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR) SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR)
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES LINK_FLAGS "-lm") IF(NOT BEOS) # No libm on BeOS.
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES LINK_FLAGS "-lm")
ENDIF(NOT BEOS)
GET_TARGET_PROPERTY(FOO_BAR_VAR CMakeTestCLibraryShared FOO) GET_TARGET_PROPERTY(FOO_BAR_VAR CMakeTestCLibraryShared FOO)
IF(${FOO_BAR_VAR} MATCHES "BAR") IF(${FOO_BAR_VAR} MATCHES "BAR")
ELSE(${FOO_BAR_VAR} MATCHES "BAR") ELSE(${FOO_BAR_VAR} MATCHES "BAR")

View File

@ -46,7 +46,9 @@ ADD_LIBRARY(CMakeTestModule MODULE moduleFile.c)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS")
ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c) ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c)
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR) SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR)
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES LINK_FLAGS "-lm") IF(NOT BEOS) # No libm on BeOS.
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES LINK_FLAGS "-lm")
ENDIF(NOT BEOS)
GET_TARGET_PROPERTY(FOO_BAR_VAR CMakeTestCLibraryShared FOO) GET_TARGET_PROPERTY(FOO_BAR_VAR CMakeTestCLibraryShared FOO)
IF(${FOO_BAR_VAR} MATCHES "BAR") IF(${FOO_BAR_VAR} MATCHES "BAR")
ELSE(${FOO_BAR_VAR} MATCHES "BAR") ELSE(${FOO_BAR_VAR} MATCHES "BAR")

View File

@ -135,6 +135,13 @@ CHECK_LIBRARY_EXISTS_CONCAT("ucb" gethostname HAVE_LIBUCB)
CHECK_LIBRARY_EXISTS_CONCAT("socket" connect HAVE_LIBSOCKET) CHECK_LIBRARY_EXISTS_CONCAT("socket" connect HAVE_LIBSOCKET)
CHECK_LIBRARY_EXISTS("c" gethostbyname "" NOT_NEED_LIBNSL) CHECK_LIBRARY_EXISTS("c" gethostbyname "" NOT_NEED_LIBNSL)
# Yellowtab Zeta needs different libraries than BeOS 5.
IF(BEOS)
SET(NOT_NEED_LIBNSL 1)
CHECK_LIBRARY_EXISTS_CONCAT("bind" gethostbyname HAVE_LIBBIND)
CHECK_LIBRARY_EXISTS_CONCAT("bnetapi" closesocket HAVE_LIBBNETAPI)
ENDIF(BEOS)
IF(NOT NOT_NEED_LIBNSL) IF(NOT NOT_NEED_LIBNSL)
CHECK_LIBRARY_EXISTS_CONCAT("nsl" gethostbyname HAVE_LIBNSL) CHECK_LIBRARY_EXISTS_CONCAT("nsl" gethostbyname HAVE_LIBNSL)
ENDIF(NOT NOT_NEED_LIBNSL) ENDIF(NOT NOT_NEED_LIBNSL)

View File

@ -197,11 +197,13 @@ void
th_set_mode(TAR *t, mode_t fmode) th_set_mode(TAR *t, mode_t fmode)
{ {
#ifndef WIN32 #ifndef WIN32
#ifndef __BEOS__
if (S_ISSOCK(fmode)) if (S_ISSOCK(fmode))
{ {
fmode &= ~S_IFSOCK; fmode &= ~S_IFSOCK;
fmode |= S_IFIFO; fmode |= S_IFIFO;
} }
#endif
#endif #endif
/* Looks like on windows the st_mode is longer than 8 characters. */ /* Looks like on windows the st_mode is longer than 8 characters. */
int_to_oct(fmode & 07777777, (t)->th_buf.mode, 8); int_to_oct(fmode & 07777777, (t)->th_buf.mode, 8);

View File

@ -116,7 +116,7 @@ tar_set_file_perms(TAR *t, char *realname)
return -1; return -1;
} }
/* change permissions */ /* change permissions */
if (!TH_ISSYM(t) && chmod(filename, mode) == -1) if (!TH_ISSYM(t) && chmod(filename, mode & 07777) == -1)
{ {
#ifdef DEBUG #ifdef DEBUG
perror("chmod()"); perror("chmod()");
@ -718,6 +718,7 @@ tar_extract_dir(TAR *t, char *realname)
char *filename; char *filename;
char buf[T_BLOCKSIZE]; char buf[T_BLOCKSIZE];
char *pathname = 0; char *pathname = 0;
size_t len = 0;
if (!TH_ISDIR(t)) if (!TH_ISDIR(t))
{ {
@ -750,14 +751,23 @@ tar_extract_dir(TAR *t, char *realname)
return -1; return -1;
} }
/* Strip trailing '/'...it confuses some Unixes (and BeOS)... */
strncpy(buf, filename, sizeof(buf)-1);
buf[sizeof(buf)-1] = 0;
len = strlen(buf);
if ((len > 0) && (buf[len-1] == '/'))
{
buf[len-1] = '\0';
}
#ifdef DEBUG #ifdef DEBUG
printf(" ==> extracting: %s (mode %04o, directory)\n", filename, printf(" ==> extracting: %s (mode %04o, directory)\n", filename,
mode); mode);
#endif #endif
#ifdef WIN32 #ifdef WIN32
if (mkdir(filename) == -1) if (mkdir(buf) == -1)
#else #else
if (mkdir(filename, mode) == -1) if (mkdir(buf, mode & 07777) == -1)
#endif #endif
{ {
#ifdef __BORLANDC__ #ifdef __BORLANDC__
@ -772,7 +782,7 @@ tar_extract_dir(TAR *t, char *realname)
#endif #endif
if (errno == EEXIST) if (errno == EEXIST)
{ {
if (chmod(filename, mode) == -1) if (chmod(filename, mode & 07777) == -1)
{ {
#ifdef DEBUG #ifdef DEBUG
perror("chmod()"); perror("chmod()");
@ -860,7 +870,7 @@ tar_extract_fifo(TAR *t, char *realname)
printf(" ==> extracting: %s (fifo)\n", filename); printf(" ==> extracting: %s (fifo)\n", filename);
#endif #endif
#ifndef WIN32 #ifndef WIN32
if (mkfifo(filename, mode) == -1) if (mkfifo(filename, mode & 07777) == -1)
#else #else
(void)mode; (void)mode;
#endif #endif

View File

@ -99,8 +99,13 @@ static int libtar_gzopen(void* call_data, const char *pathname,
return -1; return -1;
} }
#if !defined(_WIN32) || defined(__CYGWIN__) #if defined(__BEOS__) && !defined(__ZETA__) // no fchmod on BeOS...do pathname instead.
if ((oflags & O_CREAT) && fchmod(fd, mode)) if ((oflags & O_CREAT) && chmod(pathname, mode & 07777))
{
return -1;
}
#elif !defined(_WIN32) || defined(__CYGWIN__)
if ((oflags & O_CREAT) && fchmod(fd, mode & 07777))
{ {
return -1; return -1;
} }

View File

@ -100,6 +100,13 @@ mkdirhier(char *path)
if (*dirp == '\0') if (*dirp == '\0')
continue; continue;
/*
* Don't try to build current or parent dir. It doesn't make sense anyhow,
* but it also returns EINVAL instead of EEXIST on BeOS!
*/
if ((strcmp(dirp, ".") == 0) || (strcmp(dirp, "..") == 0))
continue;
if (dst[0] != '\0') if (dst[0] != '\0')
strcat(dst, "/"); strcat(dst, "/");
strcat(dst, dirp); strcat(dst, dirp);

View File

@ -10,6 +10,11 @@
#include "xmlrpc_config.h" #include "xmlrpc_config.h"
#if defined(__BEOS__)
/* Some helpful system header has char==bool, then bool.h does int==bool. */
#define HAVE_BOOL 1
#endif
#include "bool.h" #include "bool.h"
#include "mallocvar.h" #include "mallocvar.h"
#include "linklist.h" #include "linklist.h"

View File

@ -52,6 +52,13 @@ else
cmake_system_darwin=false cmake_system_darwin=false
fi fi
# Determine whether this is BeOS
if echo "${cmake_system}" | grep BeOS >/dev/null 2>&1; then
cmake_system_beos=true
else
cmake_system_beos=false
fi
# Choose the generator to use for bootstrapping. # Choose the generator to use for bootstrapping.
if ${cmake_system_mingw}; then if ${cmake_system_mingw}; then
# Bootstrapping from an MSYS prompt. # Bootstrapping from an MSYS prompt.
@ -549,6 +556,13 @@ else
cmake_ld_flags=${LDFLAGS} cmake_ld_flags=${LDFLAGS}
fi fi
# Add BeOS toolkits...
if ${cmake_system_beos}; then
cmake_ld_flags="${LDFLAGS} -lroot -lbe"
else
cmake_ld_flags=${LDFLAGS}
fi
# Test C compiler # Test C compiler
cmake_c_compiler= cmake_c_compiler=