From 1b8564206f3923023ce2225bb2a2431a93054ee1 Mon Sep 17 00:00:00 2001 From: Liu Yiqun Date: Wed, 29 Mar 2017 10:28:01 +0800 Subject: [PATCH] Use native cross-compiling support for Android of cmake. --- CMakeLists.txt | 30 ++++++++++++++++++++++++------ cmake/configure.cmake | 6 ++---- cmake/external/python.cmake | 8 ++++---- cmake/flags.cmake | 2 +- cmake/simd.cmake | 20 ++++---------------- cmake/system.cmake | 6 ++++++ cmake/util.cmake | 4 ++++ 7 files changed, 45 insertions(+), 31 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 24ff21b60c..1c74f0ac61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,19 +12,26 @@ # See the License for the specific language governing permissions and # limitations under the License -cmake_minimum_required(VERSION 3.0) - -project(paddle CXX C) - set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") set(PROJ_ROOT ${CMAKE_SOURCE_DIR}) +include(system) + +if(ANDROID) + cmake_minimum_required(VERSION 3.7) +else() + cmake_minimum_required(VERSION 3.0) +endif() + +project(paddle CXX C) + find_package(Sphinx) -find_package(CUDA QUIET) +if(NOT CMAKE_CROSSCOMPILING) + find_package(CUDA QUIET) +endif(NOT CMAKE_CROSSCOMPILING) find_package(Git REQUIRED) find_package(Threads REQUIRED) -include(system) include(simd) ################################ Configurations ####################################### @@ -51,6 +58,17 @@ if(NOT CMAKE_BUILD_TYPE) FORCE) endif() +if(ANDROID) + set(WITH_GPU OFF CACHE STRING + "Disable GPU when cross-compiling for Android" FORCE) + set(WITH_AVX OFF CACHE STRING + "Disable AVX when cross-compiling for Android" FORCE) + set(WITH_PYTHON OFF CACHE STRING + "Disable PYTHON when cross-compiling for Android" FORCE) + set(WITH_RDMA OFF CACHE STRING + "Disable RDMA when cross-compiling for Android" FORCE) +endif(ANDROID) + set(THIRD_PARTY_PATH "${PROJ_ROOT}/third_party" CACHE STRING "A path setting third party libraries download & build directories.") ######################################################################################## diff --git a/cmake/configure.cmake b/cmake/configure.cmake index 994ed28ba5..2ea74676ec 100644 --- a/cmake/configure.cmake +++ b/cmake/configure.cmake @@ -32,15 +32,13 @@ if(NOT WITH_PROFILER) add_definitions(-DPADDLE_DISABLE_PROFILER) endif(NOT WITH_PROFILER) -if(NEON_FOUND) - set(SIMD_FLAG ${NEON_FLAG}) -else(NEON_FOUND) +if(NOT CMAKE_CROSSCOMPILING) if(WITH_AVX) set(SIMD_FLAG ${AVX_FLAG}) else(WITH_AVX) set(SIMD_FLAG ${SSE3_FLAG}) endif(WITH_AVX) -endif(NEON_FOUND) +endif() if(NOT WITH_GPU) add_definitions(-DPADDLE_ONLY_CPU) diff --git a/cmake/external/python.cmake b/cmake/external/python.cmake index 93d7275df0..9fd3afd099 100644 --- a/cmake/external/python.cmake +++ b/cmake/external/python.cmake @@ -219,9 +219,9 @@ ELSE(PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND) ENDIF(PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND) -INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIR}) -INCLUDE_DIRECTORIES(${PYTHON_NUMPY_INCLUDE_DIR}) - -IF(NOT WITH_PYTHON) +IF(WITH_PYTHON) + INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIR}) + INCLUDE_DIRECTORIES(${PYTHON_NUMPY_INCLUDE_DIR}) +ELSE() SET(PYTHON_LIBRARIES "") ENDIF() diff --git a/cmake/flags.cmake b/cmake/flags.cmake index 0a13a02df3..d8a3889033 100644 --- a/cmake/flags.cmake +++ b/cmake/flags.cmake @@ -26,7 +26,7 @@ function(CheckCompilerCXX11Flag) endfunction() CheckCompilerCXX11Flag() -LIST(APPEND CMAKE_CXX_FLAGS -std=c++11) +string(APPEND CMAKE_CXX_FLAGS " -std=c++11") # safe_set_flag # diff --git a/cmake/simd.cmake b/cmake/simd.cmake index 31776e5f7f..46035a908b 100644 --- a/cmake/simd.cmake +++ b/cmake/simd.cmake @@ -10,16 +10,16 @@ IF(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID set(SSE3_FLAG "-msse3") SET(AVX_FLAG "-mavx") SET(AVX2_FLAG "-mavx2") - SET(NEON_FLAG "-pie -fPIE -mfloat-abi=softfp -mfpu=neon") ELSEIF(MSVC) set(MMX_FLAG "/arch:MMX") set(SSE2_FLAG "/arch:SSE2") set(SSE3_FLAG "/arch:SSE3") SET(AVX_FLAG "/arch:AVX") SET(AVX2_FLAG "/arch:AVX2") - #SET(NEON_FLAG "") ENDIF() +set(CMAKE_REQUIRED_FLAGS_RETAINED ${CMAKE_REQUIRED_FLAGS}) + # Check MMX set(CMAKE_REQUIRED_FLAGS ${MMX_FLAG}) CHECK_CXX_SOURCE_RUNS(" @@ -76,17 +76,5 @@ int main() return 0; }" AVX2_FOUND) -# Check NEON -set(CMAKE_REQUIRED_FLAGS ${NEON_FLAG}) -CHECK_CXX_SOURCE_COMPILES(" -#include -int main() -{ - float32x4_t a = {-1.0f, 2.0f, -3.0f, 4.0f}; - float32x4_t b = {1.0f, 2.0f, 3.0f, 4.0f}; - float32x4_t c = vaddq_f32(a, b); - return 0; -}" NEON_FOUND) - -set(CMAKE_REQUIRED_FLAGS "") -mark_as_advanced(MMX_FOUND SSE2_FOUND SSE3_FOUND AVX_FOUND AVX2_FOUND NEON_FOUND) +set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_RETAINED}) +mark_as_advanced(MMX_FOUND SSE2_FOUND SSE3_FOUND AVX_FOUND AVX2_FOUND) diff --git a/cmake/system.cmake b/cmake/system.cmake index 3e472da7e0..3ca06665ab 100644 --- a/cmake/system.cmake +++ b/cmake/system.cmake @@ -67,6 +67,12 @@ MARK_AS_ADVANCED(HOST_SYSTEM CPU_CORES) MESSAGE(STATUS "Found Paddle host system: ${HOST_SYSTEM}") MESSAGE(STATUS "Found Paddle host system's CPU: ${CPU_CORES} cores") +IF(DEFINED CMAKE_SYSTEM_NAME) + IF(${CMAKE_SYSTEM_NAME} STREQUAL "Android") + SET(ANDROID TRUE) + ENDIF() +ENDIF() + # external dependencies log output SET(EXTERNAL_PROJECT_LOG_ARGS LOG_DOWNLOAD 0 # Wrap download in script to log output diff --git a/cmake/util.cmake b/cmake/util.cmake index bacb64eb9e..099a85809d 100644 --- a/cmake/util.cmake +++ b/cmake/util.cmake @@ -90,6 +90,10 @@ function(link_paddle_exe TARGET_NAME) ${RDMA_LD_FLAGS} ${RDMA_LIBS}) + if(ANDROID) + target_link_libraries(${TARGET_NAME} log) + endif(ANDROID) + add_dependencies(${TARGET_NAME} ${external_project_dependencies}) endfunction() -- GitLab