146 lines
4.1 KiB
Bash
146 lines
4.1 KiB
Bash
cmake-llvm () {
|
|
local cmake_args=("-G" "Ninja")
|
|
|
|
# find cmake root dir
|
|
# if defined PROJECT or P, use it as project root
|
|
# if within git (git rev-parse --is-inside-work-tree), use git rev-parse --show-toplevel
|
|
# if setted LLVM_ROOT, use it
|
|
# default "../llvm", if not exist, error
|
|
local llvm_root=".."
|
|
if [ -n "${PROJECT}" ]; then
|
|
llvm_root="${PROJECT}"
|
|
elif [ -n "${P}" ]; then
|
|
llvm_root="${P}"
|
|
elif git rev-parse --is-inside-work-tree &> /dev/null; then
|
|
llvm_root=$(git rev-parse --show-toplevel)
|
|
elif [ -n "${LLVM_ROOT}" ]; then
|
|
llvm_root="${LLVM_ROOT}"
|
|
fi
|
|
if [ ! -d "${llvm_root}/llvm" ]; then
|
|
echo "Error: not inside a llvm directory"
|
|
return 1
|
|
fi
|
|
cmake_args+=("${llvm_root}/llvm")
|
|
|
|
# Set build_type from arg[1]
|
|
local build_type="${1}"
|
|
if [ -z "${build_type}" ]; then
|
|
echo "Error: build_type is empty"
|
|
return 1
|
|
fi
|
|
cmake_args+=("-DCMAKE_BUILD_TYPE=${build_type}")
|
|
|
|
# check LLVM_PROJECTS env
|
|
if [ -z "${LLVM_PROJECTS}" ]; then
|
|
echo "Error: LLVM_PROJECTS env is not set"
|
|
return 1
|
|
fi
|
|
cmake_args+=("-DLLVM_ENABLE_PROJECTS=${LLVM_PROJECTS}")
|
|
|
|
# check LLVM_TARGETS
|
|
if [ -z "${LLVM_TARGETS}" ]; then
|
|
echo "Error: LLVM_TARGETS env is not set"
|
|
return 1
|
|
fi
|
|
cmake_args+=("-DLLVM_TARGETS_TO_BUILD=${LLVM_TARGETS}")
|
|
|
|
# if setted LLVM_COMPILER, use it, else default clang
|
|
if [ -z "${LLVM_COMPILER}" ]; then
|
|
# if setted CMAKE_C_COMPILER or CMAKE_CXX_COMPILER, use it, else default clang
|
|
cmake_args+=(
|
|
"-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER:-clang}"
|
|
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER:-clang++}"
|
|
)
|
|
elif [ "${LLVM_COMPILER}" == "gcc" ]; then
|
|
cmake_args+=("-DCMAKE_C_COMPILER=gcc" "-DCMAKE_CXX_COMPILER=g++")
|
|
elif [ "${LLVM_COMPILER}" == "clang" ]; then
|
|
cmake_args+=("-DCMAKE_C_COMPILER=clang" "-DCMAKE_CXX_COMPILER=clang++")
|
|
else
|
|
echo "Error: LLVM_COMPILER is invalid"
|
|
return 1
|
|
fi
|
|
|
|
# if not setted LLVM_NO_*, use default optimized options
|
|
if [ -z "${LLVM_NO_SHARED}" ]; then
|
|
cmake_args+=("-DBUILD_SHARED_LIBS=On")
|
|
fi
|
|
if [ -z "${LLVM_APPEND_VC_REV}"]; then
|
|
cmake_args+=("-DLLVM_APPEND_VC_REV=Off")
|
|
fi
|
|
if [ -z "${LLVM_NO_LLD}" ]; then
|
|
cmake_args+=("-DLLVM_ENABLE_LLD=On")
|
|
fi
|
|
if [ -z "${LLVM_NO_OPT_TABLEGEN}" ]; then
|
|
cmake_args+=("-DLLVM_OPTIMIZED_TABLEGEN=On")
|
|
fi
|
|
if [ -z "${LLVM_NO_SPLIT_DWARF}" ]; then
|
|
cmake_args+=("-DLLVM_USE_SPLIT_DWARF=On")
|
|
fi
|
|
|
|
cmake_args+=("-DCMAKE_EXPORT_COMPILE_COMMANDS=On")
|
|
|
|
# append args[2:] to cmake_args
|
|
cmake_args+=("${@:2}")
|
|
|
|
# print cmake args, one for each line
|
|
# and ask for confirmation
|
|
for arg in "${cmake_args[@]}"; do
|
|
echo "${arg}"
|
|
done
|
|
read "?Press enter to continue?"
|
|
|
|
# run cmake with cmake_args
|
|
cmake "${cmake_args[@]}"
|
|
}
|
|
|
|
git-local-exclude () {
|
|
local file="${1}"
|
|
|
|
# if file is empty, exit
|
|
if [ -z "${file}" ]; then
|
|
echo "Error: file is empty"
|
|
return 1
|
|
fi
|
|
|
|
# if .git/info/exclude not exist, exit
|
|
if [ ! -f .git/info/exclude ]; then
|
|
echo "warning: .git/info/exclude not exist, maybe in other worktree?"
|
|
return 1
|
|
fi
|
|
|
|
echo "${file}" >> .git/info/exclude
|
|
}
|
|
|
|
generate-local-dir () {
|
|
if git rev-parse --is-inside-work-tree &> /dev/null; then
|
|
project_root=$(git rev-parse --show-toplevel)
|
|
else
|
|
echo "Error: not inside a git repository"
|
|
return 1
|
|
fi
|
|
|
|
pushd "${project_root}"
|
|
git-local-exclude .local
|
|
mkdir -p .local
|
|
mkdir -p .local/bin
|
|
touch .local/notes.md
|
|
|
|
cat > .local/env.sh << EOF
|
|
export P="${project_root}"
|
|
export D="\$P/build-debug/bin"
|
|
export R="\$P/build-release/bin"
|
|
export L="\$P/.local"
|
|
|
|
export PATH="\$L/bin:\$PATH"
|
|
EOF
|
|
|
|
git-local-exclude .vscode
|
|
mkdir -p .vscode
|
|
if [ -f .vscode/settings.json ]; then
|
|
echo "Warning: .vscode/settings.json already exist"
|
|
else
|
|
echo '{}' > .vscode/settings.json
|
|
fi
|
|
|
|
popd
|
|
} |