1if (HEXAGON_TOOLCHAIN_INCLUDED)
2 return()
3endif()
4set(HEXAGON_TOOLCHAIN_INCLUDED true)
5
6#Cross Compiling for Hexagon
7set(HEXAGON TRUE)
8set(CMAKE_SYSTEM_NAME QURT)
9set(CMAKE_SYSTEM_PROCESSOR Hexagon)
10set(CMAKE_SYSTEM_VERSION "1") #${HEXAGON_PLATFORM_LEVEL})
11set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
12set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
13set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
14set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
15set(CUSTOM_RUNELF_PATH "")
16
17#To fix backward compatibility with EAI addon.
18if (NOT HEXAGON_SDK_ROOT)
19 set(HEXAGON_SDK_ROOT $ENV{HEXAGON_SDK_ROOT})
20endif()
21
22if (NOT HEXAGON_TOOLS_ROOT)
23 if (DEFINED ENV{HEXAGON_TOOLS_ROOT})
24 set(HEXAGON_TOOLS_ROOT $ENV{HEXAGON_TOOLS_ROOT})
25 endif()
26 if(NOT HEXAGON_TOOLS_ROOT)
27 set(HEXAGON_TOOLS_ROOT $ENV{DEFAULT_HEXAGON_TOOLS_ROOT})
28 endif()
29endif()
30
31file(TO_CMAKE_PATH "${HEXAGON_TOOLS_ROOT}" HEXAGON_TOOLS_ROOT)
32file(TO_CMAKE_PATH "${HEXAGON_SDK_ROOT}" HEXAGON_SDK_ROOT)
33
34#Get the Binary extension of the Hexagon Toolchain
35if(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
36 set(HEXAGON_TOOLCHAIN_SUFFIX .exe)
37endif()
38message(DEBUG "CMAKE_HOST_SYSTEM_NAME:${CMAKE_HOST_SYSTEM_NAME}")
39
40include(${HEXAGON_SDK_ROOT}/build/cmake/hexagon_arch.cmake)
41
42set(HEXAGON_TOOLCHAIN ${HEXAGON_TOOLS_ROOT})
43set(HEXAGON_LIB_DIR "${HEXAGON_TOOLCHAIN}/Tools/target/hexagon/lib")
44set(HEXAGON_ISS_DIR ${HEXAGON_TOOLCHAIN}/Tools/lib/iss)
45
46set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES
47 HEXAGON_SDK_ROOT
48 HEXAGON_TOOLS_ROOT
49)
50
51#QURT Related includes and linker flags
52set(V_ARCH ${HEXAGON_ARCH})
53set(_QURT_INSTALL_DIR "${HEXAGON_SDK_ROOT}/rtos/qurt/ADSP${V_ARCH}MP${V_ARCH_EXTN}")
54set(_QURT_INSTALL_DIR "${HEXAGON_SDK_ROOT}/rtos/qurt/compute${V_ARCH}${V_ARCH_EXTN}")
55
56if( ${TREE} MATCHES PAKMAN )
57 set(_QURT_INSTALL_DIR "${QURT_IMAGE_DIR}/compute${V_ARCH}${V_ARCH_EXTN}")
58endif()
59message(DEBUG "_QURT_INSTALL_DIR:${_QURT_INSTALL_DIR}")
60set(RTOS_DIR ${_QURT_INSTALL_DIR})
61set(QCC_DIR "${HEXAGON_QCC_DIR}/${V_ARCH}/G0")
62set(TARGET_DIR "${HEXAGON_LIB_DIR}/${V_ARCH}/G0")
63
64include_directories(
65 ${_QURT_INSTALL_DIR}/include
66 ${_QURT_INSTALL_DIR}/include/qurt
67 ${_QURT_INSTALL_DIR}/include/posix
68 )
69
70set(QURT_START_LINK_LIBS)
71set(QURT_START_LINK_LIBS
72 "${TARGET_DIR}/init.o"
73 "${RTOS_DIR}/lib/crt1.o"
74 "${RTOS_DIR}/lib/debugmon.o"
75 "${RTOS_DIR}/lib/libqurt.a"
76 "${TARGET_DIR}/libc.a"
77 "${TARGET_DIR}/libqcc.a"
78 "${TARGET_DIR}/libhexagon.a"
79 "${RTOS_DIR}/lib/libqurtcfs.a"
80 "${RTOS_DIR}/lib/libtimer_island.a"
81 "${RTOS_DIR}/lib/libtimer_main.a"
82 "${RTOS_DIR}/lib/libposix.a"
83 )
84STRING(REPLACE ";" " " QURT_START_LINK_LIBS "${QURT_START_LINK_LIBS}")
85
86set(QURT_END_LINK_LIBS
87 ${TARGET_DIR}/fini.o
88 )
89
90#Non QURT related includes and linker flags
91
92set(TARGET_DIR_NOOS "${HEXAGON_TOOLCHAIN}/Tools/target/hexagon/lib/${HEXAGON_ARCH}")
93
94if (NOT NO_WRAP_MEM_API)
95 set(WRAP_MALLOC -Wl,--wrap=malloc)
96 set(WRAP_CALLOC -Wl,--wrap=calloc)
97 set(WRAP_FREE -Wl,--wrap=free)
98 set(WRAP_REALLOC -Wl,--wrap=realloc)
99 set(WRAP_MEMALIGN -Wl,--wrap=memalign)
100endif()
101
102set(PIC_SHARED_LD_FLAGS
103 -mcpu=${V_ARCH} -m${V_ARCH} -mhvx=${V_ARCH}
104 -G0
105 -fpic
106 -Wl,-Bsymbolic
107 -Wl,-L${TARGET_DIR_NOOS}/G0/pic
108 -Wl,-L${HEXAGON_TOOLCHAIN}/Tools/target/hexagon/lib/
109 -Wl,--no-threads ${WRAP_MALLOC} ${WRAP_CALLOC} ${WRAP_FREE} ${WRAP_REALLOC} ${WRAP_MEMALIGN}
110 -shared
111 "-o <TARGET> <SONAME_FLAG><TARGET_SONAME>"
112 "<LINK_FLAGS>"
113 -Wl,--start-group
114 "<OBJECTS>"
115 "<LINK_LIBRARIES>"
116 -Wl,--end-group
117 -lc
118 )
119STRING(REPLACE ";" " " PIC_SHARED_LD_FLAGS "${PIC_SHARED_LD_FLAGS}")
120
121set(HEXAGON_PIC_SHARED_LINK_OPTIONS "${PIC_SHARED_LD_FLAGS}")
122
123#System include paths
124include_directories(SYSTEM ${HEXAGON_SDK_ROOT}/incs)
125include_directories(SYSTEM ${HEXAGON_SDK_ROOT}/incs/stddef)
126include_directories(SYSTEM ${HEXAGON_SDK_ROOT}/ipc/fastrpc/incs)
127
128#LLVM toolchain setup
129#Compiler paths, options and architecture
130set(CMAKE_C_COMPILER ${HEXAGON_TOOLCHAIN}/Tools/bin/hexagon-clang${HEXAGON_TOOLCHAIN_SUFFIX})
131set(CMAKE_CXX_COMPILER ${HEXAGON_TOOLCHAIN}/Tools/bin/hexagon-clang++${HEXAGON_TOOLCHAIN_SUFFIX})
132set(CMAKE_AR ${HEXAGON_TOOLCHAIN}/Tools/bin/hexagon-ar${HEXAGON_TOOLCHAIN_SUFFIX})
133set(CMAKE_ASM_COMPILER ${HEXAGON_TOOLCHAIN}/Tools/bin/hexagon-clang++${HEXAGON_TOOLCHAIN_SUFFIX})
134set(HEXAGON_LINKER ${CMAKE_C_COMPILER})
135set(CMAKE_PREFIX_PATH ${HEXAGON_TOOLCHAIN}/Tools/target/hexagon)
136
137set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-soname,")
138set(CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG "-Wl,-soname,")
139
140#Compiler Options
141set(COMMON_FLAGS "-mcpu=hexagon${V_ARCH} -m${V_ARCH} -mhvx=${V_ARCH} -fvectorize -Wall -Werror -fno-zero-initialized-in-bss -G0 -fdata-sections -fpic ${XQF_ARGS}")
142
143set(CMAKE_CXX_FLAGS_DEBUG "${COMMON_FLAGS} -O0 -D_DEBUG -g")
144set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${COMMON_FLAGS} -O3 -g")
145set(CMAKE_CXX_FLAGS_RELEASE "${COMMON_FLAGS} -O3")
146
147set(CMAKE_C_FLAGS_DEBUG "${COMMON_FLAGS} -O0 -D_DEBUG -g")
148set(CMAKE_C_FLAGS_RELWITHDEBINFO "${COMMON_FLAGS} -O3 -g")
149set(CMAKE_C_FLAGS_RELEASE "${COMMON_FLAGS} -O3")
150
151set(CMAKE_ASM_FLAGS_DEBUG "${COMMON_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}")
152set(CMAKE_ASM_FLAGS_RELEASE "${COMMON_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}")
153set(CMAKE_ASM_FLAGS_RELWITHDEBINFO "${COMMON_FLAGS} ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" )
154
155#Linker Options
156set(CMAKE_C_CREATE_SHARED_LIBRARY "${HEXAGON_LINKER} ${HEXAGON_PIC_SHARED_LINK_OPTIONS}")
157set(CMAKE_CXX_CREATE_SHARED_LIBRARY "${HEXAGON_LINKER} ${HEXAGON_PIC_SHARED_LINK_OPTIONS}")