From Rafa Gaitan and Jorge Izquierdo, build support for Android NDK.
"- In order to build against GLES1 we execute: $ mkdir build_android_gles1 $ cd build_android_gles1 $ cmake .. -DOSG_BUILD_PLATFORM_ANDROID=ON -DDYNAMIC_OPENTHREADS=OFF -DDYNAMIC_OPENSCENEGRAPH=OFF -DANDROID_NDK=<path_to_android_ndk>/ -DOSG_GLES1_AVAILABLE=ON -DOSG_GL1_AVAILABLE=OFF -DOSG_GL2_AVAILABLE=OFF -DOSG_GL_DISPLAYLISTS_AVAILABLE=OFF -DJ=2 -DOSG_CPP_EXCEPTIONS_AVAILABLE=OFF $ make If all is correct you will have and static OSG inside: build_android_gles1/bin/ndk/local/armeabi. - GLES2 is not tested/proved, but I think it could be possible build it with the correct cmake flags. - The flag -DJ=2 is used to pass to the ndk-build the number of processors to speed up the building. - make install is not yet supported."
This commit is contained in:
@@ -9,7 +9,9 @@ SET(OPENTHREADS_SOVERSION 12)
|
||||
|
||||
SET(OPENTHREADS_VERSION ${OPENTHREADS_MAJOR_VERSION}.${OPENTHREADS_MINOR_VERSION}.${OPENTHREADS_PATCH_VERSION})
|
||||
|
||||
INCLUDE(CheckAtomicOps)
|
||||
IF(NOT ANDROID)
|
||||
INCLUDE(CheckAtomicOps)
|
||||
ENDIF()
|
||||
|
||||
# User Options
|
||||
OPTION(DYNAMIC_OPENTHREADS "Set to ON to build OpenThreads for dynamic linking. Use OFF for static." ON)
|
||||
@@ -62,9 +64,10 @@ SET(OpenThreads_PUBLIC_HEADERS
|
||||
${OPENTHREADS_CONFIG_HEADER}
|
||||
)
|
||||
|
||||
IF(NOT ANDROID)
|
||||
# Use our modified version of FindThreads.cmake which has Sproc hacks.
|
||||
FIND_PACKAGE(Threads)
|
||||
|
||||
FIND_PACKAGE(Threads)
|
||||
ENDIF()
|
||||
# Do we have sproc?
|
||||
IF(CMAKE_SYSTEM MATCHES IRIX)
|
||||
IF(CMAKE_USE_SPROC_INIT)
|
||||
@@ -83,7 +86,9 @@ IF(QT4_FOUND)
|
||||
ENDIF()
|
||||
|
||||
# Maybe we should be using the FindThreads.cmake module?
|
||||
IF(QT4_FOUND AND BUILD_OPENTHREADS_WITH_QT)
|
||||
IF(ANDROID)
|
||||
SUBDIRS(pthreads)
|
||||
ELSEIF(QT4_FOUND AND BUILD_OPENTHREADS_WITH_QT)
|
||||
SUBDIRS(qt)
|
||||
ELSEIF(WIN32)
|
||||
# So I think Cygwin wants to use pthreads
|
||||
|
||||
@@ -6,12 +6,10 @@ INCLUDE (CheckSymbolExists)
|
||||
INCLUDE (CheckCXXSourceCompiles)
|
||||
|
||||
SET(LIB_NAME OpenThreads)
|
||||
SET(LIB_PUBLIC_HEADERS ${OpenThreads_PUBLIC_HEADERS})
|
||||
SET(TARGET_H ${OpenThreads_PUBLIC_HEADERS})
|
||||
|
||||
ADD_LIBRARY(${LIB_NAME}
|
||||
${OPENTHREADS_USER_DEFINED_DYNAMIC_OR_STATIC}
|
||||
${LIB_PUBLIC_HEADERS}
|
||||
PThread.cpp
|
||||
SET(TARGET_SRC
|
||||
PThread.cpp
|
||||
PThreadBarrier.cpp
|
||||
PThreadBarrierPrivateData.h
|
||||
PThreadCondition.cpp
|
||||
@@ -22,126 +20,145 @@ ADD_LIBRARY(${LIB_NAME}
|
||||
../common/Version.cpp
|
||||
../common/Atomic.cpp
|
||||
)
|
||||
|
||||
IF(OPENTHREADS_SONAMES)
|
||||
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES VERSION ${OPENTHREADS_VERSION} SOVERSION ${OPENTHREADS_SOVERSION})
|
||||
ENDIF()
|
||||
|
||||
SET(CMAKE_REQUIRED_LIBRARIES_SAFE "${CMAKE_REQUIRED_LIBRARIES}")
|
||||
SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
|
||||
|
||||
|
||||
CHECK_FUNCTION_EXISTS(pthread_yield HAVE_PTHREAD_YIELD)
|
||||
IF(HAVE_PTHREAD_YIELD)
|
||||
ADD_DEFINITIONS(-DHAVE_PTHREAD_YIELD)
|
||||
IF(ANDROID)
|
||||
ADD_DEFINITIONS(-D_GNU_SOURCE)
|
||||
SET(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE")
|
||||
SET(MODULE_USER_STATIC_OR_DYNAMIC ${OPENTHREADS_USER_DEFINED_DYNAMIC_OR_STATIC})
|
||||
#SET(CPP_EXTENSION "c++")
|
||||
SETUP_ANDROID_LIBRARY(${LIB_NAME})
|
||||
ELSE()
|
||||
# sched_yield appears not in libc, pthreads or whatever on some systems
|
||||
CHECK_FUNCTION_EXISTS(sched_yield HAVE_SCHED_YIELD)
|
||||
IF(NOT HAVE_SCHED_YIELD)
|
||||
CHECK_LIBRARY_EXISTS(rt sched_yield "" HAVE_SCHED_YIELD)
|
||||
IF(HAVE_SCHED_YIELD)
|
||||
SET(CMAKE_THREAD_LIBS_INIT "${CMAKE_THREAD_LIBS_INIT} -lrt")
|
||||
|
||||
# should check?
|
||||
ADD_DEFINITIONS(-DHAVE_PTHREAD_TESTCANCEL)
|
||||
ADD_DEFINITIONS(-DHAVE_PTHREAD_CANCEL)
|
||||
ADD_DEFINITIONS(-DHAVE_PTHREAD_SETCANCELSTATE)
|
||||
|
||||
CHECK_FUNCTION_EXISTS(pthread_yield HAVE_PTHREAD_YIELD)
|
||||
IF(HAVE_PTHREAD_YIELD)
|
||||
ADD_DEFINITIONS(-DHAVE_PTHREAD_YIELD)
|
||||
ELSE()
|
||||
# sched_yield appears not in libc, pthreads or whatever on some systems
|
||||
CHECK_FUNCTION_EXISTS(sched_yield HAVE_SCHED_YIELD)
|
||||
IF(NOT HAVE_SCHED_YIELD)
|
||||
CHECK_LIBRARY_EXISTS(rt sched_yield "" HAVE_SCHED_YIELD)
|
||||
IF(HAVE_SCHED_YIELD)
|
||||
SET(CMAKE_THREAD_LIBS_INIT "${CMAKE_THREAD_LIBS_INIT} -lrt")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
IF(HAVE_SCHED_YIELD)
|
||||
ADD_DEFINITIONS(-DHAVE_SCHED_YIELD)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
IF(HAVE_SCHED_YIELD)
|
||||
ADD_DEFINITIONS(-DHAVE_SCHED_YIELD)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||
# need to have that for pthread_setaffinity_np on linux
|
||||
ADD_DEFINITIONS(-D_GNU_SOURCE)
|
||||
SET(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE")
|
||||
ENDIF()
|
||||
|
||||
CHECK_FUNCTION_EXISTS(pthread_setconcurrency HAVE_PTHREAD_SETCONCURRENCY)
|
||||
IF(HAVE_PTHREAD_SETCONCURRENCY)
|
||||
ADD_DEFINITIONS(-DHAVE_PTHREAD_SETCONCURRENCY)
|
||||
ENDIF()
|
||||
|
||||
CHECK_FUNCTION_EXISTS(pthread_getconcurrency HAVE_PTHREAD_GETCONCURRENCY)
|
||||
IF(HAVE_PTHREAD_GETCONCURRENCY)
|
||||
ADD_DEFINITIONS(-DHAVE_PTHREAD_GETCONCURRENCY)
|
||||
ENDIF()
|
||||
|
||||
CHECK_FUNCTION_EXISTS(pthread_setaffinity_np HAVE_PTHREAD_SETAFFINITY_NP)
|
||||
IF(HAVE_PTHREAD_SETAFFINITY_NP)
|
||||
# double check that pthread_setaffinity_np is available as FreeBSD header doesn't contain required function
|
||||
CHECK_CXX_SOURCE_COMPILES("
|
||||
#include <pthread.h>
|
||||
int main() {
|
||||
cpu_set_t cpumask;
|
||||
CPU_ZERO( &cpumask );
|
||||
CPU_SET( 0, &cpumask );
|
||||
pthread_setaffinity_np( pthread_self(), sizeof(cpumask), &cpumask);
|
||||
return 0;
|
||||
}" COMPILES_PTHREAD_SETAFFINITY_NP)
|
||||
|
||||
IF (NOT COMPILES_PTHREAD_SETAFFINITY_NP)
|
||||
SET(HAVE_PTHREAD_SETAFFINITY_NP OFF)
|
||||
IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||
# need to have that for pthread_setaffinity_np on linux
|
||||
ADD_DEFINITIONS(-D_GNU_SOURCE)
|
||||
SET(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_PTHREAD_SETAFFINITY_NP)
|
||||
ADD_DEFINITIONS(-DHAVE_PTHREAD_SETAFFINITY_NP)
|
||||
ELSE()
|
||||
CHECK_CXX_SOURCE_COMPILES("
|
||||
#include <sched.h>
|
||||
int main() {
|
||||
cpu_set_t cpumask;
|
||||
sched_setaffinity( 0, sizeof(cpumask), &cpumask );
|
||||
return 0;
|
||||
}" HAVE_THREE_PARAM_SCHED_SETAFFINITY)
|
||||
IF(HAVE_THREE_PARAM_SCHED_SETAFFINITY)
|
||||
ADD_DEFINITIONS(-DHAVE_THREE_PARAM_SCHED_SETAFFINITY)
|
||||
ELSE()
|
||||
CHECK_CXX_SOURCE_COMPILES("
|
||||
#include <sched.h>
|
||||
int main() {
|
||||
cpu_set_t cpumask;
|
||||
sched_setaffinity( 0, &cpumask );
|
||||
return 0;
|
||||
}" HAVE_TWO_PARAM_SCHED_SETAFFINITY)
|
||||
IF(HAVE_TWO_PARAM_SCHED_SETAFFINITY)
|
||||
ADD_DEFINITIONS(-DHAVE_TWO_PARAM_SCHED_SETAFFINITY)
|
||||
CHECK_FUNCTION_EXISTS(pthread_setconcurrency HAVE_PTHREAD_SETCONCURRENCY)
|
||||
IF(HAVE_PTHREAD_SETCONCURRENCY)
|
||||
ADD_DEFINITIONS(-DHAVE_PTHREAD_SETCONCURRENCY)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
SET(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES_SAFE}")
|
||||
CHECK_FUNCTION_EXISTS(pthread_getconcurrency HAVE_PTHREAD_GETCONCURRENCY)
|
||||
IF(HAVE_PTHREAD_GETCONCURRENCY)
|
||||
ADD_DEFINITIONS(-DHAVE_PTHREAD_GETCONCURRENCY)
|
||||
ENDIF()
|
||||
|
||||
TARGET_LINK_LIBRARIES(${LIB_NAME}
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
)
|
||||
CHECK_FUNCTION_EXISTS(pthread_setaffinity_np HAVE_PTHREAD_SETAFFINITY_NP)
|
||||
IF(HAVE_PTHREAD_SETAFFINITY_NP)
|
||||
# double check that pthread_setaffinity_np is available as FreeBSD header doesn't contain required function
|
||||
CHECK_CXX_SOURCE_COMPILES("
|
||||
#include <pthread.h>
|
||||
int main() {
|
||||
cpu_set_t cpumask;
|
||||
CPU_ZERO( &cpumask );
|
||||
CPU_SET( 0, &cpumask );
|
||||
pthread_setaffinity_np( pthread_self(), sizeof(cpumask), &cpumask);
|
||||
return 0;
|
||||
}" COMPILES_PTHREAD_SETAFFINITY_NP)
|
||||
|
||||
# Since we're building different platforms binaries in
|
||||
# their respective directories, we need to set the
|
||||
# link directory so it can find this location.
|
||||
LINK_DIRECTORIES(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
)
|
||||
IF (NOT COMPILES_PTHREAD_SETAFFINITY_NP)
|
||||
SET(HAVE_PTHREAD_SETAFFINITY_NP OFF)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
INSTALL(
|
||||
TARGETS OpenThreads
|
||||
ARCHIVE DESTINATION lib${LIB_POSTFIX} COMPONENT libopenthreads-dev
|
||||
LIBRARY DESTINATION lib${LIB_POSTFIX} COMPONENT libopenthreads
|
||||
RUNTIME DESTINATION bin COMPONENT libopenthreads
|
||||
)
|
||||
IF(HAVE_PTHREAD_SETAFFINITY_NP)
|
||||
ADD_DEFINITIONS(-DHAVE_PTHREAD_SETAFFINITY_NP)
|
||||
ELSE()
|
||||
CHECK_CXX_SOURCE_COMPILES("
|
||||
#include <sched.h>
|
||||
int main() {
|
||||
cpu_set_t cpumask;
|
||||
sched_setaffinity( 0, sizeof(cpumask), &cpumask );
|
||||
return 0;
|
||||
}" HAVE_THREE_PARAM_SCHED_SETAFFINITY)
|
||||
IF(HAVE_THREE_PARAM_SCHED_SETAFFINITY)
|
||||
ADD_DEFINITIONS(-DHAVE_THREE_PARAM_SCHED_SETAFFINITY)
|
||||
ELSE()
|
||||
CHECK_CXX_SOURCE_COMPILES("
|
||||
#include <sched.h>
|
||||
int main() {
|
||||
cpu_set_t cpumask;
|
||||
sched_setaffinity( 0, &cpumask );
|
||||
return 0;
|
||||
}" HAVE_TWO_PARAM_SCHED_SETAFFINITY)
|
||||
IF(HAVE_TWO_PARAM_SCHED_SETAFFINITY)
|
||||
ADD_DEFINITIONS(-DHAVE_TWO_PARAM_SCHED_SETAFFINITY)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
IF(NOT OSG_COMPILE_FRAMEWORKS)
|
||||
INSTALL(
|
||||
FILES ${OpenThreads_PUBLIC_HEADERS}
|
||||
DESTINATION include/OpenThreads
|
||||
COMPONENT libopenthreads-dev
|
||||
)
|
||||
SET(CMAKE_REQUIRED_LIBRARIES_SAFE "${CMAKE_REQUIRED_LIBRARIES}")
|
||||
SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
|
||||
|
||||
ELSE()
|
||||
MESSAGE("Will compile OpenThreads.framework!")
|
||||
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES
|
||||
FRAMEWORK TRUE
|
||||
FRAMEWORK_VERSION ${OPENTHREADS_SOVERSION}
|
||||
PUBLIC_HEADER "${OpenThreads_PUBLIC_HEADERS}"
|
||||
INSTALL_NAME_DIR "${OSG_COMPILE_FRAMEWORKS_INSTALL_NAME_DIR}"
|
||||
ADD_LIBRARY(${LIB_NAME}
|
||||
${OPENTHREADS_USER_DEFINED_DYNAMIC_OR_STATIC}
|
||||
${TARGET_H}
|
||||
${TARGET_SRC}
|
||||
)
|
||||
|
||||
IF(OPENTHREADS_SONAMES)
|
||||
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES VERSION ${OPENTHREADS_VERSION} SOVERSION ${OPENTHREADS_SOVERSION})
|
||||
ENDIF()
|
||||
|
||||
|
||||
SET(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES_SAFE}")
|
||||
|
||||
TARGET_LINK_LIBRARIES(${LIB_NAME}
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
)
|
||||
|
||||
# Since we're building different platforms binaries in
|
||||
# their respective directories, we need to set the
|
||||
# link directory so it can find this location.
|
||||
LINK_DIRECTORIES(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
)
|
||||
|
||||
INSTALL(
|
||||
TARGETS OpenThreads
|
||||
ARCHIVE DESTINATION lib${LIB_POSTFIX} COMPONENT libopenthreads-dev
|
||||
LIBRARY DESTINATION lib${LIB_POSTFIX} COMPONENT libopenthreads
|
||||
RUNTIME DESTINATION bin COMPONENT libopenthreads
|
||||
)
|
||||
|
||||
IF(NOT OSG_COMPILE_FRAMEWORKS)
|
||||
INSTALL(
|
||||
FILES ${OpenThreads_PUBLIC_HEADERS}
|
||||
DESTINATION include/OpenThreads
|
||||
COMPONENT libopenthreads-dev
|
||||
)
|
||||
|
||||
ELSE()
|
||||
MESSAGE("Will compile OpenThreads.framework!")
|
||||
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES
|
||||
FRAMEWORK TRUE
|
||||
FRAMEWORK_VERSION ${OPENTHREADS_SOVERSION}
|
||||
PUBLIC_HEADER "${OpenThreads_PUBLIC_HEADERS}"
|
||||
INSTALL_NAME_DIR "${OSG_COMPILE_FRAMEWORKS_INSTALL_NAME_DIR}"
|
||||
)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
#commented out# INCLUDE(ModuleInstall OPTIONAL)
|
||||
|
||||
@@ -23,11 +23,13 @@
|
||||
#include <pthread.h>
|
||||
#include <limits.h>
|
||||
|
||||
#if defined __linux || defined __sun || defined __APPLE__
|
||||
#if defined __linux || defined __sun || defined __APPLE__ || ANDROID
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/unistd.h>
|
||||
#if !defined ANDROID
|
||||
#include <sys/unistd.h>
|
||||
#endif
|
||||
#endif
|
||||
#if defined(__sgi)
|
||||
#include <unistd.h>
|
||||
@@ -44,6 +46,12 @@
|
||||
#include <sys/sysctl.h>
|
||||
#endif
|
||||
|
||||
#if defined(ANDROID)
|
||||
#ifndef PAGE_SIZE
|
||||
#define PAGE_SIZE 0x400
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <OpenThreads/Thread>
|
||||
#include "PThreadPrivateData.h"
|
||||
|
||||
@@ -723,7 +731,7 @@ int Thread::join()
|
||||
//
|
||||
int Thread::testCancel()
|
||||
{
|
||||
|
||||
#if defined(HAVE_PTHREAD_TESTCANCEL)
|
||||
PThreadPrivateData *pd = static_cast<PThreadPrivateData *> (_prvData);
|
||||
|
||||
if(pthread_self() != pd->tid)
|
||||
@@ -732,7 +740,9 @@ int Thread::testCancel()
|
||||
pthread_testcancel();
|
||||
|
||||
return 0;
|
||||
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -744,7 +754,7 @@ int Thread::testCancel()
|
||||
//
|
||||
int Thread::cancel()
|
||||
{
|
||||
|
||||
#if defined(HAVE_PTHREAD_CANCEL)
|
||||
PThreadPrivateData *pd = static_cast<PThreadPrivateData *> (_prvData);
|
||||
if (pd->isRunning)
|
||||
{
|
||||
@@ -753,6 +763,9 @@ int Thread::cancel()
|
||||
return status;
|
||||
}
|
||||
return 0;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -763,9 +776,11 @@ int Thread::cancel()
|
||||
//
|
||||
int Thread::setCancelModeDisable()
|
||||
{
|
||||
|
||||
#if defined(HAVE_PTHREAD_SETCANCELSTATE)
|
||||
return pthread_setcancelstate( PTHREAD_CANCEL_DISABLE, 0 );
|
||||
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -776,10 +791,14 @@ int Thread::setCancelModeDisable()
|
||||
//
|
||||
int Thread::setCancelModeAsynchronous() {
|
||||
|
||||
#if defined(HAVE_PTHREAD_SETCANCELSTATE)
|
||||
int status = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
|
||||
if(status != 0) return status;
|
||||
|
||||
return pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, 0);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -790,11 +809,14 @@ int Thread::setCancelModeAsynchronous() {
|
||||
//
|
||||
int Thread::setCancelModeDeferred() {
|
||||
|
||||
#if defined(HAVE_PTHREAD_SETCANCELSTATE)
|
||||
int status = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, 0);
|
||||
if(status != 0) return status;
|
||||
|
||||
return pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, 0);
|
||||
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -947,7 +969,12 @@ int Thread::YieldCurrentThread()
|
||||
//
|
||||
int Thread::microSleep(unsigned int microsec)
|
||||
{
|
||||
#if !defined(ANDROID)
|
||||
return ::usleep(microsec);
|
||||
#else
|
||||
::usleep(microsec);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user