build_odin.sh 5.1 KB

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