| OLD | NEW |
| 1 # Copyright (c) 2013 The Native Client Authors. All rights reserved. | 1 # Copyright (c) 2013 The Native Client Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 EXECUTABLES="bin/arm-nacl-readelf bin/le32-nacl-strings bin/clang bin/clang++" | |
| 6 EnableGlibcCompat | 5 EnableGlibcCompat |
| 7 EnableCliMain | 6 EnableCliMain |
| 8 | 7 |
| 9 PatchStep() { | 8 PatchStep() { |
| 10 DefaultPatchStep | 9 DefaultPatchStep |
| 11 MakeDir ${SRC_DIR}/toolchain_build/src | 10 MakeDir ${SRC_DIR}/toolchain_build/src |
| 12 Remove ${SRC_DIR}/toolchain_build/src/llvm | 11 Remove ${SRC_DIR}/toolchain_build/src/llvm |
| 13 LogExecute ln -fs ${SRC_DIR}/../../pnacl-llvm-src/llvm \ | 12 LogExecute ln -fs ${SRC_DIR}/../../pnacl-llvm-src/llvm \ |
| 14 ${SRC_DIR}/toolchain_build/src/llvm | 13 ${SRC_DIR}/toolchain_build/src/llvm |
| 15 Remove ${SRC_DIR}/toolchain_build/src/binutils | 14 Remove ${SRC_DIR}/toolchain_build/src/binutils |
| 16 LogExecute ln -fs ${SRC_DIR}/../../pnacl-binutils-src/binutils \ | 15 LogExecute ln -fs ${SRC_DIR}/../../pnacl-binutils-src/binutils \ |
| 17 ${SRC_DIR}/toolchain_build/src/binutils | 16 ${SRC_DIR}/toolchain_build/src/binutils |
| 18 Remove ${SRC_DIR}/toolchain_build/src/clang | 17 Remove ${SRC_DIR}/toolchain_build/src/clang |
| 19 LogExecute ln -fs ${SRC_DIR}/../../pnacl-clang-src/clang \ | 18 LogExecute ln -fs ${SRC_DIR}/../../pnacl-clang-src/clang \ |
| 20 ${SRC_DIR}/toolchain_build/src/clang | 19 ${SRC_DIR}/toolchain_build/src/clang |
| 21 Remove ${SRC_DIR}/toolchain_build/src/llvm/tools/clang | 20 Remove ${SRC_DIR}/toolchain_build/src/llvm/tools/clang |
| 22 LogExecute ln -fs ${SRC_DIR}/../../pnacl-clang-src/clang \ | 21 LogExecute ln -fs ${SRC_DIR}/../../pnacl-clang-src/clang \ |
| 23 ${SRC_DIR}/toolchain_build/src/llvm/tools/clang | 22 ${SRC_DIR}/toolchain_build/src/llvm/tools/clang |
| 23 Remove ${SRC_DIR}/toolchain_build/src/binutils-x86 |
| 24 LogExecute ln -fs ${SRC_DIR}/../../pnacl-binutils-x86-src/binutils \ |
| 25 ${SRC_DIR}/toolchain_build/src/binutils-x86 |
| 24 } | 26 } |
| 25 | 27 |
| 26 ConfigureStep() { | 28 ConfigureStep() { |
| 27 return | 29 return |
| 28 } | 30 } |
| 29 | 31 |
| 30 OUT_DIR=${BUILD_DIR}/out | 32 OUT_DIR=${BUILD_DIR}/out |
| 31 OUT_BIN=${BUILD_DIR}/bin | 33 OUT_INSTALL=${BUILD_DIR}/install |
| 32 | 34 |
| 33 BuildStep() { | 35 BuildStep() { |
| 34 PNACL_DIR=${NACL_SDK_ROOT}/toolchain/linux_pnacl | 36 PNACL_DIR=${NACL_SDK_ROOT}/toolchain/linux_pnacl |
| 35 export PATH=${PNACL_DIR}/bin:${PATH} | 37 export PATH=${PNACL_DIR}/bin:${PATH} |
| 36 export LD_LIBRARY_PATH=${PNACL_DIR}/lib:${LD_LIBRARY_PATH:-} | 38 export LD_LIBRARY_PATH=${PNACL_DIR}/lib:${LD_LIBRARY_PATH:-} |
| 37 export BUILD_CC=clang | 39 export BUILD_CC=clang |
| 38 export BUILD_CXX=clang++ | 40 export BUILD_CXX=clang++ |
| 39 | 41 |
| 40 export STRIPPROG=echo | 42 export STRIPPROG=echo |
| 41 | 43 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 60 GOLD_LDADD+=" -lLLVMMCParser -lLLVMLinker -lLLVMipo -lLLVMObjCARCOpts" | 62 GOLD_LDADD+=" -lLLVMMCParser -lLLVMLinker -lLLVMipo -lLLVMObjCARCOpts" |
| 61 GOLD_LDADD+=" -lLLVMVectorize -lLLVMScalarOpts -lLLVMInstCombine" | 63 GOLD_LDADD+=" -lLLVMVectorize -lLLVMScalarOpts -lLLVMInstCombine" |
| 62 GOLD_LDADD+=" -lLLVMJSBackendCodeGen -lLLVMJSBackendDesc -lLLVMJSBackendInfo" | 64 GOLD_LDADD+=" -lLLVMJSBackendCodeGen -lLLVMJSBackendDesc -lLLVMJSBackendInfo" |
| 63 GOLD_LDADD+=" -lLLVMTransformUtils -lLLVMipa -lLLVMBitWriter" | 65 GOLD_LDADD+=" -lLLVMTransformUtils -lLLVMipa -lLLVMBitWriter" |
| 64 GOLD_LDADD+=" -lLLVMBitReader -lLLVMAnalysis -lLLVMTarget -lLLVMMC" | 66 GOLD_LDADD+=" -lLLVMBitReader -lLLVMAnalysis -lLLVMTarget -lLLVMMC" |
| 65 GOLD_LDADD+=" -lLLVMObject -lLLVMCore -lLLVMSupport" | 67 GOLD_LDADD+=" -lLLVMObject -lLLVMCore -lLLVMSupport" |
| 66 GOLD_LDADD+=" -Wl,--end-group" | 68 GOLD_LDADD+=" -Wl,--end-group" |
| 67 | 69 |
| 68 EXTRA_CONFIGURE="--extra-configure-arg=--disable-compiler-version-checks" | 70 EXTRA_CONFIGURE="--extra-configure-arg=--disable-compiler-version-checks" |
| 69 EXTRA_CONFIGURE+=" --extra-configure-arg=--enable-libcpp" | 71 EXTRA_CONFIGURE+=" --extra-configure-arg=--enable-libcpp" |
| 72 # Without this configure will detect vfork as missing and define |
| 73 # vfork to fork which clobbers that define in "spawn.h". |
| 74 EXTRA_CONFIGURE+=" --extra-configure-arg=ac_cv_func_vfork_works=yes" |
| 75 EXTRA_CONFIGURE+=" --extra-configure-arg=ac_cv_func_getrusage=no" |
| 76 if [[ ${NACL_DEBUG} == 1 ]]; then |
| 77 EXTRA_CONFIGURE+=" --host-flavor=debug" |
| 78 fi |
| 70 | 79 |
| 71 # Some code in llvm uses intrisics not supported in the pnacl stable abi. | 80 # Some code in llvm uses intrisics not supported in the pnacl stable abi. |
| 72 if [[ ${TOOLCHAIN} == pnacl ]]; then | 81 if [[ ${TOOLCHAIN} == pnacl ]]; then |
| 73 EXTRA_CC_ARGS="-fgnu-inline-asm" | 82 EXTRA_CC_ARGS="-fgnu-inline-asm" |
| 74 EXTRA_CC_ARGS+=" --pnacl-disable-abi-check" | 83 EXTRA_CC_ARGS+=" --pnacl-disable-abi-check" |
| 75 fi | 84 fi |
| 76 if [[ ${TOOLCHAIN} != glibc ]]; then | 85 if [[ ${TOOLCHAIN} != glibc ]]; then |
| 77 EXTRA_CC_ARGS+=" -I${NACLPORTS_INCLUDE}/glibc-compat" | 86 EXTRA_CC_ARGS+=" -I${NACLPORTS_INCLUDE}/glibc-compat" |
| 78 fi | 87 fi |
| 79 | 88 |
| 80 LINUX_PNACL=${NACL_SDK_ROOT}/toolchain/linux_pnacl | |
| 81 EXTRA_CC_ARGS+=" -include spawn.h" | 89 EXTRA_CC_ARGS+=" -include spawn.h" |
| 82 EXTRA_CC_ARGS+=" -I${NACL_SDK_ROOT}/include" | 90 EXTRA_CC_ARGS+=" -I${NACL_SDK_ROOT}/include" |
| 83 EXTRA_CC_ARGS+=" -I${NACLPORTS_INCLUDE}" | 91 EXTRA_CC_ARGS+=" -I${NACLPORTS_INCLUDE}" |
| 84 | 92 |
| 85 # export EXTRA_LIBS so that compiler_wapper.py can access it | 93 # export WEBPORTS_EXTRA_LIBS so that compiler_wapper.py can access it |
| 86 export EXTRA_LIBS="${NACLPORTS_LDFLAGS} ${NACLPORTS_LIBS}" | 94 export WEBPORTS_EXTRA_LIBS="${NACLPORTS_LDFLAGS} ${NACLPORTS_LIBS}" |
| 87 echo "EXTRA_LIBS=${EXTRA_LIBS}" | 95 echo "WEBPORTS_EXTRA_LIBS=${WEBPORTS_EXTRA_LIBS}" |
| 88 | |
| 89 # Without this configure will detect vfork as missing and define | |
| 90 # vfork to fork which clobbers that define in "spawn.h". | |
| 91 export ac_cv_func_vfork_works=yes | |
| 92 | 96 |
| 93 # Inject a shim that speed up pnacl invocations for configure. | 97 # Inject a shim that speed up pnacl invocations for configure. |
| 94 if [ "${NACL_ARCH}" = "pnacl" ]; then | 98 if [ "${NACL_ARCH}" = "pnacl" ]; then |
| 95 local PNACL_CONF_SHIM="${TOOLS_DIR}/pnacl-configure-shim.py" | 99 local PNACL_CONF_SHIM="${TOOLS_DIR}/pnacl-configure-shim.py" |
| 96 NACLCC="${PNACL_CONF_SHIM} ${NACLCC}" | 100 NACLCC="${PNACL_CONF_SHIM} ${NACLCC}" |
| 97 NACLCXX="${PNACL_CONF_SHIM} ${NACLCXX}" | 101 NACLCXX="${PNACL_CONF_SHIM} ${NACLCXX}" |
| 98 fi | 102 fi |
| 99 | 103 |
| 100 NACLCC="${START_DIR}/compiler_wrapper.py ${NACLCC}" | 104 NACLCC="${START_DIR}/compiler_wrapper.py ${NACLCC}" |
| 101 NACLCXX="${START_DIR}/compiler_wrapper.py ${NACLCXX}" | 105 NACLCXX="${START_DIR}/compiler_wrapper.py ${NACLCXX}" |
| 102 | 106 |
| 107 Remove ${OUT_INSTALL} |
| 108 MakeDir ${OUT_INSTALL} |
| 109 |
| 103 export CC=${NACLCC} | 110 export CC=${NACLCC} |
| 104 export CXX=${NACLCXX} | 111 export CXX=${NACLCXX} |
| 105 export AR=${NACLAR} | 112 export AR=${NACLAR} |
| 106 export RANLIB=${NACLRANLIB} | 113 export RANLIB=${NACLRANLIB} |
| 107 LogExecute ${SRC_DIR}/toolchain_build/toolchain_build_pnacl.py -v \ | 114 LogExecute ${SRC_DIR}/toolchain_build/toolchain_build_pnacl.py -v \ |
| 108 --no-use-cached-results \ | 115 --no-use-cached-results \ |
| 109 --no-use-remote-cache \ | 116 --no-use-remote-cache \ |
| 110 --no-annotator \ | 117 --no-annotator \ |
| 111 --pnacl-in-pnacl \ | 118 --pnacl-in-pnacl \ |
| 112 --output=${OUT_DIR} \ | 119 --output=${OUT_DIR} \ |
| 120 --install=${OUT_INSTALL} \ |
| 113 "--extra-cc-args=${EXTRA_CC_ARGS}" \ | 121 "--extra-cc-args=${EXTRA_CC_ARGS}" \ |
| 114 ${EXTRA_CONFIGURE} \ | 122 ${EXTRA_CONFIGURE} \ |
| 115 "--binutils-pnacl-extra-configure=${GOLD_LDADD}" | 123 "--binutils-pnacl-extra-configure=${GOLD_LDADD}" |
| 116 | 124 |
| 117 Remove ${OUT_BIN} | 125 CreateHybridToolchain |
| 118 MakeDir ${OUT_BIN} | 126 } |
| 119 LogExecute cp ${OUT_DIR}/llvm_le32_nacl_install/bin/* ${OUT_BIN} | 127 |
| 120 LogExecute cp ${OUT_DIR}/binutils_pnacl_le32_nacl_install/bin/* \ | 128 CreateHybridToolchain() { |
| 121 ${OUT_BIN} | 129 Banner "Creating Hybrid Toolchain" |
| 122 # TODO(bradnelson): Drop this once shell script fix is done. | 130 |
| 123 MakeDir ${OUT_BIN}/driver | 131 # Build a full toolchain based on the one in NACL_SDK_ROOT, but overlayed |
| 124 LogExecute cp ${SRC_DIR}/pnacl/driver/redirect.sh ${OUT_BIN}/driver/ | 132 # with the one we just compiled. |
| 125 LogExecute cp ${SRC_DIR}/pnacl/driver/*.py ${OUT_BIN}/driver/ | 133 Remove toolchain |
| 134 MakeDir toolchain |
| 135 |
| 136 host_toolchain=${NACL_SDK_ROOT}/toolchain/linux_pnacl |
| 137 LogExecute cp -r ${host_toolchain}/* toolchain |
| 138 |
| 139 # Drop pyc files. |
| 140 LogExecute find toolchain -name "*.pyc" -exec rm {} \; |
| 141 |
| 142 # Overlay compiled toolchain |
| 143 Remove ${OUT_INSTALL}/x86_64-nacl/lib/32 |
| 144 Remove ${OUT_INSTALL}/x86_64-nacl/lib64 |
| 145 LogExecute cp -r ${OUT_INSTALL}/* toolchain/ |
| 146 |
| 147 # Rename the nacl executables. |
| 148 for f in $(cd ${host_toolchain} && find . -executable -type f); do |
| 149 if [[ "$(file ${host_toolchain}/${f} | grep ELF)" != "" \ |
| 150 && ${f} != *pnacl-abicheck ]]; then |
| 151 # We are dealing with an executable |
| 152 local built_exe="${OUT_INSTALL}/${f}" |
| 153 local exe="toolchain/${f}" |
| 154 if [[ -f ${built_exe} ]]; then |
| 155 LogExecute mv ${exe} ${exe}${NACL_EXEEXT} |
| 156 elif [[ $f == *-clang* ]]; then |
| 157 Remove ${exe} |
| 158 LogExecute ln -sf clang${NACL_EXEEXT} ${exe}${NACL_EXEEXT} |
| 159 else |
| 160 echo "Warning: dropping ${f} without a nacl replacement." |
| 161 LogExecute rm -f ${exe} |
| 162 fi |
| 163 fi |
| 164 done |
| 165 |
| 166 # Now create launcher scripts for each executable |
| 167 for f in toolchain/bin/*${NACL_EXEEXT}; do |
| 168 script=${f%.*} |
| 169 if [[ ${TOOLCHAIN} == pnacl ]]; then |
| 170 TranslateAndWriteLauncherScript "${f}" x86-64 "${script}.nexe" "${script}" |
| 171 else |
| 172 WriteLauncherScript "${script}" "$(basename ${f})" |
| 173 fi |
| 174 done |
| 175 |
| 176 # Drop parts we don't care about |
| 177 LogExecute rm -rf toolchain/translator |
| 178 LogExecute rm -rf toolchain/mipsel-nacl |
| 179 LogExecute rm -rf toolchain/*-nacl/usr |
| 180 LogExecute rm -f toolchain/bin/mipsel-* |
| 181 LogExecute rm -f toolchain/lib/*.so |
| 126 } | 182 } |
| 127 | 183 |
| 128 InstallStep() { | 184 InstallStep() { |
| 129 local INSTALL_DIR=${DESTDIR}/${PREFIX}/pnacl | 185 local INSTALL_DIR=${DESTDIR}/${PREFIX}/pnacl |
| 130 Remove ${INSTALL_DIR}/ | 186 Remove ${INSTALL_DIR}/ |
| 131 MakeDir ${INSTALL_DIR}/ | 187 MakeDir ${INSTALL_DIR}/ |
| 132 | 188 |
| 133 LogExecute cp -r ${NACL_SDK_ROOT}/toolchain/linux_pnacl/* ${INSTALL_DIR} | 189 LogExecute cp -r toolchain/* ${INSTALL_DIR} |
| 134 | 190 for f in $(find ${INSTALL_DIR} -type l -name *-clang*${NACL_EXEEXT}); do |
| 135 # Drop pyc files. | 191 # link to clang binary |
| 136 LogExecute find ${INSTALL_DIR} -name "*.pyc" -exec rm {} \; | 192 Remove $f ${f%.*} |
| 137 | 193 LogExecute ln -s clang ${f%.*} |
| 138 LogExecute rm -rf ${INSTALL_DIR}/mipsel-nacl | 194 done |
| 139 LogExecute rm -rf ${INSTALL_DIR}/translator | 195 for f in $(find ${INSTALL_DIR} -executable -type f -name *${NACL_EXEEXT}); do |
| 140 LogExecute rm -rf ${INSTALL_DIR}/*-nacl/usr | 196 LogExecute mv $f ${f%.*} |
| 141 | |
| 142 # TODO(bradnelson): Drop this once shell script fix is done. | |
| 143 LogExecute cp ${OUT_BIN}/driver/*.py ${INSTALL_DIR}/bin/pydir/ | |
| 144 | |
| 145 # Swap in nacl executables. | |
| 146 Remove ${INSTALL_DIR}/lib/*.so | |
| 147 for f in $(find ${INSTALL_DIR} -executable -type f); do | |
| 148 if [ "$(file ${f} | grep ELF)" != "" ]; then | |
| 149 local exe="${OUT_BIN}/$(basename ${f})" | |
| 150 if [[ -f ${exe} ]]; then | |
| 151 if [[ ${TOOLCHAIN} == pnacl ]]; then | |
| 152 echo "Finalizing ${exe}" | |
| 153 ${PNACLFINALIZE} ${exe} -o ${f} | |
| 154 else | |
| 155 echo "Copying ${exe}" | |
| 156 cp ${exe} ${f} | |
| 157 fi | |
| 158 elif [[ $f == *-clang* ]]; then | |
| 159 LogExecute ln -sf ${f} $(basename ${f}) | |
| 160 else | |
| 161 echo "Warning: dropping ${f} without a nacl replacement." | |
| 162 LogExecute rm -f ${f} | |
| 163 fi | |
| 164 elif [ "$(head -n 1 ${f} | grep /bin/sh)" != "" ]; then | |
| 165 # TODO(bradnelson): Drop this once shell script fix is done. | |
| 166 LogExecute cp -f ${OUT_BIN}/driver/redirect.sh ${f} | |
| 167 LogExecute chmod a+x ${f} | |
| 168 fi | |
| 169 done | 197 done |
| 170 } | 198 } |
| 171 | 199 |
| 172 PostInstallTestStep() { | 200 TestStep() { |
| 173 # Verify that binaries at least load under sel_ldr | 201 # Verify that binaries at least load under sel_ldr |
| 174 LogExecute ./bin/le32-nacl-strings.sh --version | 202 LogExecute toolchain/bin/le32-nacl-strings --version |
| 175 LogExecute ./bin/arm-nacl-readelf.sh --version | 203 LogExecute toolchain/bin/arm-nacl-readelf --version |
| 176 LogExecute ./bin/clang.sh --version | 204 LogExecute toolchain/bin/x86_64-nacl-as --version |
| 205 LogExecute toolchain/bin/clang --version |
| 206 |
| 207 # The end-to-end tests doesn't currently work for PNaCl |
| 208 if [[ $TOOLCHAIN == pnacl ]]; then |
| 209 return |
| 210 fi |
| 211 TestNaClClang |
| 177 } | 212 } |
| 213 |
| 214 TestNaClClang() { |
| 215 # Try compiling and running a simple hello world program. We have to |
| 216 # use explicit compile, assemble and link commands since sel_ldr doesn't |
| 217 # provide fork(). |
| 218 |
| 219 compile_command="toolchain/bin/x86_64-nacl-clang -cc1 -triple x86_64--nacl |
| 220 -S -disable-free -main-file-name ${START_DIR}/hello.c -mrelocation-model |
| 221 static -mthread-model posix -mdisable-fp-elim -fmath-errno -no-integrated-as |
| 222 -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 |
| 223 -target-linker-version 2.24 -v -dwarf-column-info |
| 224 -resource-dir $PWD/toolchain/bin/../lib/clang/3.7.0 |
| 225 -internal-isystem $PWD/toolchain/bin/../lib/clang/3.7.0/include |
| 226 -internal-isystem $PWD/toolchain/bin/../x86_64-nacl/usr/include |
| 227 -internal-isystem $PWD/toolchain/bin/../x86_64-nacl/include |
| 228 -fno-dwarf-directory-asm -ferror-limit 19 -fmessage-length 0 -mstackrealign |
| 229 -fobjc-runtime=gcc -fdiagnostics-show-option -o hello.s -x c |
| 230 ${START_DIR}/hello.c |
| 231 " |
| 232 LogExecute $compile_command |
| 233 |
| 234 LogExecute toolchain/bin/x86_64-nacl-as --64 hello.s -o hello.o |
| 235 link_command="toolchain/x86_64-nacl/bin/ld --build-id -m |
| 236 elf_x86_64_nacl -static -o hello.nexe |
| 237 $PWD/toolchain/bin/../x86_64-nacl/lib/crt1.o |
| 238 $PWD/toolchain/bin/../x86_64-nacl/lib/crti.o |
| 239 $PWD/toolchain/bin/../lib/clang/3.7.0/lib/x86_64-nacl/crtbeginT.o |
| 240 -L$PWD/toolchain/bin/../x86_64-nacl/lib |
| 241 -L$PWD/toolchain/bin/../x86_64-nacl/usr/lib |
| 242 -L$PWD/toolchain/bin/../lib/clang/3.7.0/lib/x86_64-nacl |
| 243 ./hello.o --start-group -lc -lgcc --as-needed -lgcc_eh --no-as-needed |
| 244 --end-group |
| 245 $PWD/toolchain/bin/../lib/clang/3.7.0/lib/x86_64-nacl/crtend.o |
| 246 $PWD/toolchain/bin/../x86_64-nacl/lib/crtn.o |
| 247 " |
| 248 LogExecute $link_command |
| 249 RunSelLdrCommand hello.nexe |
| 250 } |
| OLD | NEW |