Skip to content

Commit b1c8557

Browse files
committed
Merge pull request opencv#7690 from alalek:backport_arm_toolchain
2 parents 4d041e6 + a42be1f commit b1c8557

File tree

4 files changed

+210
-89
lines changed

4 files changed

+210
-89
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
set(CMAKE_SYSTEM_PROCESSOR aarch64)
2+
set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version")
3+
set(GNU_MACHINE "aarch64-linux-gnu" CACHE STRING "GNU compiler triple")
4+
include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake")
Lines changed: 3 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,3 @@
1-
set(CMAKE_SYSTEM_NAME Linux)
2-
set(CMAKE_SYSTEM_VERSION 1)
3-
set(CMAKE_SYSTEM_PROCESSOR arm)
4-
5-
set(GCC_COMPILER_VERSION "4.6" CACHE STRING "GCC Compiler version")
6-
7-
set(FLOAT_ABI_SUFFIX "")
8-
9-
if (NOT SOFTFP)
10-
set(FLOAT_ABI_SUFFIX "hf")
11-
endif()
12-
13-
set(CMAKE_C_COMPILER arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-gcc-${GCC_COMPILER_VERSION})
14-
set(CMAKE_CXX_COMPILER arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-g++-${GCC_COMPILER_VERSION})
15-
set(ARM_LINUX_SYSROOT /usr/arm-linux-gnueabi${FLOAT_ABI_SUFFIX} CACHE PATH "ARM cross compilation system root")
16-
17-
set(CMAKE_CXX_FLAGS "" CACHE STRING "c++ flags")
18-
set(CMAKE_C_FLAGS "" CACHE STRING "c flags")
19-
set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "shared linker flags")
20-
set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags")
21-
set(CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "executable linker flags")
22-
23-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
24-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
25-
26-
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now ${CMAKE_SHARED_LINKER_FLAGS}")
27-
set(CMAKE_MODULE_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now ${CMAKE_MODULE_LINKER_FLAGS}")
28-
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now ${CMAKE_EXE_LINKER_FLAGS}")
29-
30-
if(USE_NEON)
31-
message(WARNING "You use obsolete variable USE_NEON to enable NEON instruction set. Use -DENABLE_NEON=ON instead." )
32-
set(ENABLE_NEON TRUE)
33-
elseif(USE_VFPV3)
34-
message(WARNING "You use obsolete variable USE_VFPV3 to enable VFPV3 instruction set. Use -DENABLE_VFPV3=ON instead." )
35-
set(ENABLE_VFPV3 TRUE)
36-
endif()
37-
38-
set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${ARM_LINUX_SYSROOT})
39-
40-
if(EXISTS ${CUDA_TOOLKIT_ROOT_DIR})
41-
set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${CUDA_TOOLKIT_ROOT_DIR})
42-
endif()
43-
44-
set( CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries." )
45-
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
46-
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
47-
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
48-
49-
# macro to find programs on the host OS
50-
macro( find_host_program )
51-
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
52-
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )
53-
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )
54-
if( CMAKE_HOST_WIN32 )
55-
SET( WIN32 1 )
56-
SET( UNIX )
57-
elseif( CMAKE_HOST_APPLE )
58-
SET( APPLE 1 )
59-
SET( UNIX )
60-
endif()
61-
find_program( ${ARGN} )
62-
SET( WIN32 )
63-
SET( APPLE )
64-
SET( UNIX 1 )
65-
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
66-
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
67-
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
68-
endmacro()
69-
70-
# macro to find packages on the host OS
71-
macro( find_host_package )
72-
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
73-
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )
74-
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )
75-
if( CMAKE_HOST_WIN32 )
76-
SET( WIN32 1 )
77-
SET( UNIX )
78-
elseif( CMAKE_HOST_APPLE )
79-
SET( APPLE 1 )
80-
SET( UNIX )
81-
endif()
82-
find_package( ${ARGN} )
83-
SET( WIN32 )
84-
SET( APPLE )
85-
SET( UNIX 1 )
86-
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
87-
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
88-
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
89-
endmacro()
1+
set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version")
2+
set(GNU_MACHINE "arm-linux-gnueabi" CACHE STRING "GNU compiler triple")
3+
include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake")

platforms/linux/arm.toolchain.cmake

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
if(COMMAND toolchain_save_config)
2+
return() # prevent recursive call
3+
endif()
4+
5+
set(CMAKE_SYSTEM_NAME Linux)
6+
set(CMAKE_SYSTEM_VERSION 1)
7+
if(NOT DEFINED CMAKE_SYSTEM_PROCESSOR)
8+
set(CMAKE_SYSTEM_PROCESSOR arm)
9+
else()
10+
#message("CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}")
11+
endif()
12+
13+
include("${CMAKE_CURRENT_LIST_DIR}/gnu.toolchain.cmake")
14+
15+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm AND NOT ARM_IGNORE_FP)
16+
set(FLOAT_ABI_SUFFIX "")
17+
if(NOT SOFTFP)
18+
set(FLOAT_ABI_SUFFIX "hf")
19+
endif()
20+
endif()
21+
22+
if(NOT "x${GCC_COMPILER_VERSION}" STREQUAL "x")
23+
set(__GCC_VER_SUFFIX "-${GCC_COMPILER_VERSION}")
24+
endif()
25+
26+
if(NOT DEFINED CMAKE_C_COMPILER)
27+
find_program(CMAKE_C_COMPILER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-gcc${__GCC_VER_SUFFIX})
28+
else()
29+
#message(WARNING "CMAKE_C_COMPILER=${CMAKE_C_COMPILER} is defined")
30+
endif()
31+
if(NOT DEFINED CMAKE_CXX_COMPILER)
32+
find_program(CMAKE_CXX_COMPILER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-g++${__GCC_VER_SUFFIX})
33+
else()
34+
#message(WARNING "CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} is defined")
35+
endif()
36+
if(NOT DEFINED CMAKE_LINKER)
37+
find_program(CMAKE_LINKER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ld${__GCC_VER_SUFFIX} ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ld)
38+
else()
39+
#message(WARNING "CMAKE_LINKER=${CMAKE_LINKER} is defined")
40+
endif()
41+
if(NOT DEFINED CMAKE_AR)
42+
find_program(CMAKE_AR NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ar${__GCC_VER_SUFFIX} ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ar)
43+
else()
44+
#message(WARNING "CMAKE_AR=${CMAKE_AR} is defined")
45+
endif()
46+
47+
if(NOT DEFINED ARM_LINUX_SYSROOT AND DEFINED GNU_MACHINE)
48+
set(ARM_LINUX_SYSROOT /usr/${GNU_MACHINE}${FLOAT_ABI_SUFFIX})
49+
endif()
50+
51+
if(NOT DEFINED CMAKE_CXX_FLAGS)
52+
set(CMAKE_CXX_FLAGS "" CACHE INTERAL "")
53+
set(CMAKE_C_FLAGS "" CACHE INTERAL "")
54+
set(CMAKE_SHARED_LINKER_FLAGS "" CACHE INTERAL "")
55+
set(CMAKE_MODULE_LINKER_FLAGS "" CACHE INTERAL "")
56+
set(CMAKE_EXE_LINKER_FLAGS "" CACHE INTERAL "")
57+
58+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
59+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
60+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
61+
set(CMAKE_CXX_FLAGS "-mthumb ${CMAKE_CXX_FLAGS}")
62+
set(CMAKE_C_FLAGS "-mthumb ${CMAKE_C_FLAGS}")
63+
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,nocopyreloc")
64+
endif()
65+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
66+
set(ARM_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
67+
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
68+
set(ARM_LINKER_FLAGS "-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
69+
endif()
70+
set(CMAKE_SHARED_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
71+
set(CMAKE_MODULE_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
72+
set(CMAKE_EXE_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
73+
else()
74+
#message(WARNING "CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}' is defined")
75+
endif()
76+
77+
if(USE_NEON)
78+
message(WARNING "You use obsolete variable USE_NEON to enable NEON instruction set. Use -DENABLE_NEON=ON instead." )
79+
set(ENABLE_NEON TRUE)
80+
elseif(USE_VFPV3)
81+
message(WARNING "You use obsolete variable USE_VFPV3 to enable VFPV3 instruction set. Use -DENABLE_VFPV3=ON instead." )
82+
set(ENABLE_VFPV3 TRUE)
83+
endif()
84+
85+
set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${ARM_LINUX_SYSROOT})
86+
87+
if(EXISTS ${CUDA_TOOLKIT_ROOT_DIR})
88+
set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${CUDA_TOOLKIT_ROOT_DIR})
89+
endif()
90+
91+
set(TOOLCHAIN_CONFIG_VARS ${TOOLCHAIN_CONFIG_VARS}
92+
ARM_LINUX_SYSROOT
93+
ENABLE_NEON
94+
ENABLE_VFPV3
95+
CUDA_TOOLKIT_ROOT_DIR
96+
)
97+
toolchain_save_config()

platforms/linux/gnu.toolchain.cmake

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
cmake_minimum_required(VERSION 2.8)
2+
3+
# load settings in case of "try compile"
4+
set(TOOLCHAIN_CONFIG_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/toolchain.config.cmake")
5+
get_property(__IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)
6+
if(__IN_TRY_COMPILE)
7+
include("${CMAKE_CURRENT_SOURCE_DIR}/../toolchain.config.cmake" OPTIONAL) # CMAKE_BINARY_DIR is different
8+
macro(toolchain_save_config)
9+
# nothing
10+
endmacro()
11+
else()
12+
macro(toolchain_save_config)
13+
set(__config "#message(\"Load TOOLCHAIN config...\")\n")
14+
get_cmake_property(__variableNames VARIABLES)
15+
set(__vars_list ${ARGN})
16+
list(APPEND __vars_list
17+
${TOOLCHAIN_CONFIG_VARS}
18+
CMAKE_SYSTEM_NAME
19+
CMAKE_SYSTEM_VERSION
20+
CMAKE_SYSTEM_PROCESSOR
21+
CMAKE_C_COMPILER
22+
CMAKE_CXX_COMPILER
23+
CMAKE_C_FLAGS
24+
CMAKE_CXX_FLAGS
25+
CMAKE_SHARED_LINKER_FLAGS
26+
CMAKE_MODULE_LINKER_FLAGS
27+
CMAKE_EXE_LINKER_FLAGS
28+
CMAKE_SKIP_RPATH
29+
CMAKE_FIND_ROOT_PATH
30+
GCC_COMPILER_VERSION
31+
)
32+
foreach(__var ${__variableNames})
33+
foreach(_v ${__vars_list})
34+
if("x${__var}" STREQUAL "x${_v}")
35+
if(${__var} MATCHES " ")
36+
set(__config "${__config}set(${__var} \"${${__var}}\")\n")
37+
else()
38+
set(__config "${__config}set(${__var} ${${__var}})\n")
39+
endif()
40+
endif()
41+
endforeach()
42+
endforeach()
43+
if(EXISTS "${TOOLCHAIN_CONFIG_FILE}")
44+
file(READ "${TOOLCHAIN_CONFIG_FILE}" __config_old)
45+
endif()
46+
if("${__config_old}" STREQUAL "${__config}")
47+
# nothing
48+
else()
49+
#message("Update TOOLCHAIN config: ${__config}")
50+
file(WRITE "${TOOLCHAIN_CONFIG_FILE}" "${__config}")
51+
endif()
52+
unset(__config)
53+
unset(__config_old)
54+
unset(__vars_list)
55+
unset(__variableNames)
56+
endmacro()
57+
endif() # IN_TRY_COMPILE
58+
59+
set(CMAKE_SKIP_RPATH TRUE)
60+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
61+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
62+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
63+
64+
# macro to find programs on the host OS
65+
macro(find_host_program)
66+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
67+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
68+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
69+
if(CMAKE_HOST_WIN32)
70+
SET(WIN32 1)
71+
SET(UNIX)
72+
elseif(CMAKE_HOST_APPLE)
73+
SET(APPLE 1)
74+
SET(UNIX)
75+
endif()
76+
find_program(${ARGN})
77+
SET(WIN32)
78+
SET(APPLE)
79+
SET(UNIX 1)
80+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
81+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
82+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
83+
endmacro()
84+
85+
# macro to find packages on the host OS
86+
macro(find_host_package)
87+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
88+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
89+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
90+
if(CMAKE_HOST_WIN32)
91+
SET(WIN32 1)
92+
SET(UNIX)
93+
elseif(CMAKE_HOST_APPLE)
94+
SET(APPLE 1)
95+
SET(UNIX)
96+
endif()
97+
find_package(${ARGN})
98+
SET(WIN32)
99+
SET(APPLE)
100+
SET(UNIX 1)
101+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
102+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
103+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
104+
endmacro()
105+
106+
set(CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries.")

0 commit comments

Comments
 (0)