Build: Enable C++ support during compilation
Adds support for CXX to TF-M's build system. This is required for any
secure partitions that wish to make use of C++, for example, and avoids
manual changes being applied to TF-M when C++ needs to be enabled in
projects.
Signed-off-by: Rajkumar Kanagaraj <rajkumar.kanagaraj@linaro.org>
Change-Id: Id8f9842776589a8e9315d6a1059e1330b368a45c
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 380168b..e8ac067 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -43,7 +43,7 @@
include(${TFM_TOOLCHAIN_FILE})
set(CMAKE_PROJECT_INCLUDE_BEFORE ${CMAKE_SOURCE_DIR}/cmake/disable_compiler_detection.cmake)
-project("Trusted Firmware M" VERSION ${TFM_VERSION} LANGUAGES C ASM)
+project("Trusted Firmware M" VERSION ${TFM_VERSION} LANGUAGES C CXX ASM)
tfm_toolchain_reload_compiler()
# Synchronise the install path variables. If CMAKE_INSTALL_PREFIX is manually
diff --git a/cmake/disable_compiler_detection.cmake b/cmake/disable_compiler_detection.cmake
index ebafca0..215221a 100644
--- a/cmake/disable_compiler_detection.cmake
+++ b/cmake/disable_compiler_detection.cmake
@@ -7,3 +7,4 @@
#Stop cmake running compiler tests.
set (CMAKE_C_COMPILER_FORCED true)
+set (CMAKE_CXX_COMPILER_FORCED true)
diff --git a/platform/ext/common/gcc/tfm_common_s.ld b/platform/ext/common/gcc/tfm_common_s.ld
index 29561d7..fe370e6 100644
--- a/platform/ext/common/gcc/tfm_common_s.ld
+++ b/platform/ext/common/gcc/tfm_common_s.ld
@@ -194,7 +194,6 @@
Image$$ER_CODE_SRAM$$Limit = ADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM);
#endif
-#if TFM_LVL != 1
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
@@ -207,8 +206,6 @@
} > FLASH
__exidx_end = .;
-#endif /* TFM_LVL != 1 */
-
.ER_TFM_CODE : ALIGN(4)
{
*startup*(.text*)
diff --git a/toolchain_ARMCLANG.cmake b/toolchain_ARMCLANG.cmake
index f90f94a..5d3f682 100644
--- a/toolchain_ARMCLANG.cmake
+++ b/toolchain_ARMCLANG.cmake
@@ -9,6 +9,7 @@
SET(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_COMPILER armclang)
+set(CMAKE_CXX_COMPILER armclang)
set(CMAKE_ASM_COMPILER armasm)
set(LINKER_VENEER_OUTPUT_FLAG --import_cmse_lib_out=)
@@ -24,25 +25,27 @@
set_property(DIRECTORY PROPERTY COMPILE_OPTIONS "")
add_compile_options(
- $<$<COMPILE_LANGUAGE:C>:-Wno-ignored-optimization-argument>
- $<$<COMPILE_LANGUAGE:C>:-Wno-unused-command-line-argument>
- $<$<COMPILE_LANGUAGE:C>:-Wall>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wno-ignored-optimization-argument>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wno-unused-command-line-argument>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wall>
# Don't error when the MBEDTLS_NULL_ENTROPY warning is shown
- $<$<COMPILE_LANGUAGE:C>:-Wno-error=cpp>
- $<$<COMPILE_LANGUAGE:C>:-c>
- $<$<COMPILE_LANGUAGE:C>:-fdata-sections>
- $<$<COMPILE_LANGUAGE:C>:-ffunction-sections>
- $<$<COMPILE_LANGUAGE:C>:-fno-builtin>
- $<$<COMPILE_LANGUAGE:C>:-fshort-enums>
- $<$<COMPILE_LANGUAGE:C>:-fshort-wchar>
- $<$<COMPILE_LANGUAGE:C>:-funsigned-char>
- $<$<COMPILE_LANGUAGE:C>:-masm=auto>
- $<$<COMPILE_LANGUAGE:C>:-nostdlib>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wno-error=cpp>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-c>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fdata-sections>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-ffunction-sections>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fno-builtin>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fshort-enums>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fshort-wchar>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-funsigned-char>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-masm=auto>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-nostdlib>
$<$<COMPILE_LANGUAGE:C>:-std=c99>
- $<$<COMPILE_LANGUAGE:C>:-mfpu=none>
+ $<$<COMPILE_LANGUAGE:CXX>:-std=c++11>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-mfpu=none>
$<$<COMPILE_LANGUAGE:ASM>:--fpu=none>
$<$<COMPILE_LANGUAGE:ASM>:--cpu=${CMAKE_ASM_CPU_FLAG}>
$<$<AND:$<COMPILE_LANGUAGE:C>,$<BOOL:${TFM_DEBUG_SYMBOLS}>>:-g>
+ $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<BOOL:${TFM_DEBUG_SYMBOLS}>>:-g>
)
endmacro()
@@ -116,6 +119,7 @@
set(CMAKE_SYSTEM_ARCH ${TFM_SYSTEM_ARCHITECTURE})
set(CMAKE_C_COMPILER_TARGET arm-${CROSS_COMPILE})
+ set(CMAKE_CXX_COMPILER_TARGET arm-${CROSS_COMPILE})
set(CMAKE_ASM_COMPILER_TARGET arm-${CROSS_COMPILE})
# MVE is currently not supported in case of armclang
@@ -135,6 +139,8 @@
include(Compiler/ARMClang)
set(CMAKE_C_COMPILER_PROCESSOR_LIST ${CMAKE_SYSTEM_PROCESSOR})
set(CMAKE_C_COMPILER_ARCH_LIST ${CMAKE_SYSTEM_ARCH})
+ set(CMAKE_CXX_COMPILER_PROCESSOR_LIST ${CMAKE_SYSTEM_PROCESSOR})
+ set(CMAKE_CXX_COMPILER_ARCH_LIST ${CMAKE_SYSTEM_ARCH})
set(CMAKE_ASM_COMPILER_PROCESSOR_LIST ${CMAKE_SYSTEM_PROCESSOR})
set(CMAKE_ASM_COMPILER_ARCH_LIST ${CMAKE_SYSTEM_ARCH})
endmacro()
@@ -145,6 +151,7 @@
tfm_toolchain_reset_linker_flags()
unset(CMAKE_C_FLAGS_INIT)
+ unset(CMAKE_CXX_FLAGS_INIT)
unset(CMAKE_C_LINK_FLAGS)
unset(CMAKE_ASM_FLAGS_INIT)
unset(CMAKE_ASM_LINK_FLAGS)
@@ -173,18 +180,23 @@
if (DEFINED TFM_SYSTEM_PROCESSOR)
set(CMAKE_C_FLAGS "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
set(CMAKE_C_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
+ set(CMAKE_CXX_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
set(CMAKE_ASM_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
# But armlink doesn't support this +dsp syntax
string(REGEX REPLACE "\\+nodsp" "" CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS}")
+ string(REGEX REPLACE "\\+nodsp" "" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
string(REGEX REPLACE "\\+nodsp" "" CMAKE_ASM_LINK_FLAGS "${CMAKE_ASM_LINK_FLAGS}")
# And uses different syntax for +nofp
string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS}")
+ string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_ASM_LINK_FLAGS "${CMAKE_ASM_LINK_FLAGS}")
string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS}")
+ string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_ASM_LINK_FLAGS "${CMAKE_ASM_LINK_FLAGS}")
else()
set(CMAKE_C_FLAGS "-march=${CMAKE_SYSTEM_ARCH}")
+ set(CMAKE_CXX_FLAGS "-march=${CMAKE_SYSTEM_ARCH}")
endif()
# Workaround for issues with --depend-single-line with armasm and Ninja
diff --git a/toolchain_GNUARM.cmake b/toolchain_GNUARM.cmake
index 7978eac..d044ed4 100644
--- a/toolchain_GNUARM.cmake
+++ b/toolchain_GNUARM.cmake
@@ -14,6 +14,10 @@
message(FATAL_ERROR "Could not find compiler: '${CROSS_COMPILE}-gcc'")
endif()
+if(CMAKE_CXX_COMPILER STREQUAL "CMAKE_CXX_COMPILER-NOTFOUND")
+ message(FATAL_ERROR "Could not find compiler: '${CROSS_COMPILE}-g++'")
+endif()
+
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
set(LINKER_VENEER_OUTPUT_FLAG -Wl,--cmse-implib,--out-implib=)
@@ -48,7 +52,8 @@
-funsigned-char
-mthumb
-nostdlib
- -std=c99
+ $<$<COMPILE_LANGUAGE:C>:-std=c99>
+ $<$<COMPILE_LANGUAGE:CXX>:-std=c++11>
$<$<OR:$<BOOL:${TFM_DEBUG_SYMBOLS}>,$<BOOL:${TFM_CODE_COVERAGE}>>:-g>
)
endmacro()
@@ -166,21 +171,25 @@
endif()
unset(CMAKE_C_FLAGS_INIT)
+ unset(CMAKE_CXX_FLAGS_INIT)
unset(CMAKE_ASM_FLAGS_INIT)
if (CMAKE_SYSTEM_PROCESSOR)
set(CMAKE_C_FLAGS_INIT "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
+ set(CMAKE_CXX_FLAGS_INIT "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
set(CMAKE_ASM_FLAGS_INIT "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
set(CMAKE_C_LINK_FLAGS "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
set(CMAKE_ASM_LINK_FLAGS "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
else()
set(CMAKE_C_FLAGS_INIT "-march=${CMAKE_SYSTEM_ARCH}")
+ set(CMAKE_CXX_FLAGS_INIT "-march=${CMAKE_SYSTEM_ARCH}")
set(CMAKE_ASM_FLAGS_INIT "-march=${CMAKE_SYSTEM_ARCH}")
set(CMAKE_C_LINK_FLAGS "-march=${CMAKE_SYSTEM_ARCH}")
set(CMAKE_ASM_LINK_FLAGS "-march=${CMAKE_SYSTEM_ARCH}")
endif()
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS_INIT})
+ set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS_INIT})
set(CMAKE_ASM_FLAGS ${CMAKE_ASM_FLAGS_INIT})
set(BL2_COMPILER_CP_FLAG -mfloat-abi=soft)