build_odin.sh 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #!/usr/bin/env bash
  2. set -eu
  3. : ${CXX=clang++}
  4. : ${CPPFLAGS=}
  5. : ${CXXFLAGS=}
  6. : ${LDFLAGS=}
  7. : ${ODIN_VERSION=dev-$(date +"%Y-%m")}
  8. : ${GIT_SHA=}
  9. CPPFLAGS="$CPPFLAGS -DODIN_VERSION_RAW=\"$ODIN_VERSION\""
  10. CXXFLAGS="$CXXFLAGS -std=c++14"
  11. LDFLAGS="$LDFLAGS -pthread -lm -lstdc++"
  12. if [ -d ".git" ]; then
  13. GIT_SHA=$(git rev-parse --short HEAD || :)
  14. if [ "$GIT_SHA" ]; then
  15. CPPFLAGS="$CPPFLAGS -DGIT_SHA=\"$GIT_SHA\""
  16. fi
  17. fi
  18. DISABLED_WARNINGS="-Wno-switch -Wno-macro-redefined -Wno-unused-value"
  19. OS=$(uname)
  20. panic() {
  21. printf "%s\n" "$1"
  22. exit 1
  23. }
  24. version() { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; }
  25. config_darwin() {
  26. local ARCH=$(uname -m)
  27. : ${LLVM_CONFIG=llvm-config}
  28. # allow for arm only llvm's with version 13
  29. if [ "${ARCH}" == "arm64" ]; then
  30. MIN_LLVM_VERSION=("13.0.0")
  31. else
  32. # allow for x86 / amd64 all llvm versions beginning from 11
  33. MIN_LLVM_VERSION=("11.1.0")
  34. fi
  35. if [ $(version $($LLVM_CONFIG --version)) -lt $(version $MIN_LLVM_VERSION) ]; then
  36. if [ "${ARCH}" == "arm64" ]; then
  37. panic "Requirement: llvm-config must be base version 13 for arm64"
  38. else
  39. panic "Requirement: llvm-config must be base version greater than 11 for amd64/x86"
  40. fi
  41. fi
  42. MAX_LLVM_VERSION=("14.999.999")
  43. if [ $(version $($LLVM_CONFIG --version)) -gt $(version $MAX_LLVM_VERSION) ]; then
  44. echo "Tried to use " $(which $LLVM_CONFIG) "version" $($LLVM_CONFIG --version)
  45. panic "Requirement: llvm-config must be base version smaller than 15"
  46. fi
  47. LDFLAGS="$LDFLAGS -liconv -ldl -framework System"
  48. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  49. LDFLAGS="$LDFLAGS -lLLVM-C"
  50. }
  51. config_freebsd() {
  52. : ${LLVM_CONFIG=}
  53. if [ ! "$LLVM_CONFIG" ]; then
  54. if [ -x "$(command -v llvm-config11)" ]; then
  55. LLVM_CONFIG=llvm-config11
  56. elif [ -x "$(command -v llvm-config12)" ]; then
  57. LLVM_CONFIG=llvm-config12
  58. elif [ -x "$(command -v llvm-config13)" ]; then
  59. LLVM_CONFIG=llvm-config13
  60. else
  61. panic "Unable to find LLVM-config"
  62. fi
  63. fi
  64. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  65. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  66. }
  67. config_openbsd() {
  68. : ${LLVM_CONFIG=/usr/local/bin/llvm-config}
  69. LDFLAGS="$LDFLAGS -liconv"
  70. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  71. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  72. }
  73. config_linux() {
  74. : ${LLVM_CONFIG=}
  75. if [ ! "$LLVM_CONFIG" ]; then
  76. if [ -x "$(command -v llvm-config)" ]; then
  77. LLVM_CONFIG=llvm-config
  78. elif [ -x "$(command -v llvm-config-11)" ]; then
  79. LLVM_CONFIG=llvm-config-11
  80. elif [ -x "$(command -v llvm-config-11-64)" ]; then
  81. LLVM_CONFIG=llvm-config-11-64
  82. elif [ -x "$(command -v llvm-config-14)" ]; then
  83. LLVM_CONFIG=llvm-config-14
  84. else
  85. panic "Unable to find LLVM-config"
  86. fi
  87. fi
  88. MIN_LLVM_VERSION=("11.0.0")
  89. if [ $(version $($LLVM_CONFIG --version)) -lt $(version $MIN_LLVM_VERSION) ]; then
  90. echo "Tried to use " $(which $LLVM_CONFIG) "version" $($LLVM_CONFIG --version)
  91. panic "Requirement: llvm-config must be base version greater than 11"
  92. fi
  93. MAX_LLVM_VERSION=("14.999.999")
  94. if [ $(version $($LLVM_CONFIG --version)) -gt $(version $MAX_LLVM_VERSION) ]; then
  95. echo "Tried to use " $(which $LLVM_CONFIG) "version" $($LLVM_CONFIG --version)
  96. panic "Requirement: llvm-config must be base version smaller than 15"
  97. fi
  98. LDFLAGS="$LDFLAGS -ldl"
  99. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  100. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs --libfiles) -Wl,-rpath=\$ORIGIN"
  101. # Creates a copy of the llvm library in the build dir, this is meant to support compiler explorer.
  102. # The annoyance is that this copy can be cluttering the development folder. TODO: split staging folders
  103. # for development and compiler explorer builds
  104. cp $(readlink -f $($LLVM_CONFIG --libfiles)) ./
  105. }
  106. build_odin() {
  107. case $1 in
  108. debug)
  109. EXTRAFLAGS="-g"
  110. ;;
  111. release)
  112. EXTRAFLAGS="-O3"
  113. ;;
  114. release-native)
  115. local ARCH=$(uname -m)
  116. if [ "${ARCH}" == "arm64" ]; then
  117. # Use preferred flag for Arm (ie arm64 / aarch64 / etc)
  118. EXTRAFLAGS="-O3 -mcpu=native"
  119. else
  120. # Use preferred flag for x86 / amd64
  121. EXTRAFLAGS="-O3 -march=native"
  122. fi
  123. ;;
  124. nightly)
  125. EXTRAFLAGS="-DNIGHTLY -O3"
  126. ;;
  127. *)
  128. panic "Build mode unsupported!"
  129. ;;
  130. esac
  131. set -x
  132. $CXX src/main.cpp src/libtommath.cpp $DISABLED_WARNINGS $CPPFLAGS $CXXFLAGS $EXTRAFLAGS $LDFLAGS -o odin
  133. set +x
  134. }
  135. run_demo() {
  136. ./odin run examples/demo/demo.odin -file
  137. }
  138. have_which() {
  139. if ! command -v which > /dev/null 2>&1 ; then
  140. panic "Could not find \`which\`"
  141. fi
  142. }
  143. have_which
  144. case $OS in
  145. Linux)
  146. config_linux
  147. ;;
  148. Darwin)
  149. config_darwin
  150. ;;
  151. OpenBSD)
  152. config_openbsd
  153. ;;
  154. FreeBSD)
  155. config_freebsd
  156. ;;
  157. *)
  158. panic "Platform unsupported!"
  159. ;;
  160. esac
  161. if [[ $# -eq 0 ]]; then
  162. build_odin debug
  163. run_demo
  164. exit 0
  165. fi
  166. if [[ $# -eq 1 ]]; then
  167. case $1 in
  168. report)
  169. if [[ ! -f "./odin" ]]; then
  170. build_odin debug
  171. fi
  172. ./odin report
  173. exit 0
  174. ;;
  175. *)
  176. build_odin $1
  177. ;;
  178. esac
  179. run_demo
  180. exit 0
  181. else
  182. panic "Too many arguments!"
  183. fi