diff options
| author | jcmdln <jcmdln@gmail.com> | 2023-10-14 16:58:34 -0400 |
|---|---|---|
| committer | jcmdln <jcmdln@gmail.com> | 2023-10-14 16:58:34 -0400 |
| commit | bdc74a03c0c87aaf8d5fdc2cd9f31791ba7a81e0 (patch) | |
| tree | cf52490559f10ebc9e7f2130398f53f98f935b71 /build_odin.sh | |
| parent | fa2b68dac6c28290d39d1a381ec948c391b8e2ff (diff) | |
Refactor to improve handling of LLVM_VERSION checks
Diffstat (limited to 'build_odin.sh')
| -rwxr-xr-x | build_odin.sh | 206 |
1 files changed, 52 insertions, 154 deletions
diff --git a/build_odin.sh b/build_odin.sh index 2c6cb06df..4111e61f1 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -1,135 +1,69 @@ #!/usr/bin/env bash set -eu -: ${CXX=clang++} : ${CPPFLAGS=} +: ${CXX=clang++} : ${CXXFLAGS=} : ${LDFLAGS=} -: ${ODIN_VERSION=dev-$(date +"%Y-%m")} -: ${GIT_SHA=} +: ${LLVM_CONFIG=llvm-config} +CPPFLAGS="$CPPFLAGS -DODIN_VERSION_RAW=\"dev-$(date +"%Y-%m")\"" CXXFLAGS="$CXXFLAGS -std=c++14" +DISABLED_WARNINGS="-Wno-switch -Wno-macro-redefined -Wno-unused-value" LDFLAGS="$LDFLAGS -pthread -lm -lstdc++" -if [ -d ".git" ] && [ $(which git) ]; then - versionTag=( $(git show --pretty='%cd %h' --date=format:%Y-%m --no-patch --no-notes HEAD) ) - if [ $? -eq 0 ]; then - ODIN_VERSION="dev-${versionTag[0]}" - GIT_SHA="${versionTag[1]}" - CPPFLAGS="$CPPFLAGS -DGIT_SHA=\"$GIT_SHA\"" - fi -fi - -CPPFLAGS="$CPPFLAGS -DODIN_VERSION_RAW=\"$ODIN_VERSION\"" - -DISABLED_WARNINGS="-Wno-switch -Wno-macro-redefined -Wno-unused-value" -OS=$(uname) +LLVM_VERSION="$($LLVM_CONFIG --version)" +LLVM_VERSION_MAJOR="$(echo $LLVM_VERSION | awk -F. '{print $1}')" +LLVM_VERSION_MINOR="$(echo $LLVM_VERSION | awk -F. '{print $2}')" +LLVM_VERSION_PATCH="$(echo $LLVM_VERSION | awk -F. '{print $3}')" +OS_ARCH="$(uname -m)" +OS_NAME="$(uname -s)" -panic() { - printf "%s\n" "$1" +error() { + printf "ERROR: %s\n" "$1" exit 1 } -version() { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; } - -config_darwin() { - local ARCH=$(uname -m) - : ${LLVM_CONFIG=llvm-config} +if [ -d ".git" ] && [ -n "$(command -v git)" ]; then + GIT_SHA=($(git show --pretty='%h'--no-patch --no-notes HEAD)) + CPPFLAGS="$CPPFLAGS -DGIT_SHA=\"$GIT_SHA\"" +fi - # allow for arm only llvm's with version 13 - if [ "${ARCH}" == "arm64" ]; then - MIN_LLVM_VERSION=("13.0.0") - else - # allow for x86 / amd64 all llvm versions beginning from 11 - MIN_LLVM_VERSION=("11.1.0") - fi +if [ $LLVM_VERSION_MAJOR -lt 11 ] || + ([ $LLVM_VERSION_MAJOR -gt 14 ] && [ $LLVM_VERSION_MAJOR -lt 17 ]); then + error "Invalid LLVM version $LLVM_VERSION: must be 11, 12, 13, 14 or 17" +fi - if [ $(version $($LLVM_CONFIG --version)) -lt $(version $MIN_LLVM_VERSION) ]; then - if [ "${ARCH}" == "arm64" ]; then - panic "Requirement: llvm-config must be base version 13 for arm64" - else - panic "Requirement: llvm-config must be base version greater than 11 for amd64/x86" +case "$OS_NAME" in +Darwin) + if [ "$OS_ARCH" == "arm64" ]; then + if [ $LLVM_VERSION_MAJOR -lt 13 ] || [ $LLVM_VERSION_MAJOR -gt 17 ]; then + error "Darwin Arm64 requires LLVM 13, 14 or 17" fi fi - MAX_LLVM_VERSION=("17.999.999") - if [ $(version $($LLVM_CONFIG --version)) -gt $(version $MAX_LLVM_VERSION) ]; then - echo "Tried to use " $(which $LLVM_CONFIG) "version" $($LLVM_CONFIG --version) - panic "Requirement: llvm-config must be base version smaller than 18" - fi - - LDFLAGS="$LDFLAGS -liconv -ldl -framework System" CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" + LDFLAGS="$LDFLAGS -liconv -ldl -framework System" LDFLAGS="$LDFLAGS -lLLVM-C" -} - -config_freebsd() { - : ${LLVM_CONFIG=} - - if [ ! "$LLVM_CONFIG" ]; then - if [ -x "$(command -v llvm-config11)" ]; then - LLVM_CONFIG=llvm-config11 - elif [ -x "$(command -v llvm-config12)" ]; then - LLVM_CONFIG=llvm-config12 - elif [ -x "$(command -v llvm-config13)" ]; then - LLVM_CONFIG=llvm-config13 - else - panic "Unable to find LLVM-config" - fi - fi - + ;; +FreeBSD) CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" -} - -config_openbsd() { - : ${LLVM_CONFIG=/usr/local/bin/llvm-config} - - LDFLAGS="$LDFLAGS -liconv" + ;; +Linux) CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" - LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" -} - -config_linux() { - : ${LLVM_CONFIG=} - - if [ ! "$LLVM_CONFIG" ]; then - if [ -x "$(command -v llvm-config)" ]; then - LLVM_CONFIG=llvm-config - elif [ -x "$(command -v llvm-config-11)" ]; then - LLVM_CONFIG=llvm-config-11 - elif [ -x "$(command -v llvm-config-11-64)" ]; then - LLVM_CONFIG=llvm-config-11-64 - elif [ -x "$(command -v llvm-config-14)" ]; then - LLVM_CONFIG=llvm-config-14 - elif [ -x "$(command -v llvm-config-17)" ]; then - LLVM_CONFIG=llvm-config-17 - else - panic "Unable to find LLVM-config" - fi - fi - - MIN_LLVM_VERSION=("11.0.0") - if [ $(version $($LLVM_CONFIG --version)) -lt $(version $MIN_LLVM_VERSION) ]; then - echo "Tried to use " $(which $LLVM_CONFIG) "version" $($LLVM_CONFIG --version) - panic "Requirement: llvm-config must be base version greater than 11" - fi - - MAX_LLVM_VERSION=("17.999.999") - if [ $(version $($LLVM_CONFIG --version)) -gt $(version $MAX_LLVM_VERSION) ]; then - echo "Tried to use " $(which $LLVM_CONFIG) "version" $($LLVM_CONFIG --version) - panic "Requirement: llvm-config must be base version smaller than 18" - fi - - LDFLAGS="$LDFLAGS -ldl" + LDFLAGS="$LDFLAGS -ldl -Wl,-rpath=$($LLVM_CONFIG --libdir)" + LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs --libfiles)" + ;; +OpenBSD) CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" - LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs --libfiles) -Wl,-rpath=\$ORIGIN" - - # Creates a copy of the llvm library in the build dir, this is meant to support compiler explorer. - # The annoyance is that this copy can be cluttering the development folder. TODO: split staging folders - # for development and compiler explorer builds - cp $(readlink -f $($LLVM_CONFIG --libfiles)) ./ -} + LDFLAGS="$LDFLAGS -liconv" + LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" + ;; +*) + error "Platform \"OS_NAME\" unsupported" + ;; +esac build_odin() { case $1 in @@ -140,20 +74,19 @@ build_odin() { EXTRAFLAGS="-O3" ;; release-native) - local ARCH=$(uname -m) - if [ "${ARCH}" == "arm64" ]; then - # Use preferred flag for Arm (ie arm64 / aarch64 / etc) - EXTRAFLAGS="-O3 -mcpu=native" - else - # Use preferred flag for x86 / amd64 - EXTRAFLAGS="-O3 -march=native" - fi + if [ "OS_ARCH" == "arm64" ]; then + # Use preferred flag for Arm (ie arm64 / aarch64 / etc) + EXTRAFLAGS="-O3 -mcpu=native" + else + # Use preferred flag for x86 / amd64 + EXTRAFLAGS="-O3 -march=native" + fi ;; nightly) EXTRAFLAGS="-DNIGHTLY -O3" ;; *) - panic "Build mode unsupported!" + error "Build mode \"$1\" unsupported!" ;; esac @@ -166,55 +99,20 @@ run_demo() { ./odin run examples/demo/demo.odin -file } -have_which() { - if ! command -v which > /dev/null 2>&1 ; then - panic "Could not find \`which\`" - fi -} - -have_which - -case $OS in -Linux) - config_linux - ;; -Darwin) - config_darwin - ;; -OpenBSD) - config_openbsd - ;; -FreeBSD) - config_freebsd - ;; -*) - panic "Platform unsupported!" - ;; -esac - if [[ $# -eq 0 ]]; then build_odin debug run_demo - exit 0 -fi - -if [[ $# -eq 1 ]]; then +elif [[ $# -eq 1 ]]; then case $1 in report) - if [[ ! -f "./odin" ]]; then - build_odin debug - fi - + [ ! -f "./odin" ] && build_odin debug ./odin report - exit 0 ;; *) build_odin $1 ;; esac - run_demo - exit 0 else - panic "Too many arguments!" + error "Too many arguments!" fi |