build_odin.sh 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #!/usr/bin/env sh
  2. set -eu
  3. : ${CPPFLAGS=}
  4. : ${CXX=clang++}
  5. : ${CXXFLAGS=}
  6. : ${LDFLAGS=}
  7. : ${LLVM_CONFIG=}
  8. CPPFLAGS="$CPPFLAGS -DODIN_VERSION_RAW=\"dev-$(date +"%Y-%m")\""
  9. CXXFLAGS="$CXXFLAGS -std=c++14"
  10. DISABLED_WARNINGS="-Wno-switch -Wno-macro-redefined -Wno-unused-value"
  11. LDFLAGS="$LDFLAGS -pthread -lm -lstdc++"
  12. OS_ARCH="$(uname -m)"
  13. OS_NAME="$(uname -s)"
  14. if [ -d ".git" ] && [ -n "$(command -v git)" ]; then
  15. GIT_SHA=$(git show --pretty='%h' --no-patch --no-notes HEAD)
  16. CPPFLAGS="$CPPFLAGS -DGIT_SHA=\"$GIT_SHA\""
  17. fi
  18. error() {
  19. printf "ERROR: %s\n" "$1"
  20. exit 1
  21. }
  22. if [ -z "$LLVM_CONFIG" ]; then
  23. # darwin, linux, openbsd
  24. if [ -n "$(command -v llvm-config-17)" ]; then LLVM_CONFIG="llvm-config-17"
  25. elif [ -n "$(command -v llvm-config-13)" ]; then LLVM_CONFIG="llvm-config-13"
  26. elif [ -n "$(command -v llvm-config-12)" ]; then LLVM_CONFIG="llvm-config-12"
  27. elif [ -n "$(command -v llvm-config-11)" ]; then LLVM_CONFIG="llvm-config-11"
  28. # freebsd
  29. elif [ -n "$(command -v llvm-config17)" ]; then LLVM_CONFIG="llvm-config-17"
  30. elif [ -n "$(command -v llvm-config13)" ]; then LLVM_CONFIG="llvm-config-13"
  31. elif [ -n "$(command -v llvm-config12)" ]; then LLVM_CONFIG="llvm-config-12"
  32. elif [ -n "$(command -v llvm-config11)" ]; then LLVM_CONFIG="llvm-config-11"
  33. # fallback
  34. elif [ -n "$(command -v llvm-config)" ]; then LLVM_CONFIG="llvm-config"
  35. else
  36. error "No llvm-config command found. Set LLVM_CONFIG to proceed."
  37. fi
  38. fi
  39. LLVM_VERSION="$($LLVM_CONFIG --version)"
  40. LLVM_VERSION_MAJOR="$(echo $LLVM_VERSION | awk -F. '{print $1}')"
  41. LLVM_VERSION_MINOR="$(echo $LLVM_VERSION | awk -F. '{print $2}')"
  42. LLVM_VERSION_PATCH="$(echo $LLVM_VERSION | awk -F. '{print $3}')"
  43. if [ $LLVM_VERSION_MAJOR -lt 11 ] ||
  44. ([ $LLVM_VERSION_MAJOR -gt 14 ] && [ $LLVM_VERSION_MAJOR -lt 17 ]); then
  45. error "Invalid LLVM version $LLVM_VERSION: must be 11, 12, 13, 14 or 17"
  46. fi
  47. case "$OS_NAME" in
  48. Darwin)
  49. if [ "$OS_ARCH" == "arm64" ]; then
  50. if [ $LLVM_VERSION_MAJOR -lt 13 ] || [ $LLVM_VERSION_MAJOR -gt 17 ]; then
  51. error "Darwin Arm64 requires LLVM 13, 14 or 17"
  52. fi
  53. fi
  54. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  55. LDFLAGS="$LDFLAGS -liconv -ldl -framework System"
  56. LDFLAGS="$LDFLAGS -lLLVM-C"
  57. ;;
  58. FreeBSD)
  59. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  60. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  61. ;;
  62. Linux)
  63. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  64. LDFLAGS="$LDFLAGS -ldl $($LLVM_CONFIG --libs core native --system-libs --libfiles)"
  65. # Copy libLLVM*.so into current directory for linking
  66. # NOTE: This is needed by the Linux release pipeline!
  67. cp $(readlink -f $($LLVM_CONFIG --libfiles)) ./
  68. LDFLAGS="$LDFLAGS -Wl,-rpath=\$ORIGIN"
  69. ;;
  70. OpenBSD)
  71. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  72. LDFLAGS="$LDFLAGS -liconv"
  73. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  74. ;;
  75. *)
  76. error "Platform \"$OS_NAME\" unsupported"
  77. ;;
  78. esac
  79. build_odin() {
  80. case $1 in
  81. debug)
  82. EXTRAFLAGS="-g"
  83. ;;
  84. release)
  85. EXTRAFLAGS="-O3"
  86. ;;
  87. release-native)
  88. if [ "$OS_ARCH" == "arm64" ]; then
  89. # Use preferred flag for Arm (ie arm64 / aarch64 / etc)
  90. EXTRAFLAGS="-O3 -mcpu=native"
  91. else
  92. # Use preferred flag for x86 / amd64
  93. EXTRAFLAGS="-O3 -march=native"
  94. fi
  95. ;;
  96. nightly)
  97. EXTRAFLAGS="-DNIGHTLY -O3"
  98. ;;
  99. *)
  100. error "Build mode \"$1\" unsupported!"
  101. ;;
  102. esac
  103. set -x
  104. $CXX src/main.cpp src/libtommath.cpp $DISABLED_WARNINGS $CPPFLAGS $CXXFLAGS $EXTRAFLAGS $LDFLAGS -o odin
  105. set +x
  106. }
  107. run_demo() {
  108. ./odin run examples/demo/demo.odin -file
  109. }
  110. if [ $# -eq 0 ]; then
  111. build_odin debug
  112. run_demo
  113. elif [ $# -eq 1 ]; then
  114. case $1 in
  115. report)
  116. [ ! -f "./odin" ] && build_odin debug
  117. ./odin report
  118. ;;
  119. *)
  120. build_odin $1
  121. ;;
  122. esac
  123. run_demo
  124. else
  125. error "Too many arguments!"
  126. fi