Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle
提交
d7d2a4f7
P
Paddle
项目概览
PaddlePaddle
/
Paddle
大约 1 年 前同步成功
通知
2298
Star
20931
Fork
5422
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1423
列表
看板
标记
里程碑
合并请求
543
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1,423
Issue
1,423
列表
看板
标记
里程碑
合并请求
543
合并请求
543
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
d7d2a4f7
编写于
4月 28, 2017
作者:
L
Liu Yiqun
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add cross-compiling toolchain for Android.
上级
e0a46684
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
194 addition
and
9 deletion
+194
-9
CMakeLists.txt
CMakeLists.txt
+2
-6
cmake/cross_compiling/android.cmake
cmake/cross_compiling/android.cmake
+171
-0
cmake/system.cmake
cmake/system.cmake
+21
-3
未找到文件。
CMakeLists.txt
浏览文件 @
d7d2a4f7
...
...
@@ -12,17 +12,13 @@
# See the License for the specific language governing permissions and
# limitations under the License
cmake_minimum_required
(
VERSION 3.0
)
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
)
...
...
cmake/cross_compiling/android.cmake
0 → 100644
浏览文件 @
d7d2a4f7
# Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This is a toolchain file for cross-compiling for Android, and the
# configuration refers to the open-source resposity:
# https://github.com/taka-no-me/android-cmake
# Most of the variables are compatible with that used in
# https://developer.android.com/ndk/guides/cmake.html
# The supported are listed belows:
#
# ANDROID_STANDALONE_TOOLCHAIN
# ANDROID_ABI
# ANDROID_NATIVE_API_LEVEL
# ANDROID_PLATFORM
# ANDROID_ARM_MODE
# ANDROID_ARM_NEON
#
# For CMake >= 3.7.0, all the settings will be delivered to CMake system
# variables to let CMake do the cross-compiling configurations itself.
# More detail of cross-compiling settings
# https://cmake.org/cmake/help/v3.7/manual/cmake-toolchains.7.html
IF
(
NOT ANDROID
)
return
()
ENDIF
()
# check the exist of android standalone toolchain
IF
(
NOT DEFINED ANDROID_STANDALONE_TOOLCHAIN
)
SET
(
ANDROID_STANDALONE_TOOLCHAIN $ENV{ANDROID_STANDALONE_TOOLCHAIN}
CACHE PATH
"Folder holds the standalone toolchain of Android NDK"
)
ENDIF
()
IF
(
NOT ANDROID_STANDALONE_TOOLCHAIN
)
MESSAGE
(
FATAL_ERROR
"Set ANDROID_STANDALONE_TOOLCHAIN to use a standalone toolchain.
\n
"
"To cross-compile for Android, you need to:
\n
"
"1. Download an Android NDK from"
" https://developer.android.com/ndk/downloads/index.html
\n
"
"2. Setup a standalone toolchain"
" https://developer.android.google.cn/ndk/guides/standalone_toolchain.html?hl=zh-cn"
)
ENDIF
()
IF
(
DEFINED ANDROID_NATIVE_API_LEVEL
)
IF
(
ANDROID_NATIVE_API_LEVEL MATCHES
"^android-[0-9]+$"
)
STRING
(
REPLACE
"android-"
""
CMAKE_SYSTEM_VERSION
"
${
CMAKE_MATCH_0
}
"
)
ELSEIF
(
ANDROID_NATIVE_API_LEVEL MATCHES
"^[0-9]+$"
)
SET
(
CMAKE_SYSTEM_VERSION
${
ANDROID_NATIVE_API_LEVEL
}
)
ENDIF
()
SET
(
ANDROID_PLATFORM android-
${
CMAKE_SYSTEM_VERSION
}
)
ENDIF
()
IF
(
NOT DEFINED ANDROID_ABI
)
SET
(
ANDROID_ABI
"armeabi-v7a"
)
ENDIF
()
IF
(
NOT DEFINED ANDROID_ARM_MODE
)
SET
(
ANDROID_ARM_MODE ON
)
ENDIF
()
IF
(
NOT DEFINED ANDROID_ARM_NEON
)
SET
(
ANDROID_ARM_NEON ON
)
ENDIF
()
IF
(
NOT ANDROID_ARM_MODE OR ANDROID_ARM_MODE STREQUAL
"thumb"
)
SET
(
ANDROID_ARM_MODE OFF
)
SET
(
ANDROID_ARM_MODE_NAME
"thumb"
)
ELSEIF
(
ANDROID_ARM_MODE OR ANDROID_ARM_MODE STREQUAL
"arm"
)
SET
(
ANDROID_ARM_MODE ON
)
SET
(
ANDROID_ARM_MODE_NAME
"arm"
)
ENDIF
()
IF
(
${
CMAKE_VERSION
}
VERSION_LESS
"3.7.0"
)
IF
(
${
CMAKE_VERSION
}
VERSION_LESS
"3.1.0"
)
SET
(
CMAKE_SYSTEM_NAME
"Linux"
)
ENDIF
()
MESSAGE
(
WARNING
"It is recommended to use CMake >= 3.7.0 (current version: "
"
${
CMAKE_VERSION
}
), when cross-compiling for Android."
)
SET
(
CMAKE_SYSROOT
"
${
ANDROID_STANDALONE_TOOLCHAIN
}
/sysroot"
)
IF
(
NOT CMAKE_SYSTEM_VERSION
)
SET
(
ANDROID_STANDALONE_TOOLCHAIN_API
""
)
SET
(
ANDROID_API_LEVEL_H_REGEX
"^[
\t
]*#[
\t
]*define[
\t
]+__ANDROID_API__[
\t
]+([0-9]+)"
)
FILE
(
STRINGS
"
${
ANDROID_STANDALONE_TOOLCHAIN
}
/sysroot/usr/include/android/api-level.h"
ANDROID_API_LEVEL_H_CONTENT REGEX
"
${
ANDROID_API_LEVEL_H_REGEX
}
"
)
IF
(
ANDROID_API_LEVEL_H_CONTENT MATCHES
"
${
ANDROID_API_LEVEL_H_REGEX
}
"
)
SET
(
ANDROID_STANDALONE_TOOLCHAIN_API
"
${
CMAKE_MATCH_1
}
"
)
ENDIF
()
SET
(
CMAKE_SYSTEM_VERSION
${
ANDROID_STANDALONE_TOOLCHAIN_API
}
)
ENDIF
()
# Toolchain
SET
(
ANDROID_TOOLCHAIN
"gcc"
)
SET
(
ANDROID_TOOLCHAIN_ROOT
${
ANDROID_STANDALONE_TOOLCHAIN
}
)
IF
(
ANDROID_ABI MATCHES
"^armeabi(-v7a)?$"
)
SET
(
ANDROID_TOOLCHAIN_NAME arm-linux-androideabi
)
IF
(
ANDROID_ABI STREQUAL
"armeabi"
)
SET
(
CMAKE_SYSTEM_PROCESSOR armv5te
)
ELSEIF
(
ANDROID_ABI STREQUAL
"armeabi-v7a"
)
SET
(
CMAKE_SYSTEM_PROCESSOR armv7-a
)
ENDIF
()
ENDIF
()
SET
(
ANDROID_TOOLCHAIN_PREFIX
"
${
ANDROID_TOOLCHAIN_ROOT
}
/bin/
${
ANDROID_TOOLCHAIN_NAME
}
-"
)
SET
(
CMAKE_C_COMPILER
"
${
ANDROID_TOOLCHAIN_PREFIX
}
gcc"
)
SET
(
CMAKE_CXX_COMPILER
"
${
ANDROID_TOOLCHAIN_PREFIX
}
g++"
)
# Toolchain and ABI specific flags.
SET
(
ANDROID_COMPILER_FLAGS
"-ffunction-sections -fdata-sections -finline-limit=64"
)
SET
(
ANDROID_LINKER_FLAGS
"-Wl,--gc-sections"
)
IF
(
ANDROID_ABI STREQUAL
"armeabi"
)
LIST
(
APPEND ANDROID_COMPILER_FLAGS
-march=armv5te
-mtune=xscale
-msoft-float
)
ENDIF
()
IF
(
ANDROID_ABI STREQUAL
"armeabi-v7a"
)
LIST
(
APPEND ANDROID_COMPILER_FLAGS
-march=armv7-a
-mfloat-abi=softfp
)
IF
(
ANDROID_ARM_NEON
)
LIST
(
APPEND ANDROID_COMPILER_FLAGS -mfpu=neon
)
ELSE
()
LIST
(
APPEND ANDROID_COMPILER_FLAGS -mfpu=vfpv3-d16
)
ENDIF
()
LIST
(
APPEND ANDROID_LINKER_FLAGS -Wl,--fix-cortex-a8
)
ENDIF
()
IF
(
ANDROID_ABI MATCHES
"^armeabi(-v7a)?$"
)
IF
(
ANDROID_ARM_MODE
)
LIST
(
APPEND ANDROID_COMPILER_FLAGS -marm
)
ELSE
()
LIST
(
APPEND ANDROID_COMPILER_FLAGS -mthumb
)
ENDIF
()
ENDIF
()
STRING
(
REPLACE
";"
" "
ANDROID_COMPILER_FLAGS
"
${
ANDROID_COMPILER_FLAGS
}
"
)
STRING
(
REPLACE
";"
" "
ANDROID_LINKER_FLAGS
"
${
ANDROID_LINKER_FLAGS
}
"
)
SET
(
CMAKE_C_FLAGS
"
${
ANDROID_COMPILER_FLAGS
}
${
CMAKE_C_FLAGS
}
"
CACHE STRING
"c flags"
)
SET
(
CMAKE_CXX_FLAGS
"
${
ANDROID_COMPILER_FLAGS
}
${
CMAKE_CXX_FLAGS
}
"
CACHE STRING
"c++ flags"
)
SET
(
CMAKE_SHARED_LINKER_FLAGS
"
${
ANDROID_LINKER_FLAGS
}
${
CMAKE_SHARED_LINKER_FLAGS
}
"
CACHE STRING
"shared linker flags"
)
SET
(
CMAKE_POSITION_INDEPENDENT_CODE TRUE
)
SET
(
CMAKE_EXE_LINKER_FLAGS
"-pie -fPIE
${
ANDROID_LINKER_FLAGS
}
${
CMAKE_EXE_LINKER_FLAGS
}
"
CACHE STRING
"executable linker flags"
)
MESSAGE
(
STATUS
"Android: Targeting API '
${
CMAKE_SYSTEM_VERSION
}
' "
"with architecture '
${
ANDROID_ARM_MODE_NAME
}
', "
"ABI '
${
ANDROID_ABI
}
', and processor '
${
CMAKE_SYSTEM_PROCESSOR
}
'"
)
MESSAGE
(
STATUS
"System CMAKE_C_FLAGS: "
${
CMAKE_C_FLAGS
}
)
MESSAGE
(
STATUS
"System CMAKE_CXX_FLAGS: "
${
CMAKE_CXX_FLAGS
}
)
ELSE
()
SET
(
CMAKE_ANDROID_STANDALONE_TOOLCHAIN
${
ANDROID_STANDALONE_TOOLCHAIN
}
)
SET
(
CMAKE_ANDROID_ARCH_ABI
${
ANDROID_ABI
}
)
SET
(
CMAKE_ANDROID_ARM_MODE
${
ANDROID_ARM_MODE
}
)
SET
(
CMAKE_ANDROID_ARM_NEON
${
ANDROID_ARM_NEON
}
)
ENDIF
()
cmake/system.cmake
浏览文件 @
d7d2a4f7
...
...
@@ -13,9 +13,9 @@
# limitations under the License.
# Detects the OS and sets appropriate variables.
# CMAKE_SYSTEM_NAME only give us a coarse-grained name
,
# bu
t the name like centos is necessary in some scenes
# to distinguish system for customization.
# CMAKE_SYSTEM_NAME only give us a coarse-grained name
of the OS CMake is
# bu
ilding for, but the host processor name like centos is necessary
#
in some scenes
to distinguish system for customization.
#
# for instance, protobuf libs path is <install_dir>/lib64
# on CentOS, but <install_dir>/lib on other systems.
...
...
@@ -72,12 +72,30 @@ 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"
)
# configuration for cross-compiling
IF
(
DEFINED CMAKE_SYSTEM_NAME
)
IF
(
${
CMAKE_SYSTEM_NAME
}
STREQUAL
"Android"
)
SET
(
ANDROID TRUE
)
INCLUDE
(
cross_compiling/android
)
ENDIF
()
ENDIF
()
# suffix on different os
IF
(
WIN32
)
SET
(
SHARED_LIBRARY_SUFFIX
".dll"
)
SET
(
STATIC_LIBRARY_SUFFIX
".lib"
)
SET
(
EXECUTABLE_SUFFIX
".exe"
)
ELSE
(
WIN32
)
IF
(
APPLE
)
SET
(
SHARED_LIBRARY_SUFFIX
".dylib"
)
ELSE
(
APPLE
)
SET
(
SHARED_LIBRARY_SUFFIX
".so"
)
ENDIF
(
APPLE
)
SET
(
STATIC_LIBRARY_SUFFIX
".a"
)
SET
(
EXECUTABLE_SUFFIX
""
)
ENDIF
(
WIN32
)
# external dependencies log output
SET
(
EXTERNAL_PROJECT_LOG_ARGS
LOG_DOWNLOAD 0
# Wrap download in script to log output
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录