build_odin.sh 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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=/usr/local/bin/llvm-config11}
  43. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  44. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  45. }
  46. config_openbsd() {
  47. : ${LLVM_CONFIG=/usr/local/bin/llvm-config}
  48. LDFLAGS="$LDFLAGS -liconv"
  49. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  50. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  51. }
  52. config_linux() {
  53. : ${LLVM_CONFIG=}
  54. if [ ! "$LLVM_CONFIG" ]; then
  55. if which llvm-config > /dev/null 2>&1; then
  56. LLVM_CONFIG=llvm-config
  57. elif which llvm-config-11 > /dev/null 2>&1; then
  58. LLVM_CONFIG=llvm-config-11
  59. elif which llvm-config-11-64 > /dev/null 2>&1; then
  60. LLVM_CONFIG=llvm-config-11-64
  61. else
  62. panic "Unable to find LLVM-config"
  63. fi
  64. fi
  65. MIN_LLVM_VERSION=("11.0.0")
  66. if [ $(version $($LLVM_CONFIG --version)) -lt $(version $MIN_LLVM_VERSION) ]; then
  67. echo "Tried to use " $(which $LLVM_CONFIG) "version" $($LLVM_CONFIG --version)
  68. panic "Requirement: llvm-config must be base version greater than 11"
  69. fi
  70. LDFLAGS="$LDFLAGS -ldl"
  71. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  72. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  73. }
  74. build_odin() {
  75. case $1 in
  76. debug)
  77. EXTRAFLAGS="-g"
  78. ;;
  79. release)
  80. EXTRAFLAGS="-O3"
  81. ;;
  82. release-native)
  83. EXTRAFLAGS="-O3 -march=native"
  84. ;;
  85. nightly)
  86. EXTRAFLAGS="-DNIGHTLY -O3"
  87. ;;
  88. *)
  89. panic "Build mode unsupported!"
  90. esac
  91. set -x
  92. $CXX src/main.cpp src/libtommath.cpp $DISABLED_WARNINGS $CPPFLAGS $CXXFLAGS $EXTRAFLAGS $LDFLAGS -o odin
  93. set +x
  94. }
  95. run_demo() {
  96. ./odin run examples/demo/demo.odin -file
  97. }
  98. case $OS in
  99. Linux)
  100. config_linux
  101. ;;
  102. Darwin)
  103. config_darwin
  104. ;;
  105. OpenBSD)
  106. config_openbsd
  107. ;;
  108. FreeBSD)
  109. config_freebsd
  110. ;;
  111. *)
  112. panic "Platform unsupported!"
  113. esac
  114. if [[ $# -eq 0 ]]; then
  115. build_odin debug
  116. run_demo
  117. exit 0
  118. fi
  119. if [[ $# -eq 1 ]]; then
  120. case $1 in
  121. report)
  122. if [[ ! -f "./odin" ]]; then
  123. build_odin debug
  124. fi
  125. ./odin report
  126. exit 0
  127. ;;
  128. *)
  129. build_odin $1
  130. ;;
  131. esac
  132. run_demo
  133. exit 0
  134. else
  135. panic "Too many arguments!"
  136. fi