#------------------------------------------------------------------- # This file is part of the CMake build system for OGRE # (Object-oriented Graphics Rendering Engine) # For the latest info, see http://www.ogre3d.org/ # # The contents of this file are placed in the public domain. Feel # free to make use of it in any way you like. #------------------------------------------------------------------- macro(add_static_libs LIB_DIR) foreach(LIB_NAME ${ARGN}) if (ANDROID_NSIGHT) SET(HEADERS_DEBUG "${HEADERS_DEBUG}# ${LIB_NAME}\n\tinclude $(CLEAR_VARS)\n\tLOCAL_MODULE := ${LIB_NAME}\n\tLOCAL_SRC_FILES := ${LIB_DIR}/Debug/lib${LIB_NAME}.a\n\tinclude $(PREBUILT_STATIC_LIBRARY)\n\n") SET(HEADERS_RELEASE "${HEADERS_RELEASE}# ${LIB_NAME}\n\tinclude $(CLEAR_VARS)\n\tLOCAL_MODULE := ${LIB_NAME}\n\tLOCAL_SRC_FILES := ${LIB_DIR}/Release/lib${LIB_NAME}.a\n\tinclude $(PREBUILT_STATIC_LIBRARY)\n\n") else() SET(HEADERS "${HEADERS}# ${LIB_NAME}\n\tinclude $(CLEAR_VARS)\n\tLOCAL_MODULE := ${LIB_NAME}\n\tLOCAL_SRC_FILES := ${LIB_DIR}/lib${LIB_NAME}.a\n\tinclude $(PREBUILT_STATIC_LIBRARY)\n\n") endif() SET(SCOL_LDLIBS "${SCOL_LDLIBS} ${LIB_NAME}") endforeach(LIB_NAME ${ARGN}) # SET(SCOL_LDLIBS "${SCOL_LDLIBS}\n LOCAL_STATIC_LIBRARIES += ") endmacro(add_static_libs) macro(add_shared_libs LIB_DIR) foreach(LIB_NAME ${ARGN}) if (ANDROID_NSIGHT) SET(HEADERS_DEBUG "${HEADERS_DEBUG}# ${LIB_NAME}\n\tinclude $(CLEAR_VARS)\n\tLOCAL_MODULE := ${LIB_NAME}\n\tLOCAL_SRC_FILES := ${LIB_DIR}/Debug/lib${LIB_NAME}.so\n\tinclude $(PREBUILT_SHARED_LIBRARY)\n\n") SET(HEADERS_RELEASE "${HEADERS_RELEASE}# ${LIB_NAME}\n\tinclude $(CLEAR_VARS)\n\tLOCAL_MODULE := ${LIB_NAME}\n\tLOCAL_SRC_FILES := ${LIB_DIR}/Release/lib${LIB_NAME}.so\n\tinclude $(PREBUILT_SHARED_LIBRARY)\n\n") else() SET(HEADERS "${HEADERS}# ${LIB_NAME}\n\tinclude $(CLEAR_VARS)\n\tLOCAL_MODULE := ${LIB_NAME}\n\tLOCAL_SRC_FILES := ${LIB_DIR}/lib${LIB_NAME}.so\n\tinclude $(PREBUILT_SHARED_LIBRARY)\n\n") endif() SET(SCOL_LSLIBS "${SCOL_LSLIBS} ${LIB_NAME}") endforeach(LIB_NAME ${ARGN}) # SET(SCOL_LSLIBS "${SCOL_LSLIBS}\n LOCAL_SHARED_LIBRARIES += ") endmacro(add_shared_libs) macro(add_external_shared_libs) foreach(LIB_NAME ${ARGN}) get_filename_component(LFNAME ${LIB_NAME} NAME) string(REPLACE ".so" "" LFNAME ${LFNAME}) if (ANDROID_NSIGHT) SET(HEADERS_DEBUG "${HEADERS_DEBUG}# ${LFNAME}\n\tinclude $(CLEAR_VARS)\n\tLOCAL_MODULE := ${LFNAME}\n\tLOCAL_SRC_FILES := ${LIB_NAME}\n\tinclude $(PREBUILT_SHARED_LIBRARY)\n\n") SET(HEADERS_RELEASE "${HEADERS_RELEASE}# ${LFNAME}\n\tinclude $(CLEAR_VARS)\n\tLOCAL_MODULE := ${LFNAME}\n\tLOCAL_SRC_FILES := ${LIB_NAME}\n\tinclude $(PREBUILT_SHARED_LIBRARY)\n\n") else() SET(HEADERS "${HEADERS}# ${LFNAME}\n\tinclude $(CLEAR_VARS)\n\tLOCAL_MODULE := ${LFNAME}\n\tLOCAL_SRC_FILES := ${LIB_NAME}\n\tinclude $(PREBUILT_SHARED_LIBRARY)\n\n") endif() SET(SCOL_LSLIBS "${SCOL_LSLIBS} ${LIB_NAME}") endforeach(LIB_NAME ${ARGN}) # SET(SCOL_LSLIBS "${SCOL_LSLIBS}\n LOCAL_SHARED_LIBRARIES += ") endmacro(add_external_shared_libs) macro(add_static_libs_from_paths) foreach(LIB ${ARGN}) get_filename_component(LIB_NAME ${LIB} NAME_WE) string(SUBSTRING ${LIB_NAME} 3 -1 LIB_NAME) # strip lib prefix if (ANDROID_NSIGHT) set(HEADERS_DEBUG "${HEADERS_DEBUG}# ${LIB_NAME}\n\tinclude $(CLEAR_VARS)\n\tLOCAL_MODULE := ${LIB_NAME}\n\tLOCAL_SRC_FILES := ${LIB}\n\tinclude $(PREBUILT_STATIC_LIBRARY)\n\n") set(HEADERS_RELEASE "${HEADERS_RELEASE}# ${LIB_NAME}\n\tinclude $(CLEAR_VARS)\n\tLOCAL_MODULE := ${LIB_NAME}\n\tLOCAL_SRC_FILES := ${LIB}\n\tinclude $(PREBUILT_STATIC_LIBRARY)\n\n") else() set(HEADERS "${HEADERS}# ${LIB_NAME}\n\tinclude $(CLEAR_VARS)\n\tLOCAL_MODULE := ${LIB_NAME}\n\tLOCAL_SRC_FILES := ${LIB}\n\tinclude $(PREBUILT_STATIC_LIBRARY)\n\n") endif() set(SCOL_LDLIBS "${SCOL_LDLIBS} ${LIB_NAME}") endforeach() # set(SCOL_LDLIBS "${SCOL_LDLIBS}\n LOCAL_STATIC_LIBRARIES += ") endmacro(add_static_libs_from_paths) macro(add_android_dependencies ANDROID_PROJECT_TARGET) set(Scol_ANDROID_DEPENDENCIES ${Scol_ANDROID_DEPENDENCIES} kernel CACHE INTERNAL "" FORCE) message(STATUS "[${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}] Scol_ANDROID_DEPENDENCIES: ${Scol_ANDROID_DEPENDENCIES} -- added kernel to android project deps") #add_dependencies(${ANDROID_PROJECT_TARGET} ${Scol_ANDROID_DEPENDENCIES}) set(DEPEND_SHARED_LIBS ${Scol_ANDROID_DEPENDENCIES}) add_shared_libs("${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" ${DEPEND_SHARED_LIBS}) add_external_shared_libs(${Scol_ANDROID_SHARED_LIBS}) endmacro(add_android_dependencies) macro (create_android_templates) ###################################################################### # Setup android build parameters if(${ANDROID_NATIVE_API_LEVEL} LESS 14) MATH(EXPR ANDROID_SDK_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}+1") else() SET(ANDROID_SDK_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}") SET(SCREEN_SIZE "|screenSize") endif() SET(ANDROID_TARGET "android-${ANDROID_SDK_API_LEVEL}") # By default, if application has no Java code, use android NativeActivity if (HAS_CODE STREQUAL "false") SET(MAIN_ACTIVITY "android.app.NativeActivity") endif() ###################################################################### # Construct NDK project hierarchy file(MAKE_DIRECTORY "${NDKOUT}") file(MAKE_DIRECTORY "${NDKOUT}/jni") file(MAKE_DIRECTORY "${NDKOUT}/assets") file(MAKE_DIRECTORY "${NDKOUT}/res") file(MAKE_DIRECTORY "${NDKOUT}/res/values") file(MAKE_DIRECTORY "${NDKOUT}/src") ###################################################################### ###################################################################### # Configure templates and NDK project files file(WRITE "${NDKOUT}/default.properties" "target=${ANDROID_TARGET}") file(WRITE "${NDKOUT}/jni/Application.mk" "APP_ABI := ${ANDROID_NDK_ABI_NAME}\nLOCAL_ARM_NEON := ${NEON}\nAPP_STL := gnustl_static\nNDK_TOOLCHAIN_VERSION := ${ANDROID_COMPILER_VERSION}") configure_file("${CMAKE_SOURCE_DIR}/cmake/templates/AndroidManifest.xml.in" "${NDKOUT}/AndroidManifest.xml" @ONLY) if (ANDROID_NSIGHT) configure_file("${CMAKE_SOURCE_DIR}/cmake/templates/Android-nsight.mk.in" "${NDKOUT}/jni/Android.mk" @ONLY) configure_file("${CMAKE_SOURCE_DIR}/cmake/templates/Androidr.mk.in" "${NDKOUT}/jni/release_android.mk" @ONLY) configure_file("${CMAKE_SOURCE_DIR}/cmake/templates/Androidd.mk.in" "${NDKOUT}/jni/debug_android.mk" @ONLY) else() configure_file("${CMAKE_SOURCE_DIR}/cmake/templates/Android.mk.in" "${NDKOUT}/jni/Android.mk" @ONLY) endif() configure_file("${CMAKE_SOURCE_DIR}/cmake/templates/strings.xml.in" "${NDKOUT}/res/values/strings.xml" @ONLY) ###################################################################### endmacro(create_android_templates) macro(create_android_proj ANDROID_PROJECT_TARGET) ################################################################## # Creates a basic android JNI project # Expects : # - ANDROID_MOD_NAME Name of the android module # - JNI_PATH Path to the jni directory containing .cpp files # - JNI_SRC_FILES A list of native .cpp file names to compile # - PKG_NAME The name of the output android package ex"Org.Ogre.OgreJNI" # - NDKOUT The directory for the Ndk project to be written to # - HAS_CODE Set this variable to "false" if no java code will be present # (google android:hasCode for more info) # - MAIN_ACTIVITY Name of the main java activity ex "android.app.MainActivity" ################################################################## ###################################################################### add_android_dependencies(${ANDROID_PROJECT_TARGET}) # if( Boost_INCLUDE_DIR ) # set(SCOL_BOOST_INCLUDES ${Boost_INCLUDE_DIRS}) # add_static_libs_from_paths(${Boost_LIBRARIES}) # message( STATUS "Boost_INCLUDE_DIRS : ${Boost_INCLUDE_DIRS}" ) # message( STATUS "Boost_LIBRARIES : ${Boost_LIBRARIES}" ) # else() # message( STATUS "Boost not found." ) # endif() ###################################################################### ###################################################################### # Setup android "builders" : # . android : initialize ant projects. Needs only command parameters # . ndk-build : compile native source code. Uses Android.mk and Application.mk files to be configured. # . ant : build apk from Java sources and native libraries. Uses build.xml and AndroidManifest.xml to be configured. # build.xml is generated by the "android" program. if(APPLE OR WIN32) SET(ANDROID_EXECUTABLE "android") SET(NDK_BUILD_EXECUTABLE "ndk-build") SET(KEYTOOL_EXECUTABLE "keytool") SET(JARSIGNER_EXECUTABLE "jarsigner") else() if(EXISTS $ENV{ANDROID_SDK}) SET(ANDROID_SDK $ENV{ANDROID_SDK}) SET(ANDROID_EXECUTABLE "$ENV{ANDROID_SDK}/tools/android") else() SET(ANDROID_SDK "/opt/android-sdk") SET(ANDROID_EXECUTABLE "/opt/android-sdk/tools/android") endif() if(EXISTS $ENV{ANDROID_NDK}) SET(NDK_BUILD_EXECUTABLE "$ENV{ANDROID_NDK}/ndk-build") else() SET(NDK_BUILD_EXECUTABLE "${ANDROID_NDK}/ndk-build") if(EXISTS $ENV{JAVA_HOME}) SET(KEYTOOL_EXECUTABLE "$ENV{JAVA_HOME}/bin/keytool") SET(JARSIGNER_EXECUTABLE "$ENV{JAVA_HOME}/bin/jarsigner") else() SET(KEYTOOL_EXECUTABLE "${JAVA_HOME}/bin/keytool") SET(JARSIGNER_EXECUTABLE "${JAVA_HOME}/bin/jarsigner") endif() endif() endif() SET(ANT_EXECUTABLE "ant") ###################################################################### create_android_templates() ###################################################################### # Create / Update ant project (android) add_custom_command( TARGET ${ANDROID_PROJECT_TARGET} POST_BUILD COMMAND ${ANDROID_EXECUTABLE} update project --target ${ANDROID_TARGET} --path "${NDKOUT}" WORKING_DIRECTORY ${NDKOUT} ) file(COPY "${ANDROID_SDK}/extras/android/support/v4/android-support-v4.jar" DESTINATION "${NDKOUT}/libs") ###################################################################### ###################################################################### # Build Native source code (ndk-build) if(DEBUG) add_custom_command( TARGET ${ANDROID_PROJECT_TARGET} POST_BUILD COMMAND ${NDK_BUILD_EXECUTABLE} all -j4 V=1 NDK_DEBUG=1 WORKING_DIRECTORY ${NDKOUT} ) else() add_custom_command( TARGET ${ANDROID_PROJECT_TARGET} POST_BUILD COMMAND ${NDK_BUILD_EXECUTABLE} all -j4 V=1 WORKING_DIRECTORY ${NDKOUT} ) endif() ###################################################################### ###################################################################### # Build apk (ant) if (DEBUG) add_custom_command( TARGET ${ANDROID_PROJECT_TARGET} POST_BUILD COMMAND ${ANT_EXECUTABLE} debug install WORKING_DIRECTORY ${NDKOUT} ) else() add_custom_command( TARGET ${ANDROID_PROJECT_TARGET} POST_BUILD COMMAND ${ANT_EXECUTABLE} release install WORKING_DIRECTORY ${NDKOUT} ) endif() add_custom_command( TARGET ${ANDROID_PROJECT_TARGET} POST_BUILD COMMAND ${ANT_EXECUTABLE} copy-dependencies WORKING_DIRECTORY ${NDKOUT} ) ###################################################################### endmacro(create_android_proj)