-
Notifications
You must be signed in to change notification settings - Fork 5.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add cross-compiling toolchain files for Android and Raspberry Pi. #1973
Merged
Merged
Changes from all commits
Commits
Show all changes
20 commits
Select commit
Hold shift + click to select a range
d7d2a4f
Add cross-compiling toolchain for Android.
Xreki c609003
Support the auto-compiling for host protoc when cross-compiling.
Xreki 285daf9
Support the auto-compiling for openblas when cross-compiling for Andr…
Xreki 39f9056
Config HOST_C/CXX_COMPILER for cross-compiling.
Xreki af80ff9
Allow the case user sets CMAKE_C_COMPILER directly instead of standal…
Xreki c914f63
Add toolchain for raspberry pi.
Xreki 01bee86
Merge branch 'develop' into cmake_protobuf
Xreki a183960
Merge branch 'develop' into cmake_protobuf
Xreki f2b3527
Fix typo.
Xreki e678546
Change ${TARGET_NAME}_INCLUDE_DIR to PARENT_SCOPE.
Xreki c27e71e
Merge branch 'develop' into cmake_protobuf
Xreki 1ddb9bf
Delete the configuration of fortran compiler.
Xreki 1dafbab
Merge branch 'develop' into cmake_protobuf
Xreki 668a1b8
Correct the definition of PROTOBUF_VERSION.
Xreki b55bde1
Fix bug of setting external_project_dependencies in cmake.
Xreki 33fb2d6
Add some annotations to different OpenBLAS versions.
Xreki ab9c943
Merge branch 'develop' into cmake_protobuf
Xreki 47150d4
Merge branch 'cmake_protobuf' of https://github.com/Xreki/Paddle into…
Xreki c62357e
Merge branch 'develop' into cmake_protobuf
Xreki 233d897
Merge branch 'develop' into cmake_protobuf
Xreki File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,191 @@ | ||
# 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 variables are listed belows: | ||
# | ||
# ANDROID_STANDALONE_TOOLCHAIN | ||
# ANDROID_ABI | ||
# ANDROID_NATIVE_API_LEVEL | ||
# 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(WARNING "It is recommended to 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\n") | ||
ENDIF() | ||
|
||
IF(NOT DEFINED CMAKE_SYSTEM_VERSION AND 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() | ||
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(ANDROID_ARM_MODE) | ||
SET(ANDROID_ARM_MODE_NAME "arm") | ||
ELSE(ANDROID_ARM_MODE) | ||
SET(ANDROID_ARM_MODE_NAME "thumb") | ||
ENDIF(ANDROID_ARM_MODE) | ||
|
||
IF(NOT DEFINED ANDROID_ARM_NEON) | ||
SET(ANDROID_ARM_NEON ON) | ||
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.") | ||
|
||
IF(ANDROID_STANDALONE_TOOLCHAIN) | ||
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}-") | ||
ENDIF() | ||
|
||
# C compiler | ||
IF(NOT CMAKE_C_COMPILER) | ||
SET(ANDROID_C_COMPILER "${ANDROID_TOOLCHAIN_PREFIX}gcc") | ||
ELSE() | ||
GET_FILENAME_COMPONENT(ANDROID_C_COMPILER ${CMAKE_C_COMPILER} PROGRAM) | ||
ENDIF() | ||
IF(NOT EXISTS ${ANDROID_C_COMPILER}) | ||
MESSAGE(FATAL_ERROR "Cannot find C compiler: ${ANDROID_C_COMPILER}") | ||
ENDIF() | ||
|
||
# CXX compiler | ||
IF(NOT CMAKE_CXX_COMPILER) | ||
SET(ANDROID_CXX_COMPILER "${ANDROID_TOOLCHAIN_PREFIX}g++") | ||
ELSE() | ||
GET_FILENAME_COMPONENT(ANDROID_CXX_COMPILER ${CMAKE_CXX_COMPILER} PROGRAM) | ||
ENDIF() | ||
IF(NOT EXISTS ${ANDROID_CXX_COMPILER}) | ||
MESSAGE(FATAL_ERROR "Cannot find CXX compiler: ${ANDROID_CXX_COMPILER}") | ||
ENDIF() | ||
|
||
SET(CMAKE_C_COMPILER ${ANDROID_C_COMPILER} CACHE PATH "C compiler" FORCE) | ||
SET(CMAKE_CXX_COMPILER ${ANDROID_CXX_COMPILER} CACHE PATH "CXX compiler" FORCE) | ||
|
||
# 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 "CXX 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() | ||
IF(ANDROID_STANDALONE_TOOLCHAIN) | ||
SET(CMAKE_ANDROID_STANDALONE_TOOLCHAIN ${ANDROID_STANDALONE_TOOLCHAIN}) | ||
ENDIF() | ||
SET(CMAKE_ANDROID_ARCH_ABI ${ANDROID_ABI}) | ||
SET(CMAKE_ANDROID_ARM_MODE ${ANDROID_ARM_MODE}) | ||
SET(CMAKE_ANDROID_ARM_NEON ${ANDROID_ARM_NEON}) | ||
ENDIF() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
# 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. | ||
|
||
# find host C compiler | ||
IF(HOST_C_COMPILER) | ||
SET(HOST_C_COMPILER_NAME ${HOST_C_COMPILER}) | ||
ELSEIF(NOT $ENV{CC} STREQUAL "") | ||
SET(HOST_C_COMPILER_NAME $ENV{CC}) | ||
ELSE() | ||
SET(HOST_C_COMPILER_NAME cc) | ||
ENDIF() | ||
|
||
GET_FILENAME_COMPONENT(HOST_C_COMPILER_PATH ${HOST_C_COMPILER_NAME} PROGRAM) | ||
IF(NOT HOST_C_COMPILER_PATH OR NOT EXISTS ${HOST_C_COMPILER_PATH}) | ||
MESSAGE(FATAL_ERROR "Cannot find host C compiler, set host C compiler:\n" | ||
"\tcmake .. -DHOST_C_COMPILER=...") | ||
ENDIF() | ||
|
||
# find host CXX compiler | ||
IF(HOST_CXX_COMPILER) | ||
SET(HOST_CXX_COMPILER_NAME ${HOST_CXX_COMPILER}) | ||
ELSEIF(NOT $ENV{CXX} STREQUAL "") | ||
SET(HOST_CXX_COMPILER_NAME $ENV{CXX}) | ||
ELSE() | ||
SET(HOST_CXX_COMPILER_NAME c++) | ||
ENDIF() | ||
|
||
GET_FILENAME_COMPONENT(HOST_CXX_COMPILER_PATH ${HOST_CXX_COMPILER_NAME} PROGRAM) | ||
IF(NOT HOST_CXX_COMPILER_PATH OR NOT EXISTS ${HOST_CXX_COMPILER_PATH}) | ||
MESSAGE(FATAL_ERROR "Cannot find host CXX compiler, set host CXX compiler:\n" | ||
"\tcmake .. -DHOST_CXX_COMPILER=...") | ||
ENDIF() | ||
|
||
SET(HOST_C_COMPILER ${HOST_C_COMPILER_PATH} CACHE PATH "Host C compiler") | ||
SET(HOST_CXX_COMPILER ${HOST_CXX_COMPILER_PATH} CACHE PATH "Host CXX compiler") | ||
|
||
MESSAGE(STATUS "Found host C compiler: " ${HOST_C_COMPILER}) | ||
MESSAGE(STATUS "Found host CXX compiler: " ${HOST_CXX_COMPILER}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
# 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 Raspberry Pi. | ||
# The supported variables are listed belows: | ||
# | ||
# RPI_TOOLCHAIN | ||
# RPI_ARM_NEON | ||
# | ||
# Also you can set CMAKE_C/CXX_COMPILER yourself, through cmake arguments. | ||
|
||
IF(NOT RPI) | ||
return() | ||
ENDIF() | ||
|
||
SET(CMAKE_SYSTEM_NAME Linux) | ||
SET(CMAKE_SYSTEM_VERSION 1) | ||
SET(CMAKE_SYSTEM_PROCESSOR arm) | ||
|
||
# check the exist of raspberry pi toolchain | ||
IF(NOT DEFINED RPI_TOOLCHAIN) | ||
SET(RPI_TOOLCHAIN $ENV{RPI_TOOLCHAIN} | ||
CACHE PATH "Folder holds the toolchain of Raspberr Pi") | ||
ENDIF() | ||
IF(NOT RPI_TOOLCHAIN) | ||
MESSAGE(WARNING "It is recommended to set RPI_TOOLCHAIN to use toolchain.\n" | ||
"To cross-compile for Raspberry Pi, you need to download the tools using:\n" | ||
" git clone https://github.com/raspberrypi/tools\n") | ||
ENDIF() | ||
|
||
IF(NOT DEFINED RPI_ARM_NEON) | ||
SET(RPI_ARM_NEON ON) | ||
ENDIF() | ||
|
||
IF(RPI_TOOLCHAIN) | ||
SET(RPI_TOOLCHAIN_ROOT ${RPI_TOOLCHAIN}) | ||
IF(RPI_TOOLCHAIN_ROOT MATCHES "gcc-linaro-arm-linux-gnueabihf-raspbian(-x64)?$") | ||
# gcc-linaro-arm-linux-gnueabihf-raspbian | ||
# gcc-linaro-arm-linux-gnueabihf-raspbian-x64 | ||
SET(RPI_TOOLCHAIN_NAME arm-linux-gnueabihf) | ||
ENDIF() | ||
SET(RPI_TOOLCHAIN_PREFIX "${RPI_TOOLCHAIN_ROOT}/bin/${RPI_TOOLCHAIN_NAME}-") | ||
ENDIF() | ||
|
||
# C compiler | ||
IF(NOT CMAKE_C_COMPILER) | ||
SET(RPI_C_COMPILER "${RPI_TOOLCHAIN_PREFIX}gcc") | ||
ELSE() | ||
GET_FILENAME_COMPONENT(RPI_C_COMPILER ${CMAKE_C_COMPILER} PROGRAM) | ||
ENDIF() | ||
IF(NOT EXISTS ${RPI_C_COMPILER}) | ||
MESSAGE(FATAL_ERROR "Cannot find C compiler: ${RPI_C_COMPILER}") | ||
ENDIF() | ||
|
||
# CXX compiler | ||
IF(NOT CMAKE_CXX_COMPILER) | ||
SET(RPI_CXX_COMPILER "${RPI_TOOLCHAIN_PREFIX}g++") | ||
ELSE() | ||
GET_FILENAME_COMPONENT(RPI_CXX_COMPILER ${CMAKE_CXX_COMPILER} PROGRAM) | ||
ENDIF() | ||
IF(NOT EXISTS ${RPI_CXX_COMPILER}) | ||
MESSAGE(FATAL_ERROR "Cannot find CXX compiler: ${RPI_CXX_COMPILER}") | ||
ENDIF() | ||
|
||
SET(CMAKE_C_COMPILER ${RPI_C_COMPILER} CACHE PATH "C compiler" FORCE) | ||
SET(CMAKE_CXX_COMPILER ${RPI_CXX_COMPILER} CACHE PATH "CXX compiler" FORCE) | ||
|
||
IF(RPI_ARM_NEON) | ||
SET(RPI_C_FLAGS "${RPI_C_FLAGS} -mfpu=neon") | ||
ENDIF() | ||
|
||
SET(CMAKE_C_FLAGS "${RPI_C_FLAGS} ${CMAKE_C_FLAGS}" CACHE STRING "C flags") | ||
SET(CMAKE_CXX_FLAGS "${RPI_C_FLAGS} ${CMAKE_CXX_FLAGS}" CACHE STRING "CXX flags") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这个不需要判断吧,include(raspberry_pi.cmake)前已经判断了。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
每个toolchain file最开始都做了双重判断。留着保险一些吧。