Add script to automatically build all programs

This commit is contained in:
zhoujing 2023-01-30 13:43:50 +08:00
parent e74aafb0d6
commit 2991e33218
4 changed files with 200 additions and 5 deletions

2
.gitignore vendored
View File

@ -27,7 +27,7 @@
/*/CMakeUserPresets.json
# Nested build directory
/build*
/build*/
/install*
#==============================================================================#

180
build-ventus.sh Executable file
View File

@ -0,0 +1,180 @@
#!/usr/bin/bash
DIR=$(cd "$(dirname "${0}")" &> /dev/null && (pwd -W 2> /dev/null || pwd))
VENTUS_BUILD_DIR=${DIR}/build
LIBCLC_BUILD_DIR=${DIR}/build-libclc
VENTUS_INSTALL_PREFIX=${DIR}/install
PROGRAMS_TOBUILD=(llvm-ventus pocl ocl-icd libclc)
# Helper function
help() {
cat <<END
Build llvm-ventus, pocl, ocl-icd, libclc programs
Read ${DIR}/README.md to get started.
Usage: ${DIR}/$(basename ${0})
[--build <build programs>]
[--help | -h]
Options:
--build <build programs>
Chosen programs to build : llvm-ventus, pocl, ocl-icd, libclc
Option format : "llvm-ventus;pocl", string are seperated by semicolon
Default : "llvm-ventus;pocl;ocl-icd;libclc"
--help | -h
Print this help message and exit.
END
}
# Parse command line options
while [ $# -gt 0 ]; do
case $1 in
-h | --help)
help
exit 0
;;
--build)
shift
if [ ! -z "${1}" ];then
PROGRAMS_TOBUILD=(${1//;/ })
fi
;;
?*)
echo "Invalid options: \"$1\" , try ${DIR}/$(basename ${0}) --help for help"
exit -1
;;
esac
# Process next command-line option
shift
done
# Need to get the pocl folder from enviroment variables
if [ -z "${POCL_DIR}" ]; then
POCL_DIR=${DIR}/../pocl
fi
if [ ! -d "${POCL_DIR}" ]; then
echo "pocl folder not found, please set or check!"
echo "Default folder is set to be $(realpath ${POCL_DIR})"
exit 1
fi
POCL_BUILD_DIR=${POCL_DIR}/build
# Need to get the icd_loader folder from enviroment variables
if [ -z "${OCL_ICD_DIR}" ]; then
OCL_ICD_DIR=${DIR}/../ocl-icd
fi
if [ ! -d "${OCL_ICD_DIR}" ]; then
echo "ocl icd folder not found, please set or check"
echo "Default folder is set to be $(realpath ${OCL_ICD_DIR})"
exit 1
fi
OCL_ICD_BUILD_DIR=${OCL_ICD_DIR}/build
# Build llvm-ventus
build_ventus() {
if [ ! -d "${VENTUS_BUILD_DIR}" ]; then
mkdir ${VENTUS_BUILD_DIR}
fi
cd ${VENTUS_BUILD_DIR}
cmake -G Ninja -B ${VENTUS_BUILD_DIR} ${DIR}/llvm \
-DLLVM_CCACHE_BUILD=ON \
-DLLVM_OPTIMIZED_TABLEGEN=ON \
-DLLVM_PARALLEL_LINK_JOBS=12 \
-DCMAKE_BUILD_TYPE=Debug \
-DLLVM_ENABLE_PROJECTS="clang;lld;libclc" \
-DLLVM_TARGETS_TO_BUILD="AMDGPU;X86;RISCV" \
-DLLVM_TARGET_ARCH=riscv32 \
-DBUILD_SHARED_LIBS=ON \
-DLLVM_BUILD_LLVM_DYLIB=ON \
-DCMAKE_INSTALL_PREFIX=${VENTUS_INSTALL_PREFIX}
ninja
ninja install
}
# Build pocl from THU
build_pocl() {
if [ ! -d "${POCL_BUILD_DIR}" ]; then
mkdir ${POCL_BUILD_DIR}
fi
cd ${POCL_BUILD_DIR}
cmake -G Ninja -B ${POCL_BUILD_DIR} ${POCL_DIR} \
-DENABLE_HOST_CPU_DEVICES=OFF \
-DENABLE_VENTUS=ON \
-DENABLE_ICD=ON \
-DDEFAULT_ENABLE_ICD=ON \
-DENABLE_TESTS=OFF \
-DSTATIC_LLVM=OFF \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DCMAKE_INSTALL_PREFIX=${VENTUS_INSTALL_PREFIX}
ninja
ninja install
}
# Build libclc for pocl
build_libclc() {
if [ ! -d "${LIBCLC_BUILD_DIR}" ]; then
mkdir ${LIBCLC_BUILD_DIR}
fi
cd ${LIBCLC_BUILD_DIR}
cmake -G Ninja -B ${LIBCLC_BUILD_DIR} ${DIR}/libclc \
-DCMAKE_LLAsm_COMPILER_WORKS=ON \
-DCMAKE_CLC_COMPILER_WORKS=ON \
-DCMAKE_CLC_COMPILER_FORCED=ON \
-DCMAKE_LLAsm_FLAGS="-target riscv32 -mcpu=ventus-gpgpu" \
-DLIBCLC_TARGETS_TO_BUILD="riscv32--" \
-DCMAKE_CXX_FLAGS="-I ${DIR}/llvm/include/ -std=c++17" \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DCMAKE_INSTALL_PREFIX=${VENTUS_INSTALL_PREFIX}
ninja
ninja install
DstDir=${VENTUS_INSTALL_PREFIX}/share/pocl
if [ ! -d "${DstDir}" ]; then
mkdir -p ${DstDir}
fi
# TODO: make this copy process done during libclc build process?
cp ${LIBCLC_BUILD_DIR}/riscv32--.bc ${DstDir}/kernel-riscv32.bc
}
# Build icd_loader
build_icd_loader() {
cd ${OCL_ICD_DIR}
./bootstrap
./configure --prefix=${VENTUS_INSTALL_PREFIX}
make && make install
}
# Export needed path and enviroment variables
export_elements() {
export PATH=${VENTUS_INSTALL_PREFIX}/bin:$PATH
export LD_LIBRARY_PATH=${VENTUS_INSTALL_PREFIX}/lib
}
# When no need to build llvm-ventus, export needed elements
if [[ ! "${PROGRAMS_TOBUILD[*]}" =~ "llvm-ventus" ]];then
export_elements
fi
# Process build options
for program in "${PROGRAMS_TOBUILD[@]}"
do
if [ "${program}" == "llvm-ventus" ];then
build_ventus
export_elements
elif [ "${program}" == "pocl" ]; then
build_pocl
elif [ "${program}" == "ocl-icd" ];then
build_icd_loader
elif [ "${program}" == "libclc" ];then
build_libclc
else
echo "Invalid build options: \"${program}\" , try $0 --help for help"
exit 1
fi
done

View File

@ -43,6 +43,10 @@ set( LIBCLC_TARGETS_TO_BUILD "all"
option( ENABLE_RUNTIME_SUBNORMAL "Enable runtime linking of subnormal support."
OFF )
# This will make built library put in lib directory
set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
install(DIRECTORY ${LLVM_LIBRARY_OUTPUT_INTDIR} DESTINATION ${CMAKE_INSTALL_PREFIX})
find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}")
include(AddLLVM)

View File

@ -6,9 +6,20 @@ set(CMAKE_ASM_COMPILER clang)
set(CMAKE_ASM_FLAGS ${CMAKE_LLAsm_FLAGS})
# workitem builtins
add_library(workitem STATIC workitem/workitem.S)
target_include_directories(workitem PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
llvm_add_library(workitem STATIC workitem/workitem.S)
# crts
add_library(crt0 OBJECT crt0.S)
set(LIBNAME "ctr0")
set(LIBNAME_OBJ "${LIBNAME}_obj")
add_library(${LIBNAME_OBJ} OBJECT crt0.S)
add_library(${LIBNAME} SHARED $<TARGET_OBJECTS:${LIBNAME_OBJ}>)
target_include_directories(workitem PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
# Copy crt0 object library to lib folder to be automatically installed
add_custom_command(TARGET ${LIBNAME}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_OBJECTS:${LIBNAME_OBJ}>
${LLVM_LIBRARY_OUTPUT_INTDIR}/crt0.o
)