#! /bin/bash # ============================================================================== # -- Set up environment -------------------------------------------------------- # ============================================================================== command -v /usr/bin/clang++-7 >/dev/null 2>&1 || { echo >&2 "clang 7 is required, but it's not installed."; exit 1; } CXX_TAG=c7 export CC=/usr/bin/clang-7 export CXX=/usr/bin/clang++-7 source $(dirname "$0")/Environment.sh mkdir -p ${CARLA_BUILD_FOLDER} pushd ${CARLA_BUILD_FOLDER} >/dev/null # ============================================================================== # -- Get and compile libc++ ---------------------------------------------------- # ============================================================================== LLVM_BASENAME=llvm-7.0 LLVM_INCLUDE=${PWD}/${LLVM_BASENAME}-install/include/c++/v1 LLVM_LIBPATH=${PWD}/${LLVM_BASENAME}-install/lib if [[ -d "${LLVM_BASENAME}-install" ]] ; then log "${LLVM_BASENAME} already installed." else rm -Rf ${LLVM_BASENAME}-source ${LLVM_BASENAME}-build log "Retrieving libc++." git clone --depth=1 -b release_70 https://github.com/llvm-mirror/llvm.git ${LLVM_BASENAME}-source git clone --depth=1 -b release_70 https://github.com/llvm-mirror/libcxx.git ${LLVM_BASENAME}-source/projects/libcxx git clone --depth=1 -b release_70 https://github.com/llvm-mirror/libcxxabi.git ${LLVM_BASENAME}-source/projects/libcxxabi log "Compiling libc++." mkdir -p ${LLVM_BASENAME}-build pushd ${LLVM_BASENAME}-build >/dev/null cmake -G "Ninja" \ -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \ -DLIBCXX_INSTALL_EXPERIMENTAL_LIBRARY=OFF \ -DLLVM_ENABLE_EH=OFF \ -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="../${LLVM_BASENAME}-install" \ ../${LLVM_BASENAME}-source ninja cxx ninja install-libcxx ninja install-libcxxabi popd >/dev/null rm -Rf ${LLVM_BASENAME}-source ${LLVM_BASENAME}-build fi unset LLVM_BASENAME # ============================================================================== # -- Get boost includes -------------------------------------------------------- # ============================================================================== BOOST_VERSION=1.69.0 BOOST_BASENAME="boost-${BOOST_VERSION}-${CXX_TAG}" BOOST_INCLUDE=${PWD}/${BOOST_BASENAME}-install/include BOOST_LIBPATH=${PWD}/${BOOST_BASENAME}-install/lib if [[ -d "${BOOST_BASENAME}-install" ]] ; then log "${BOOST_BASENAME} already installed." else rm -Rf ${BOOST_BASENAME}-source BOOST_PACKAGE_BASENAME=boost_${BOOST_VERSION//./_} log "Retrieving boost." wget "https://dl.bintray.com/boostorg/release/${BOOST_VERSION}/source/${BOOST_PACKAGE_BASENAME}.tar.gz" log "Extracting boost for Python 2." tar -xzf ${BOOST_PACKAGE_BASENAME}.tar.gz mkdir -p ${BOOST_BASENAME}-install/include mv ${BOOST_PACKAGE_BASENAME} ${BOOST_BASENAME}-source pushd ${BOOST_BASENAME}-source >/dev/null BOOST_TOOLSET="clang-7.1" BOOST_CFLAGS="-fPIC -std=c++14 -DBOOST_ERROR_CODE_HEADER_ONLY" py2="/usr/bin/env python2" py2_root=`${py2} -c "import sys; print(sys.prefix)"` pyv=`$py2 -c "import sys;x='{v[0]}.{v[1]}'.format(v=list(sys.version_info[:2]));sys.stdout.write(x)";` ./bootstrap.sh \ --with-toolset=clang \ --prefix=../boost-install \ --with-libraries=python,filesystem \ --with-python=${py2} --with-python-root=${py2_root} if ${TRAVIS} ; then echo "using python : ${pyv} : ${py2_root}/bin/python2 ;" > ${HOME}/user-config.jam else echo "using python : ${pyv} : ${py2_root}/bin/python2 ;" > project-config.jam fi ./b2 toolset="${BOOST_TOOLSET}" cxxflags="${BOOST_CFLAGS}" --prefix="../${BOOST_BASENAME}-install" -j ${CARLA_BUILD_CONCURRENCY} stage release ./b2 toolset="${BOOST_TOOLSET}" cxxflags="${BOOST_CFLAGS}" --prefix="../${BOOST_BASENAME}-install" -j ${CARLA_BUILD_CONCURRENCY} install ./b2 toolset="${BOOST_TOOLSET}" cxxflags="${BOOST_CFLAGS}" --prefix="../${BOOST_BASENAME}-install" -j ${CARLA_BUILD_CONCURRENCY} --clean-all # Get rid of python2 build artifacts completely & do a clean build for python3 popd >/dev/null rm -Rf ${BOOST_BASENAME}-source log "Extracting boost for Python 3." tar -xzf ${BOOST_PACKAGE_BASENAME}.tar.gz mkdir -p ${BOOST_BASENAME}-install/include mv ${BOOST_PACKAGE_BASENAME} ${BOOST_BASENAME}-source pushd ${BOOST_BASENAME}-source >/dev/null py3="/usr/bin/env python3" py3_root=`${py3} -c "import sys; print(sys.prefix)"` pyv=`$py3 -c "import sys;x='{v[0]}.{v[1]}'.format(v=list(sys.version_info[:2]));sys.stdout.write(x)";` ./bootstrap.sh \ --with-toolset=clang \ --prefix=../boost-install \ --with-libraries=python \ --with-python=${py3} --with-python-root=${py3_root} if ${TRAVIS} ; then echo "using python : ${pyv} : ${py3_root}/bin/python3 ;" > ${HOME}/user-config.jam else echo "using python : ${pyv} : ${py3_root}/bin/python3 ;" > project-config.jam fi ./b2 toolset="${BOOST_TOOLSET}" cxxflags="${BOOST_CFLAGS}" --prefix="../${BOOST_BASENAME}-install" -j ${CARLA_BUILD_CONCURRENCY} stage release ./b2 toolset="${BOOST_TOOLSET}" cxxflags="${BOOST_CFLAGS}" --prefix="../${BOOST_BASENAME}-install" -j ${CARLA_BUILD_CONCURRENCY} install popd >/dev/null rm -Rf ${BOOST_BASENAME}-source rm ${BOOST_PACKAGE_BASENAME}.tar.gz fi unset BOOST_BASENAME # ============================================================================== # -- Get rpclib and compile it with libc++ and libstdc++ ----------------------- # ============================================================================== RPCLIB_PATCH=v2.2.1_c2 RPCLIB_BASENAME=rpclib-${RPCLIB_PATCH}-${CXX_TAG} RPCLIB_LIBCXX_INCLUDE=${PWD}/${RPCLIB_BASENAME}-libcxx-install/include RPCLIB_LIBCXX_LIBPATH=${PWD}/${RPCLIB_BASENAME}-libcxx-install/lib RPCLIB_LIBSTDCXX_INCLUDE=${PWD}/${RPCLIB_BASENAME}-libstdcxx-install/include RPCLIB_LIBSTDCXX_LIBPATH=${PWD}/${RPCLIB_BASENAME}-libstdcxx-install/lib if [[ -d "${RPCLIB_BASENAME}-libcxx-install" && -d "${RPCLIB_BASENAME}-libstdcxx-install" ]] ; then log "${RPCLIB_BASENAME} already installed." else rm -Rf \ ${RPCLIB_BASENAME}-source \ ${RPCLIB_BASENAME}-libcxx-build ${RPCLIB_BASENAME}-libstdcxx-build \ ${RPCLIB_BASENAME}-libcxx-install ${RPCLIB_BASENAME}-libstdcxx-install log "Retrieving rpclib." git clone -b ${RPCLIB_PATCH} https://github.com/carla-simulator/rpclib.git ${RPCLIB_BASENAME}-source log "Building rpclib with libc++." # rpclib does not use any cmake 3.9 feature. # As cmake 3.9 is not standard in Ubuntu 16.04, change cmake version to 3.5 sed -i s/"3.9.0"/"3.5.0"/g ${RPCLIB_BASENAME}-source/CMakeLists.txt mkdir -p ${RPCLIB_BASENAME}-libcxx-build pushd ${RPCLIB_BASENAME}-libcxx-build >/dev/null cmake -G "Ninja" \ -DCMAKE_CXX_FLAGS="-fPIC -std=c++14 -stdlib=libc++ -I${LLVM_INCLUDE} -Wl,-L${LLVM_LIBPATH} -DBOOST_NO_EXCEPTIONS -DASIO_NO_EXCEPTIONS" \ -DCMAKE_INSTALL_PREFIX="../${RPCLIB_BASENAME}-libcxx-install" \ ../${RPCLIB_BASENAME}-source ninja ninja install popd >/dev/null log "Building rpclib with libstdc++." mkdir -p ${RPCLIB_BASENAME}-libstdcxx-build pushd ${RPCLIB_BASENAME}-libstdcxx-build >/dev/null cmake -G "Ninja" \ -DCMAKE_CXX_FLAGS="-fPIC -std=c++14" \ -DCMAKE_INSTALL_PREFIX="../${RPCLIB_BASENAME}-libstdcxx-install" \ ../${RPCLIB_BASENAME}-source ninja ninja install popd >/dev/null rm -Rf ${RPCLIB_BASENAME}-source ${RPCLIB_BASENAME}-libcxx-build ${RPCLIB_BASENAME}-libstdcxx-build fi unset RPCLIB_BASENAME # ============================================================================== # -- Get GTest and compile it with libc++ -------------------------------------- # ============================================================================== GTEST_VERSION=1.8.1 GTEST_BASENAME=gtest-${GTEST_VERSION}-${CXX_TAG} GTEST_LIBCXX_INCLUDE=${PWD}/${GTEST_BASENAME}-libcxx-install/include GTEST_LIBCXX_LIBPATH=${PWD}/${GTEST_BASENAME}-libcxx-install/lib GTEST_LIBSTDCXX_INCLUDE=${PWD}/${GTEST_BASENAME}-libstdcxx-install/include GTEST_LIBSTDCXX_LIBPATH=${PWD}/${GTEST_BASENAME}-libstdcxx-install/lib if [[ -d "${GTEST_BASENAME}-libcxx-install" && -d "${GTEST_BASENAME}-libstdcxx-install" ]] ; then log "${GTEST_BASENAME} already installed." else rm -Rf \ ${GTEST_BASENAME}-source \ ${GTEST_BASENAME}-libcxx-build ${GTEST_BASENAME}-libstdcxx-build \ ${GTEST_BASENAME}-libcxx-install ${GTEST_BASENAME}-libstdcxx-install log "Retrieving Google Test." git clone --depth=1 -b release-${GTEST_VERSION} https://github.com/google/googletest.git ${GTEST_BASENAME}-source log "Building Google Test with libc++." mkdir -p ${GTEST_BASENAME}-libcxx-build pushd ${GTEST_BASENAME}-libcxx-build >/dev/null cmake -G "Ninja" \ -DCMAKE_CXX_FLAGS="-std=c++14 -stdlib=libc++ -I${LLVM_INCLUDE} -Wl,-L${LLVM_LIBPATH} -DBOOST_NO_EXCEPTIONS -fno-exceptions" \ -DCMAKE_INSTALL_PREFIX="../${GTEST_BASENAME}-libcxx-install" \ ../${GTEST_BASENAME}-source ninja ninja install popd >/dev/null log "Building Google Test with libstdc++." mkdir -p ${GTEST_BASENAME}-libstdcxx-build pushd ${GTEST_BASENAME}-libstdcxx-build >/dev/null cmake -G "Ninja" \ -DCMAKE_CXX_FLAGS="-std=c++14" \ -DCMAKE_INSTALL_PREFIX="../${GTEST_BASENAME}-libstdcxx-install" \ ../${GTEST_BASENAME}-source ninja ninja install popd >/dev/null rm -Rf ${GTEST_BASENAME}-source ${GTEST_BASENAME}-libcxx-build ${GTEST_BASENAME}-libstdcxx-build fi unset GTEST_BASENAME # ============================================================================== # -- Get Recast&Detour and compile it with libc++ ------------------------------ # ============================================================================== RECAST_COMMIT="c40188c796f089f89a42e0b939d934178dbcfc5c" RECAST_BASENAME=recast-${CXX_TAG} RECAST_INCLUDE=${PWD}/${RECAST_BASENAME}-install/include RECAST_LIBPATH=${PWD}/${RECAST_BASENAME}-install/lib if [[ -d "${RECAST_BASENAME}-install" ]] ; then log "${RECAST_BASENAME} already installed." else rm -Rf \ ${RECAST_BASENAME}-source \ ${RECAST_BASENAME}-build \ ${RECAST_BASENAME}-install log "Retrieving Recast & Detour" git clone https://github.com/recastnavigation/recastnavigation.git ${RECAST_BASENAME}-source pushd ${RECAST_BASENAME}-source >/dev/null git reset --hard ${RECAST_COMMIT} popd >/dev/null log "Building Recast & Detour with libc++." mkdir -p ${RECAST_BASENAME}-build pushd ${RECAST_BASENAME}-build >/dev/null cmake -G "Ninja" \ -DCMAKE_CXX_FLAGS="-std=c++14 -fPIC" \ -DCMAKE_INSTALL_PREFIX="../${RECAST_BASENAME}-install" \ -DRECASTNAVIGATION_DEMO=False \ -DRECASTNAVIGATION_TEST=False \ ../${RECAST_BASENAME}-source ninja ninja install popd >/dev/null rm -Rf ${RECAST_BASENAME}-source ${RECAST_BASENAME}-build # move headers inside 'recast' folder mkdir -p "${PWD}/${RECAST_BASENAME}-install/include/recast" mv "${PWD}/${RECAST_BASENAME}-install/include/"*h "${PWD}/${RECAST_BASENAME}-install/include/recast/" fi unset RECAST_BASENAME # ============================================================================== # -- Generate Version.h -------------------------------------------------------- # ============================================================================== CARLA_VERSION=$(get_git_repository_version) log "CARLA version ${CARLA_VERSION}." VERSION_H_FILE=${LIBCARLA_ROOT_FOLDER}/source/carla/Version.h VERSION_H_FILE_GEN=${CARLA_BUILD_FOLDER}/Version.h sed -e "s|\${CARLA_VERSION}|${CARLA_VERSION}|g" ${VERSION_H_FILE}.in > ${VERSION_H_FILE_GEN} move_if_changed "${VERSION_H_FILE_GEN}" "${VERSION_H_FILE}" # ============================================================================== # -- Generate CMake toolchains and config -------------------------------------- # ============================================================================== log "Generating CMake configuration files." # -- LIBSTDCPP_TOOLCHAIN_FILE -------------------------------------------------- cat >${LIBSTDCPP_TOOLCHAIN_FILE}.gen <>${LIBCPP_TOOLCHAIN_FILE}.gen <${CMAKE_CONFIG_FILE}.gen <> ${CMAKE_CONFIG_FILE}.gen else echo "add_definitions(-DLIBCARLA_IMAGE_WITH_PNG_SUPPORT=true)" >> ${CMAKE_CONFIG_FILE}.gen fi # -- Move files ---------------------------------------------------------------- move_if_changed "${LIBSTDCPP_TOOLCHAIN_FILE}.gen" "${LIBSTDCPP_TOOLCHAIN_FILE}" move_if_changed "${LIBCPP_TOOLCHAIN_FILE}.gen" "${LIBCPP_TOOLCHAIN_FILE}" move_if_changed "${CMAKE_CONFIG_FILE}.gen" "${CMAKE_CONFIG_FILE}" # ============================================================================== # -- ...and we are done -------------------------------------------------------- # ============================================================================== popd >/dev/null log "Success!"