build_odin.sh 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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. LDFLAGS="$LDFLAGS -liconv -ldl"
  38. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  39. LDFLAGS="$LDFLAGS -lLLVM-C"
  40. }
  41. config_freebsd() {
  42. : ${LLVM_CONFIG=}
  43. if [ ! "$LLVM_CONFIG" ]; then
  44. if which llvm-config11 > /dev/null 2>&1; then
  45. LLVM_CONFIG=llvm-config11
  46. elif which llvm-config12 > /dev/null 2>&1; then
  47. LLVM_CONFIG=llvm-config12
  48. elif which llvm-config13 > /dev/null 2>&1; then
  49. LLVM_CONFIG=llvm-config13
  50. else
  51. panic "Unable to find LLVM-config"
  52. fi
  53. fi
  54. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  55. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  56. }
  57. config_openbsd() {
  58. : ${LLVM_CONFIG=/usr/local/bin/llvm-config}
  59. LDFLAGS="$LDFLAGS -liconv"
  60. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  61. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  62. }
  63. config_linux() {
  64. : ${LLVM_CONFIG=}
  65. if [ ! "$LLVM_CONFIG" ]; then
  66. if which llvm-config > /dev/null 2>&1; then
  67. LLVM_CONFIG=llvm-config
  68. elif which llvm-config-11 > /dev/null 2>&1; then
  69. LLVM_CONFIG=llvm-config-11
  70. elif which llvm-config-11-64 > /dev/null 2>&1; then
  71. LLVM_CONFIG=llvm-config-11-64
  72. else
  73. panic "Unable to find LLVM-config"
  74. fi
  75. fi
  76. MIN_LLVM_VERSION=("11.0.0")
  77. if [ $(version $($LLVM_CONFIG --version)) -lt $(version $MIN_LLVM_VERSION) ]; then
  78. echo "Tried to use " $(which $LLVM_CONFIG) "version" $($LLVM_CONFIG --version)
  79. panic "Requirement: llvm-config must be base version greater than 11"
  80. fi
  81. LDFLAGS="$LDFLAGS -ldl"
  82. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  83. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs --libfiles) -Wl,-rpath=\$ORIGIN"
  84. # Creates a copy of the llvm library in the build dir, this is meant to support compiler explorer.
  85. # The annoyance is that this copy can be cluttering the development folder. TODO: split staging folders
  86. # for development and compiler explorer builds
  87. cp $(readlink -f $($LLVM_CONFIG --libfiles)) ./
  88. }
  89. build_odin() {
  90. case $1 in
  91. debug)
  92. EXTRAFLAGS="-g"
  93. ;;
  94. release)
  95. EXTRAFLAGS="-O3"
  96. ;;
  97. release-native)
  98. EXTRAFLAGS="-O3 -march=native"
  99. ;;
  100. nightly)
  101. EXTRAFLAGS="-DNIGHTLY -O3"
  102. ;;
  103. *)
  104. panic "Build mode unsupported!"
  105. esac
  106. set -x
  107. $CXX src/main.cpp src/libtommath.cpp $DISABLED_WARNINGS $CPPFLAGS $CXXFLAGS $EXTRAFLAGS $LDFLAGS -o odin
  108. set +x
  109. }
  110. run_demo() {
  111. ./odin run examples/demo/demo.odin -file
  112. }
  113. case $OS in
  114. Linux)
  115. config_linux
  116. ;;
  117. Darwin)
  118. config_darwin
  119. ;;
  120. OpenBSD)
  121. config_openbsd
  122. ;;
  123. FreeBSD)
  124. config_freebsd
  125. ;;
  126. *)
  127. panic "Platform unsupported!"
  128. esac
  129. if [[ $# -eq 0 ]]; then
  130. build_odin debug
  131. run_demo
  132. exit 0
  133. fi
  134. if [[ $# -eq 1 ]]; then
  135. case $1 in
  136. report)
  137. if [[ ! -f "./odin" ]]; then
  138. build_odin debug
  139. fi
  140. ./odin report
  141. exit 0
  142. ;;
  143. *)
  144. build_odin $1
  145. ;;
  146. esac
  147. run_demo
  148. exit 0
  149. else
  150. panic "Too many arguments!"
  151. fi