Rev 3 | Go to most recent revision | Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 2 | pmbaty | 1 | #!/bin/sh |
| 2 | |||
| 3 | export QNXSDK_PATH="../qnx800" |
||
| 4 | export QNXSDK_HOSTPATH="host/linux/x86_64" |
||
| 5 | export QNXSDK_TARGETPATH="target/qnx" |
||
| 6 | export BUILD_DIR_NAME="llvm-build" |
||
| 7 | export LLVM_VERSION="18.1.4" |
||
| 8 | export LLVM_SOURCES_FILE="llvmorg-${LLVM_VERSION}.tar.gz" # name of file containing LLVM version LLVM_VERSION sources |
||
| 9 | export LLVM_SOURCES_URL="https://github.com/llvm/llvm-project/archive/refs/tags/${LLVM_SOURCES_FILE}" # download URL of LLVM_SOURCES_FILE |
||
| 10 | export LLVM_SOURCES_DIR="llvm-project-llvmorg-${LLVM_VERSION}" # name of directory created when extracting LLVM_SOURCES_FILE |
||
| 11 | |||
| 12 | export TARGET_ARCH="x86_64" |
||
| 13 | export TARGET_VENDOR="pc" |
||
| 14 | #export TARGET_ARCH="aarch64" |
||
| 15 | #export TARGET_VENDOR="unknown" |
||
| 16 | export TARGET_KERNEL="nto" |
||
| 17 | export TARGET_SYSTEM="qnx8.0.0" |
||
| 18 | |||
| 19 | # see where we are |
||
| 20 | export CURRENT_DIR="$(pwd)" |
||
| 21 | |||
| 22 | # verify we're a x86_64 Linux host |
||
| 23 | if [ ! "$(uname)" = "Linux" ] || [ ! "$(uname -m)" = "x86_64" ]; then |
||
| 24 | echo "" |
||
| 25 | echo "Error: this script requires a x86_64 Linux machine (possibly a virtual machine) as the build host." |
||
| 26 | echo "" |
||
| 27 | exit 1 |
||
| 28 | fi |
||
| 29 | |||
| 30 | # verify that we have the QNX platform SDK |
||
| 31 | if [ ! -d "${QNXSDK_PATH}/${QNXSDK_HOSTPATH}" ] || [ ! -d "${QNXSDK_PATH}/${QNXSDK_TARGETPATH}" ]; then |
||
| 32 | echo "" |
||
| 33 | echo "Error: the ${QNXSDK_PATH} path doesn't contain a QNX SDK. It must contain the" |
||
| 34 | echo "'host' and 'target' directories of the QNX SDP for the targeted version of QNX" |
||
| 35 | echo "and the ${TARGET_ARCH} platform. Please deploy these directories and try again." |
||
| 36 | echo "NOTE: if you're using a VMWare virtual machine and this path points to a shared" |
||
| 37 | echo "folder, you may need to initiate the share by unticking the 'Enable shared" |
||
| 38 | echo "folders' checkbox and ticking it again in the VM settings (VMWare bug)." |
||
| 39 | echo "" |
||
| 40 | exit 1 |
||
| 41 | fi |
||
| 42 | |||
| 43 | # verify that we have wget, python3, cmake, gcc, g++ and ninja |
||
| 44 | if ! wget --version > /dev/null 2>&1 \ |
||
| 45 | || ! python3 --version > /dev/null 2>&1 \ |
||
| 46 | || ! cmake --version > /dev/null 2>&1 \ |
||
| 47 | || ! gcc --version > /dev/null 2>&1 \ |
||
| 48 | || ! g++ --version > /dev/null 2>&1 \ |
||
| 49 | || ! ninja --version > /dev/null 2>&1; then |
||
| 50 | echo "" |
||
| 51 | echo "Error: this script requires at the very least the following tools installed:" |
||
| 52 | echo " wget" |
||
| 53 | echo " python3" |
||
| 54 | echo " cmake" |
||
| 55 | echo " gcc" |
||
| 56 | echo " g++" |
||
| 57 | echo " ninja" |
||
| 58 | echo "Please install them (possibly as binary packages with apt-get) and try again." |
||
| 59 | echo "" |
||
| 60 | exit 1 |
||
| 61 | fi |
||
| 62 | |||
| 63 | # verify that the symlinks are deployed in the SDK -- just test one of them |
||
| 64 | if [ ! -e "${QNXSDK_PATH}/${QNXSDK_TARGETPATH}/usr/include/readline.h" ]; then |
||
| 65 | echo "" |
||
| 66 | echo "Error: the toolchain platform-specific symbolic links have not been deployed in" |
||
| 67 | echo "this QNX SDK. Please run" |
||
| 68 | echo "(on a POSIX machine:)" |
||
| 69 | echo " cd ${QNXSDK_PATH}" |
||
| 70 | echo " find . -name symlinks.lst -exec ./symlinks.sh {} create \\; && printf 'present' > .symlinks-state" |
||
| 71 | echo "(else on a Windows machine:)" |
||
| 72 | echo " cd ${QNXSDK_PATH}" |
||
| 73 | echo " host\\win64\\${TARGET_ARCH}\\usr\\bin\\busybox.exe sh -c \"" \ |
||
| 74 | "find . -name symlinks.lst -exec ./symlinks.sh {} create \\; && printf 'present' > .symlinks-state" \ |
||
| 75 | "\"" |
||
| 76 | echo "Note that this step WILL take time on a Win32 machine, but is only done once." |
||
| 77 | echo "" |
||
| 78 | exit 1 |
||
| 79 | fi |
||
| 80 | |||
| 81 | # construct the target triple (actually a quadruple) |
||
| 82 | export TARGET_TRIPLE="${TARGET_ARCH}-${TARGET_VENDOR}-${TARGET_KERNEL}-${TARGET_SYSTEM}" |
||
| 83 | echo "Will build LLVM for ${TARGET_TRIPLE}" |
||
| 84 | |||
| 85 | # change to an immediately visible path |
||
| 86 | cd ~/Desktop |
||
| 87 | |||
| 88 | # create a symlink in /tmp that will lead to the QNX platform SDK so as to avoid spaces in paths |
||
| 89 | # (this is totally prohibitive with the official QNX toolchain) |
||
| 90 | test -L /tmp/qnxsdk && rm /tmp/qnxsdk |
||
| 91 | ln -fs "${CURRENT_DIR}/${QNXSDK_PATH}" /tmp/qnxsdk |
||
| 92 | |||
| 93 | # setup the environment |
||
| 94 | export QNX_HOST="/tmp/qnxsdk/${QNXSDK_HOSTPATH}" |
||
| 95 | export QNX_TARGET="/tmp/qnxsdk/${QNXSDK_TARGETPATH}" |
||
| 96 | export MAKEFLAGS="-I${QNX_TARGET}/usr/include" |
||
| 97 | export PATH="${QNX_HOST}/usr/bin:${PATH}" |
||
| 98 | #export PYTHONDONTWRITEBYTECODE="1" |
||
| 99 | #export PYTHONPATH="" |
||
| 100 | |||
| 101 | # download the LLVM source package and unpack it if not done yet |
||
| 102 | if [ ! -d "${LLVM_SOURCES_DIR}" ]; then |
||
| 103 | if [ ! -f "${CURRENT_DIR}/${LLVM_SOURCES_FILE}" ]; then |
||
| 104 | echo "Downloading LLVM ${LLVM_VERSION} sources from LLVM GitHub..." |
||
| 105 | wget "${LLVM_SOURCES_URL}" || exit 1 |
||
| 106 | fi |
||
| 107 | echo "Extracting LLVM ${LLVM_VERSION} sources..." |
||
| 108 | cd "$(dirname "${LLVM_SOURCES_DIR}")" |
||
| 109 | tar xzf "${CURRENT_DIR}/${LLVM_SOURCES_FILE}" || exit 1 |
||
| 110 | if [ ! -d "${LLVM_SOURCES_DIR}" ]; then |
||
| 111 | echo "Error: couldn't find ${LLVM_SOURCES_DIR} in extracted LLVM sources." |
||
| 112 | exit 1 |
||
| 113 | fi |
||
| 114 | fi |
||
| 115 | |||
| 116 | # create the build directory |
||
| 117 | echo "Wiping out build directory..." |
||
| 118 | test -e "${BUILD_DIR_NAME}" && rm -rf "${BUILD_DIR_NAME}" |
||
| 119 | mkdir "${BUILD_DIR_NAME}" || exit 1 |
||
| 120 | cd "${BUILD_DIR_NAME}" || exit 1 |
||
| 121 | |||
| 122 | # print the build environment |
||
| 123 | echo "QNX_HOST=${QNX_HOST}" |
||
| 124 | echo "QNX_TARGET=${QNX_TARGET}" |
||
| 125 | echo "MAKEFLAGS=${MAKEFLAGS}" |
||
| 126 | |||
| 127 | # create the QNX CMake toolchain file |
||
| 128 | echo '# '${TARGET_TRIPLE}' CMake toolchain file by Pierre-Marie Baty <pm@pmbaty.com> |
||
| 129 | |||
| 130 | SET(CMAKE_SYSTEM_NAME "QNX") |
||
| 131 | SET(CMAKE_SYSTEM_VERSION "8.0.0") |
||
| 132 | |||
| 133 | SET(QNX "1") |
||
| 134 | SET(QNXNTO "1") |
||
| 135 | if ("$ENV{QNX_HOST}" STREQUAL "") |
||
| 136 | message(FATAL_ERROR "the QNX_HOST environment variable is not set") |
||
| 137 | endif() |
||
| 138 | SET(QNX_HOST "$ENV{QNX_HOST}") |
||
| 139 | if ("$ENV{QNX_TARGET}" STREQUAL "") |
||
| 140 | message(FATAL_ERROR "the QNX_TARGET environment variable is not set") |
||
| 141 | endif() |
||
| 142 | SET(QNX_TARGET "$ENV{QNX_TARGET}") |
||
| 143 | SET(QNX_PROCESSOR "'${TARGET_ARCH}'") |
||
| 144 | |||
| 145 | SET(CMAKE_ASM_COMPILER "${QNX_HOST}/usr/bin/'${TARGET_TRIPLE}'-gcc") |
||
| 146 | SET(CMAKE_ASM_COMPILER_TARGET "gcc_nto${QNX_PROCESSOR}") |
||
| 147 | |||
| 148 | SET(CMAKE_C_COMPILER "${QNX_HOST}/usr/bin/'${TARGET_TRIPLE}'-gcc") |
||
| 149 | SET(CMAKE_C_COMPILER_TARGET "gcc_nto${QNX_PROCESSOR}") |
||
| 150 | SET(CMAKE_C_FLAGS_DEBUG "-g") |
||
| 151 | SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG") |
||
| 152 | SET(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG") |
||
| 153 | SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") |
||
| 154 | SET(CMAKE_C_FLAGS "-D_QNX_SOURCE=1 -I${QNX_TARGET}/usr/include/devs/include_'${TARGET_ARCH}' -I${QNX_TARGET}/usr/include/devs -DLLVM_BUILD=1") |
||
| 155 | |||
| 156 | SET(CMAKE_CXX_COMPILER "${QNX_HOST}/usr/bin/'${TARGET_TRIPLE}'-g++") |
||
| 157 | SET(CMAKE_CXX_COMPILER_TARGET "gcc_nto${QNX_PROCESSOR}") |
||
| 158 | SET(CMAKE_CXX_FLAGS_DEBUG "-g") |
||
| 159 | SET(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG") |
||
| 160 | SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") |
||
| 161 | SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") |
||
| 162 | SET(CMAKE_CXX_FLAGS "-D_QNX_SOURCE=1 -I${QNX_TARGET}/usr/include/devs/include_'${TARGET_ARCH}' -I${QNX_TARGET}/usr/include/devs -DLLVM_BUILD=1") |
||
| 163 | |||
| 164 | SET(CMAKE_LINKER "${QNX_HOST}/usr/bin/'${TARGET_TRIPLE}'-ld.bfd") |
||
| 165 | SET(CMAKE_EXE_LINKER_FLAGS "-lsocket") |
||
| 166 | |||
| 167 | SET(CMAKE_RANLIB "${QNX_HOST}/usr/bin/'${TARGET_TRIPLE}'-ranlib") |
||
| 168 | |||
| 169 | SET(CMAKE_AR "${QNX_HOST}/usr/bin/'${TARGET_TRIPLE}'-ar") |
||
| 170 | |||
| 171 | SET(CMAKE_FIND_ROOT_PATH "${QNX_TARGET}") |
||
| 172 | SET(CMAKE_FIND_ROOT_PATH_HOST_PROGRAM NEVER) |
||
| 173 | SET(CMAKE_FIND_ROOT_PATH_HOST_LIBRARY ONLY) |
||
| 174 | SET(CMAKE_FIND_ROOT_PATH_HOST_INCLUDE ONLY) |
||
| 175 | ' > "${TARGET_TRIPLE}.cmake" |
||
| 176 | |||
| 177 | # now configure LLVM |
||
| 178 | echo "Configuring LLVM build..." |
||
| 179 | # TODO: add compiler-rt project (requires probably QNX-specific work) |
||
| 180 | cmake \ |
||
| 181 | -D CMAKE_TOOLCHAIN_FILE="${TARGET_TRIPLE}.cmake" \ |
||
| 182 | -D CMAKE_BUILD_TYPE="MinSizeRel" \ |
||
| 183 | -D CMAKE_INSTALL_PREFIX="/tmp/qnxsdk/host/qnx8" \ |
||
| 184 | -D CMAKE_STAGING_PREFIX="/usr/bin" \ |
||
| 185 | -D LLVM_HOST_TRIPLE="${TARGET_TRIPLE}" \ |
||
| 186 | -D LLVM_ENABLE_PROJECTS="clang;lld;lldb" \ |
||
| 187 | -D LLVM_TARGETS_TO_BUILD="AArch64;X86" \ |
||
| 188 | -G Ninja \ |
||
| 189 | "../${LLVM_SOURCES_DIR}/llvm" || exit 1 |
||
| 190 | |||
| 191 | # and do the Lord's work. https://youtu.be/jcyYmCnkbEE |
||
| 192 | echo "Building LLVM..." |
||
| 193 | cmake --build . || exit 1 |
||
| 194 | |||
| 195 | echo "Champagne, James. Champagne." |
||
| 196 | exit 0 |
||
| 197 |