build_odin.sh 4.5 KB

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