build_odin.sh 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #!/usr/bin/env bash
  2. set -eu
  3. : ${CXX=clang++}
  4. : ${CPPFLAGS=}
  5. : ${CXXFLAGS=}
  6. : ${INCLUDE_DIRECTORIES=}
  7. : ${LDFLAGS=}
  8. : ${ODIN_VERSION=dev-$(date +"%Y-%m")}
  9. : ${GIT_SHA=}
  10. CPPFLAGS="$CPPFLAGS -DODIN_VERSION_RAW=\"$ODIN_VERSION\""
  11. CXXFLAGS="$CXXFLAGS -std=c++14"
  12. INCLUDE_DIRECTORIES="$INCLUDE_DIRECTORIES -Isrc/"
  13. LDFLAGS="$LDFLAGS -pthread -lm -lstdc++"
  14. if [ -d ".git" ]; then
  15. GIT_SHA=$(git rev-parse --short HEAD || :)
  16. if [ "$GIT_SHA" ]; then
  17. CPPFLAGS="$CPPFLAGS -DGIT_SHA=\"$GIT_SHA\""
  18. fi
  19. fi
  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. EXTRAFLAGS="-O3 -march=native"
  118. ;;
  119. nightly)
  120. EXTRAFLAGS="-DNIGHTLY -O3"
  121. ;;
  122. *)
  123. panic "Build mode unsupported!"
  124. ;;
  125. esac
  126. set -x
  127. $CXX src/main.cpp src/libtommath.cpp $DISABLED_WARNINGS $CPPFLAGS $CXXFLAGS $INCLUDE_DIRECTORIES $EXTRAFLAGS $LDFLAGS -o odin
  128. set +x
  129. }
  130. run_demo() {
  131. ./odin run examples/demo/demo.odin -file
  132. }
  133. have_which() {
  134. if ! command -v which > /dev/null 2>&1 ; then
  135. panic "Could not find \`which\`"
  136. fi
  137. }
  138. have_which
  139. case $OS in
  140. Linux)
  141. config_linux
  142. ;;
  143. Darwin)
  144. config_darwin
  145. ;;
  146. OpenBSD)
  147. config_openbsd
  148. ;;
  149. FreeBSD)
  150. config_freebsd
  151. ;;
  152. *)
  153. panic "Platform unsupported!"
  154. ;;
  155. esac
  156. if [[ $# -eq 0 ]]; then
  157. build_odin debug
  158. run_demo
  159. exit 0
  160. fi
  161. if [[ $# -eq 1 ]]; then
  162. case $1 in
  163. report)
  164. if [[ ! -f "./odin" ]]; then
  165. build_odin debug
  166. fi
  167. ./odin report
  168. exit 0
  169. ;;
  170. *)
  171. build_odin $1
  172. ;;
  173. esac
  174. run_demo
  175. exit 0
  176. else
  177. panic "Too many arguments!"
  178. fi