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}")