Skip to content

Commit f379bfd

Browse files
authored
Merge pull request #241 from shrit/fix_embedded_cmake
Fix embedded cmake
2 parents 06abb71 + 325ce46 commit f379bfd

13 files changed

Lines changed: 1596 additions & 285 deletions

embedded/crosscompile_random_forest/CMake/Autodownload.cmake

Lines changed: 0 additions & 49 deletions
This file was deleted.

embedded/crosscompile_random_forest/CMake/ConfigureCrossCompile.cmake

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,39 @@
44
# This file will compile OpenBLAS if it is downloaded and it is not
55
# available on your system in order to find the BLAS library. If OpenBLAS will
66
# be compiled, the OPENBLAS_TARGET variable must be set. This can be done
7-
# by, e.g., setting BOARD_NAME (which will set OPENBLAS_TARGET in
8-
# `board/flags-config.cmake`).
7+
# by, e.g., setting ARCH_NAME (which will set OPENBLAS_TARGET in
8+
# `flags-config.cmake`).
99

1010
if (CMAKE_CROSSCOMPILING)
11-
include(board/flags-config.cmake)
11+
include(CMake/crosscompile-arch-config.cmake)
1212
if (NOT CMAKE_SYSROOT AND (NOT TOOLCHAIN_PREFIX))
1313
message(FATAL_ERROR "Neither CMAKE_SYSROOT nor TOOLCHAIN_PREFIX are set; please set both of them and try again.")
1414
elseif(NOT CMAKE_SYSROOT)
1515
message(FATAL_ERROR "Cannot configure: CMAKE_SYSROOT must be set when performing cross-compiling!")
1616
elseif(NOT TOOLCHAIN_PREFIX)
1717
message(FATAL_ERROR "Cannot configure: TOOLCHAIN_PREFIX must be set when performing cross-compiling!")
1818
endif()
19+
20+
# Now make sure that we can still compile a simple test program.
21+
# (This ensures we didn't add any bad CXXFLAGS.)
22+
# Note that OUTPUT_VARIABLE is only available in newer versions of CMake!
23+
# CMake 3.23 (silently) introduced the variable.
24+
include(CheckCXXSourceCompiles)
25+
if (CMAKE_VERSION VERSION_LESS "3.22.0")
26+
check_cxx_source_compiles("int main() { return 0; }" COMPILE_SUCCESS)
27+
if (NOT COMPILE_SUCCESS)
28+
message(FATAL_ERROR "The C++ cross-compiler at ${CMAKE_CXX_COMPILER} is "
29+
"not able to compile a trivial test program. Check the CXXFLAGS!")
30+
endif ()
31+
else ()
32+
check_cxx_source_compiles("int main() { return 0; }" COMPILE_SUCCESS
33+
OUTPUT_VARIABLE COMPILE_OUTPUT)
34+
if (NOT COMPILE_SUCCESS)
35+
message(FATAL_ERROR "The C++ cross-compiler at ${CMAKE_CXX_COMPILER} is "
36+
"not able to compile a trivial test program. Compiler output:\n\n"
37+
"${COMPILE_OUTPUT}")
38+
endif ()
39+
endif ()
1940
endif()
2041

2142
macro(search_openblas version)

embedded/embedded_cmake_template/board/flags-config.cmake renamed to embedded/crosscompile_random_forest/CMake/crosscompile-arch-config.cmake

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,77 +19,82 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto")
1919
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--hash-style=gnu -Wl,--build-id=none")
2020
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,norelro")
2121
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
22-
## Keep the following flag in comment, it will be relevant in the case of MCU's
22+
## Keep the following flag in comment, they might be relevant in the case of MCU's
2323
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-nmagic,-Bsymbolic -nostartfiles")
2424

25+
# BOARD_NAME is deprecated and will be removed in mlpack 5.
26+
# please use ARCH_NAME instead.
2527
set(BOARD_NAME "" CACHE STRING "Specify Board name to optimize for.")
26-
string(TOUPPER ${BOARD_NAME} BOARD)
28+
set(ARCH_NAME "" CACHE STRING "Name of embedded architecture to optimize for.")
29+
30+
if (BOARD_NAME)
31+
set(ARCH_NAME "${BOARD_NAME}")
32+
endif()
33+
34+
string(TOUPPER ${ARCH_NAME} ARCH)
2735

2836
# Set specific platforms CMAKE CXX flags.
29-
if(BOARD MATCHES "RPI0" OR BOARD MATCHES "RPI1" OR BOARD MATCHES "ARM11")
37+
if(ARCH STREQUAL "RPI0" OR ARCH STREQUAL "RPI1" OR ARCH STREQUAL "ARM11")
3038
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=arm1176jzf-s")
3139
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=arm1176jzf-s -mfloat-abi=hard -mfpu=vfp")
3240
set(OPENBLAS_TARGET "ARMV6")
3341
set(OPENBLAS_BINARY "32")
34-
elseif(BOARD MATCHES "RPI2" OR BOARD MATCHES "CORTEXA7")
42+
elseif(ARCH STREQUAL "RPI2" OR ARCH STREQUAL "CORTEXA7")
3543
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=cortex-a7")
3644
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=hard -mfpu=neon-vfpv4")
3745
set(OPENBLAS_TARGET "ARMV7")
3846
set(OPENBLAS_BINARY "32")
39-
elseif(BOARD MATCHES "CORTEXA8")
47+
elseif(ARCH STREQUAL "CORTEXA8")
4048
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=cortex-a8")
4149
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=hard -mfpu=neon")
4250
set(OPENBLAS_TARGET "ARMV7")
4351
set(OPENBLAS_BINARY "32")
44-
elseif(BOARD MATCHES "CORTEXA9")
52+
elseif(ARCH STREQUAL "CORTEXA9")
4553
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=cortex-a9")
4654
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=hard -mfpu=neon")
4755
set(OPENBLAS_TARGET "CORTEXA9")
4856
set(OPENBLAS_BINARY "32")
49-
elseif(BOARD MATCHES "CORTEXA15")
57+
elseif(ARCH STREQUAL "CORTEXA15")
5058
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=cortex-a15")
5159
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=hard -mfpu=neon")
5260
set(OPENBLAS_TARGET "CORTEXA15")
5361
set(OPENBLAS_BINARY "32")
54-
elseif(BOARD MATCHES "RPI3" OR BOARD MATCHES "CORTEXA53")
55-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=cortex-a53 -mfloat-abi=hard")
56-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon-fp-armv8 -mneon-for-64bit")
62+
elseif(ARCH STREQUAL "RPI3" OR ARCH STREQUAL "CORTEXA53")
63+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=cortex-a53 -ftree-vectorize")
5764
set(OPENBLAS_TARGET "CORTEXA53")
5865
set(OPENBLAS_BINARY "64")
59-
elseif(BOARD MATCHES "RPI4" OR BOARD MATCHES "CORTEXA72")
60-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=cortex-a72 -mfloat-abi=hard")
61-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon-fp-armv8 -mneon-for-64bit")
66+
elseif(ARCH STREQUAL "RPI4" OR ARCH STREQUAL "CORTEXA72")
67+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8.2-a+crypto+fp16+rcpc+dotprod -fasynchronous-unwind-tables")
6268
set(OPENBLAS_TARGET "CORTEXA72")
6369
set(OPENBLAS_BINARY "64")
64-
elseif(BOARD MATCHES "JETSONAGX" OR BOARD MATCHES "CORTEXA76")
65-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=cortex-a76 -mfloat-abi=hard")
66-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon-fp-armv8 -mneon-for-64bit")
70+
elseif(ARCH STREQUAL "JETSONAGX" OR ARCH STREQUAL "CORTEXA76")
71+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=cortex-a76 -ftree-vectorize")
6772
set(OPENBLAS_TARGET "CORTEXA76")
6873
set(OPENBLAS_BINARY "64")
69-
elseif(BOARD MATCHES "BV")
74+
elseif(ARCH STREQUAL "BV")
7075
set(OPENBLAS_TARGET "RISCV64_GENERIC")
7176
set(OPENBLAS_BINARY "64")
72-
elseif(BOARD MATCHES "C906")
77+
elseif(ARCH STREQUAL "C906")
7378
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=thead-c906")
7479
set(OPENBLAS_TARGET "RISCV64_GENERIC")
7580
set(OPENBLAS_BINARY "64")
76-
elseif(BOARD MATCHES "x280")
81+
elseif(ARCH STREQUAL "x280")
7782
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=sifive-x280")
7883
set(OPENBLAS_TARGET "x280")
7984
set(OPENBLAS_BINARY "64")
80-
elseif(BOARD MATCHES "KATAMI")
85+
elseif(ARCH STREQUAL "KATAMI")
8186
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=pentium3")
8287
set(OPENBLAS_TARGET "KATAMI")
8388
set(OPENBLAS_BINARY "32")
84-
elseif(BOARD MATCHES "COPPERMINE")
89+
elseif(ARCH STREQUAL "COPPERMINE")
8590
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=pentium3")
8691
set(OPENBLAS_TARGET "COPPERMINE")
8792
set(OPENBLAS_BINARY "32")
88-
elseif(BOARD MATCHES "NORTHWOOD")
93+
elseif(ARCH STREQUAL "NORTHWOOD")
8994
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=pentium4")
9095
set(OPENBLAS_TARGET "NORTHWOOD")
9196
set(OPENBLAS_BINARY "32")
92-
elseif(BOARD)
97+
elseif(ARCH)
9398
## TODO: update documentation with a list of the supported boards.
94-
message(FATAL_ERROR "Given BOARD_NAME is not known; please choose a supported board from the list")
99+
message(FATAL_ERROR "Given ARCH_NAME is not known; please choose a supported board from the list")
95100
endif()

embedded/crosscompile_random_forest/board/crosscompile-toolchain.cmake renamed to embedded/crosscompile_random_forest/CMake/crosscompile-toolchain.cmake

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
## This file handles cross-compilation configurations for aarch64,
2-
## known as arm64. The objective of this file is to find and assign
3-
## cross-compiler and the entire toolchain.
1+
## This file handles cross-compilation configurations for any architecture.
2+
## The objective of this file is to find and assign cross-compiler and the
3+
## entire toolchain.
44
##
55
## This configuration works best with the buildroot toolchain. When using this
66
## file, be sure to set the TOOLCHAIN_PREFIX and CMAKE_SYSROOT variables,
77
## preferably via the CMake configuration command (e.g. `-DCMAKE_SYSROOT=<...>`).
88
##
9-
## Currently, we recommend using buildroot toolchain for
10-
## cross-compilation. Here is the link to download the toolchains:
11-
## https://toolchains.bootlin.com/
9+
## You can use any toochain to produce the cross compiled binaries. However,
10+
## we recommend using buildroot toolchain for cross-compilation. Here is the
11+
## link to download the toolchains: https://toolchains.bootlin.com/
1212

1313
set(CMAKE_SYSTEM_NAME Linux)
1414
set(CMAKE_SYSROOT)

0 commit comments

Comments
 (0)