toolchain: xcc: use Clang if exists
The XCC toolchain may come with Clang front-end depending on how it's built. Currently, the only SoC/board using XCC is the intel_s1000_crb and its XCC toolchain comes with Clang 3.9.0 which has a lot better support for C99 and C++11 than the portion based on GCC 4.2 (which does not even support C++11). So this change attempts to use the Clang portion instead of GCC if the Clang executable exists. Signed-off-by: Daniel Leung <daniel.leung@intel.com>
This commit is contained in:
parent
e6cf37a857
commit
e73231f7f0
|
@ -73,6 +73,11 @@ include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_optimizations.cmake)
|
|||
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_cpp.cmake)
|
||||
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_asm.cmake)
|
||||
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_baremetal.cmake)
|
||||
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_warnings.cmake)
|
||||
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_imacros.cmake)
|
||||
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_base.cmake)
|
||||
|
||||
if(CC STREQUAL "clang")
|
||||
include(${ZEPHYR_BASE}/cmake/compiler/clang/target_warnings.cmake)
|
||||
else()
|
||||
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_warnings.cmake)
|
||||
endif()
|
||||
|
|
|
@ -23,15 +23,20 @@ set(SYSROOT_DIR ${TOOLCHAIN_HOME}/${SYSROOT_TARGET})
|
|||
# xt-xcc does not support -Og, so make it -O0
|
||||
set(OPTIMIZE_FOR_DEBUG_FLAG "-O0")
|
||||
|
||||
set(CC xcc)
|
||||
set(C++ xc++)
|
||||
if(EXISTS ${CROSS_COMPILE}clang)
|
||||
set(CC clang)
|
||||
set(C++ clang++)
|
||||
else()
|
||||
set(CC xcc)
|
||||
set(C++ xc++)
|
||||
|
||||
list(APPEND TOOLCHAIN_C_FLAGS
|
||||
-imacros${ZEPHYR_BASE}/include/toolchain/xcc_missing_defs.h
|
||||
)
|
||||
endif()
|
||||
|
||||
set(NOSYSDEF_CFLAG "")
|
||||
|
||||
list(APPEND TOOLCHAIN_C_FLAGS -fms-extensions)
|
||||
|
||||
list(APPEND TOOLCHAIN_C_FLAGS
|
||||
-imacros${ZEPHYR_BASE}/include/toolchain/xcc_missing_defs.h
|
||||
)
|
||||
|
||||
set(TOOLCHAIN_HAS_NEWLIB OFF CACHE BOOL "True if toolchain supports newlib")
|
||||
|
|
|
@ -11,10 +11,18 @@
|
|||
* there. However, __BYTE_ORDER__ is actually being defined later in
|
||||
* this file. So define __BYTE_ORDER__ to skip the check in gcc.h
|
||||
* and undefine after including gcc.h.
|
||||
*
|
||||
* Clang has it defined so there is no need to work around.
|
||||
*/
|
||||
#ifndef __clang__
|
||||
#define __BYTE_ORDER__
|
||||
#endif
|
||||
|
||||
#include <toolchain/gcc.h>
|
||||
|
||||
#ifndef __clang__
|
||||
#undef __BYTE_ORDER__
|
||||
#endif
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
|
@ -22,8 +30,12 @@
|
|||
#define UINT32_C(x) x ## U
|
||||
#endif
|
||||
|
||||
/* XCC doesn't support __COUNTER__ but this should be good enough */
|
||||
#ifndef __COUNTER__
|
||||
/* XCC (GCC-based compiler) doesn't support __COUNTER__
|
||||
* but this should be good enough
|
||||
*/
|
||||
#define __COUNTER__ __LINE__
|
||||
#endif
|
||||
|
||||
#undef __in_section_unique
|
||||
#define __in_section_unique(seg) \
|
||||
|
|
|
@ -2,5 +2,10 @@
|
|||
|
||||
zephyr_library_sources_ifdef(CONFIG_CPLUSPLUS cpp_fixes.c)
|
||||
zephyr_library_sources_ifdef(CONFIG_NEWLIB_LIBC newlib_fixes.c)
|
||||
|
||||
if(NOT (CC STREQUAL "clang"))
|
||||
# These two are due to IS_ENABLED() not being parsed correctly
|
||||
# in old GCC 4.2 based XCC. Clang is not affected.
|
||||
zephyr_library_sources_ifdef(CONFIG_LOG_MINIMAL log_minimal_fixes.c)
|
||||
zephyr_library_sources_ifdef(CONFIG_TEST ztest_fixes.c)
|
||||
endif()
|
||||
|
|
Loading…
Reference in a new issue