#! /bin/bash PROJECT=llvm # Available sub-projects. AVAILABLE_PROJECTS=( llvm clang lld compiler_rt libcxx libcxxabi libunwind lldb polly openmp test_suite ) # Enabled sub-projects. PROJECTS=( llvm clang lld ) # Additional options (see functions sources below). # Options followed by a ':' require an argument, by '::' allow an optional argument. SHORT_OPTIONS= # Long options are not available with BSD getopt. LONG_OPTIONS= # Help for additional options usage() { # option h "help" "display this help and exit" return } # Find the directory containing this script. source="${BASH_SOURCE[0]}" while [ -h "${source}" ] ; do SCRIPTS="$(cd -P "$(dirname "${source}")" && pwd)" source="$(readlink "${source}")" [[ ${source} != /* ]] && source="$DIR/${source}" done SCRIPTS="$(cd -P "$(dirname "${source}")" && pwd)" # Get support functions and definitions. source ${SCRIPTS}/support if [ "${TOOLS}" = "host" ] ; then # Using the host tools. Build just enough to bootstrap. PROJECTS=( llvm clang lld ) fi # Check for needed libraries. check_libraries() { if [ "${TOOLS}" = "ecc" ] ; then check_library libc.a "Run ${SCRIPTS}/build-musl." || \ exit 1 fi if [ "${TOOLS}" = "ecc" ] ; then check_library libcompiler-rt.a "Run ${SCRIPTS}/build-compiler-rt." || \ exit 1 fi } # Projects. llvm="${SRCTOP} http://llvm.org/svn/llvm-project/llvm/trunk llvm svn" clang="${PROJECTDIR}/tools http://llvm.org/svn/llvm-project/cfe/trunk clang svn" lld="${PROJECTDIR}/tools http://llvm.org/svn/llvm-project/lld/trunk lld svn" lldb=" ${PROJECTDIR}/tools http://llvm.org/svn/llvm-project/lldb/trunk lldb svn" compiler_rt="${PROJECTDIR}/projects http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt svn" libunwind="${PROJECTDIR}/projects http://llvm.org/svn/llvm-project/libunwind/trunk libunwind svn" libcxx="${PROJECTDIR}/projects http://llvm.org/svn/llvm-project/libcxx/trunk libcxx svn" libcxxabi="${PROJECTDIR}/projects http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi svn" polly="${PROJECTDIR}/tools http://llvm.org/svn/llvm-project/polly/trunk polly svn" openmp="${PROJECTDIR}/projects http://llvm.org/svn/llvm-project/openmp/trunk openmp svn" test_suite="${PROJECTDIR}/projects http://llvm.org/svn/llvm-project/test-suite/trunk test-suite svn" # Set the default target. CFLAGS="${CFLAGS} -DELLCC_ARG0=\\\"${TARGETTUPLE}\\\"" CXXFLAGS="${CXXFLAGS} -DELLCC_ARG0=\\\"${TARGETTUPLE}\\\"" if [ "${TOOLS}" = "ecc" ] ; then if [ "$SHARED" != 'yes' ] ; then ECCCONFIG="-DLLVM_ENABLE_PIC=False -DLLVM_BUILD_STATIC=True" fi if [ "${HOSTTUPLE}" != "${TARGETTUPLE}" ] ; then # Cross compiling. if [ ! -e ${LOCAL}/bin/llvm-tblgen ] ; then if [ ! -e ${ELLCC}/bin/llvm-tblgen ] ; then run bailout "We need a native table gen to do a cross build, run make-ellcc -b ${HOSTTUPLE}" else dir=${ELLCC}/bin fi else dir=${LOCAL}/bin fi CROSS_CMAKE_FLAGS="-DCMAKE_CROSSCOMPILING=True \ -DLLVM_TABLEGEN=${dir}/llvm-tblgen \ -DCLANG_TABLEGEN=${dir}/clang-tblgen" LOCAL=${LOCAL}/llvm/${TARGETTUPLE} else CROSS_CMAKE_FLAGS= fi if [ "${TARGETOS}" = "mingw32" ] ; then CROSS_CMAKE_FLAGS="$CROSS_CMAKE_FLAGS -DWIN32=True" fi fi configure() { # Configure checked out projects. version_file=${BUILDDIR}/tools/clang/lib/Basic/ELLCCVersion.h run check_checkout run check_libraries run mkdir -p ${BUILDDIR} run cd ${BUILDDIR} run CC="${CC}" CXX="${CXX}" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=${LOCAL} \ -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=${LOCALBIN} \ -DLLVM_LIBXML2_ENABLED=OFF -DLLVM_ENABLE_LIBXML2=OFF \ ${ECCCONFIG} ${CROSS_CMAKE_FLAGS} \ -DCMAKE_BUILD_TYPE=Release ${PROJECTDIR} -DCMAKE_C_FLAGS="'${CFLAGS}'" \ -DCMAKE_CXX_FLAGS="'${CXXFLAGS}'" # This seems to be the only way to get something defined in a clang build. echo "// This file was generated by the ELLCC build-llvm script." > $version_file revision=($(last_revision ellcc)) echo "#define ELLCC_REVISION \"${revision[0]}\"" >> $version_file } tests() { # Run tests. run cd ${BUILDDIR} run ${MAKE} -j ${MAXJOBS} -C ${BUILDDIR} check run ${MAKE} -j ${MAXJOBS} -C ${BUILDDIR} clang-test } if [ "${CHECKOUT}" = "y" ] ; then checkout fi if [ "${CONFIGURE}" = "y" ] ; then configure fi if [ "${REVERT}" = "y" ] ; then revert fi if [ "${UPDATE}" == "y" ] ; then update || exit 1 fi if [ "${PATCH}" == "y" ] ; then patch || exit 1 fi if [ "${CREATE_PATCH}" == "y" ] ; then create_patch || exit 1 fi if [ "${BUILD}" = "y" ] ; then build fi if [ "${TESTS}" = "y" ] ; then tests fi if [ "${INSTALL}" = "y" ] ; then if [ "${TOOLS}" = "clang" ] ; then # Build first, if necessary, using clang. build fi # Remove any old clang binaries and links. run rm -fr ${LOCALBIN}/clang* install # Install clang includes. run mkdir -p ${ELLCC}/lib/clang run cp -pr ${LOCAL}/lib/clang/* ${ELLCC}/lib/clang run mkdir -p ${LOCALLIBECC}/include run cd ${LOCALLIBECC}/include run ln -sf ${LOCAL}/lib/clang/*/include clang if [ "${LOCALBIN}" != "${LOCAL}/bin" ] ; then mkdir -p ${LOCALBIN} run rm -fr ${LOCALBIN}/clang* run cp -pr ${LOCAL}/bin/* ${LOCALBIN} fi fi