build_odin.sh 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #!/usr/bin/env sh
  2. set -eu
  3. : ${CPPFLAGS=}
  4. : ${CXXFLAGS=}
  5. : ${LDFLAGS=}
  6. : ${LLVM_CONFIG=}
  7. CXXFLAGS="$CXXFLAGS -std=c++14"
  8. DISABLED_WARNINGS="-Wno-switch -Wno-macro-redefined -Wno-unused-value"
  9. LDFLAGS="$LDFLAGS -pthread -lm"
  10. OS_ARCH="$(uname -m)"
  11. OS_NAME="$(uname -s)"
  12. if [ -d ".git" ] && [ -n "$(command -v git)" ]; then
  13. GIT_SHA=$(git show --pretty='%h' --no-patch --no-notes HEAD)
  14. GIT_DATE=$(git show "--pretty=%cd" "--date=format:%Y-%m" --no-patch --no-notes HEAD)
  15. CPPFLAGS="$CPPFLAGS -DGIT_SHA=\"$GIT_SHA\""
  16. else
  17. GIT_DATE=$(date +"%Y-%m")
  18. fi
  19. CPPFLAGS="$CPPFLAGS -DODIN_VERSION_RAW=\"dev-$GIT_DATE\""
  20. error() {
  21. printf "ERROR: %s\n" "$1"
  22. exit 1
  23. }
  24. # Brew advises people not to add llvm to their $PATH, so try and use brew to find it.
  25. if [ -z "$LLVM_CONFIG" ] && [ -n "$(command -v brew)" ]; then
  26. if [ -n "$(command -v $(brew --prefix llvm@20)/bin/llvm-config)" ]; then LLVM_CONFIG="$(brew --prefix llvm@20)/bin/llvm-config"
  27. elif [ -n "$(command -v $(brew --prefix llvm@19)/bin/llvm-config)" ]; then LLVM_CONFIG="$(brew --prefix llvm@19)/bin/llvm-config"
  28. elif [ -n "$(command -v $(brew --prefix llvm@18)/bin/llvm-config)" ]; then LLVM_CONFIG="$(brew --prefix llvm@18)/bin/llvm-config"
  29. elif [ -n "$(command -v $(brew --prefix llvm@17)/bin/llvm-config)" ]; then LLVM_CONFIG="$(brew --prefix llvm@17)/bin/llvm-config"
  30. elif [ -n "$(command -v $(brew --prefix llvm@14)/bin/llvm-config)" ]; then LLVM_CONFIG="$(brew --prefix llvm@14)/bin/llvm-config"
  31. fi
  32. fi
  33. if [ -z "$LLVM_CONFIG" ]; then
  34. # darwin, linux, openbsd
  35. if [ -n "$(command -v llvm-config-20)" ]; then LLVM_CONFIG="llvm-config-20"
  36. elif [ -n "$(command -v llvm-config-19)" ]; then LLVM_CONFIG="llvm-config-19"
  37. elif [ -n "$(command -v llvm-config-18)" ]; then LLVM_CONFIG="llvm-config-18"
  38. elif [ -n "$(command -v llvm-config-17)" ]; then LLVM_CONFIG="llvm-config-17"
  39. elif [ -n "$(command -v llvm-config-14)" ]; then LLVM_CONFIG="llvm-config-14"
  40. elif [ -n "$(command -v llvm-config-13)" ]; then LLVM_CONFIG="llvm-config-13"
  41. elif [ -n "$(command -v llvm-config-12)" ]; then LLVM_CONFIG="llvm-config-12"
  42. elif [ -n "$(command -v llvm-config-11)" ]; then LLVM_CONFIG="llvm-config-11"
  43. # freebsd
  44. elif [ -n "$(command -v llvm-config20)" ]; then LLVM_CONFIG="llvm-config20"
  45. elif [ -n "$(command -v llvm-config19)" ]; then LLVM_CONFIG="llvm-config19"
  46. elif [ -n "$(command -v llvm-config18)" ]; then LLVM_CONFIG="llvm-config18"
  47. elif [ -n "$(command -v llvm-config17)" ]; then LLVM_CONFIG="llvm-config17"
  48. elif [ -n "$(command -v llvm-config14)" ]; then LLVM_CONFIG="llvm-config14"
  49. elif [ -n "$(command -v llvm-config13)" ]; then LLVM_CONFIG="llvm-config13"
  50. elif [ -n "$(command -v llvm-config12)" ]; then LLVM_CONFIG="llvm-config12"
  51. elif [ -n "$(command -v llvm-config11)" ]; then LLVM_CONFIG="llvm-config11"
  52. # fallback
  53. elif [ -n "$(command -v llvm-config)" ]; then LLVM_CONFIG="llvm-config"
  54. else
  55. error "No llvm-config command found. Set LLVM_CONFIG to proceed."
  56. fi
  57. fi
  58. if [ -x "$(which clang++)" ]; then
  59. : ${CXX="clang++"}
  60. elif [ -x "$($LLVM_CONFIG --bindir)/clang++" ]; then
  61. : ${CXX=$($LLVM_CONFIG --bindir)/clang++}
  62. else
  63. error "No clang++ command found. Set CXX to proceed."
  64. fi
  65. LLVM_VERSION="$($LLVM_CONFIG --version)"
  66. LLVM_VERSION_MAJOR="$(echo $LLVM_VERSION | awk -F. '{print $1}')"
  67. LLVM_VERSION_MINOR="$(echo $LLVM_VERSION | awk -F. '{print $2}')"
  68. LLVM_VERSION_PATCH="$(echo $LLVM_VERSION | awk -F. '{print $3}')"
  69. if [ $LLVM_VERSION_MAJOR -lt 11 ] || ([ $LLVM_VERSION_MAJOR -gt 14 ] && [ $LLVM_VERSION_MAJOR -lt 17 ]) || [ $LLVM_VERSION_MAJOR -gt 20 ]; then
  70. error "Invalid LLVM version $LLVM_VERSION: must be 11, 12, 13, 14, 17, 18, 19 or 20"
  71. fi
  72. case "$OS_NAME" in
  73. Darwin)
  74. if [ "$OS_ARCH" = "arm64" ]; then
  75. if [ $LLVM_VERSION_MAJOR -lt 13 ]; then
  76. error "Invalid LLVM version $LLVM_VERSION: Darwin Arm64 requires LLVM 13, 14, 17, 18, 19 or 20"
  77. fi
  78. fi
  79. darwin_sysroot=
  80. if [ $(which xcrun) ]; then
  81. darwin_sysroot="--sysroot $(xcrun --sdk macosx --show-sdk-path)"
  82. elif [[ -e "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk" ]]; then
  83. darwin_sysroot="--sysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk"
  84. else
  85. echo "Warning: MacOSX.sdk not found."
  86. fi
  87. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags) ${darwin_sysroot}"
  88. LDFLAGS="$LDFLAGS -liconv -ldl -framework System -lLLVM"
  89. ;;
  90. FreeBSD)
  91. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  92. LDFLAGS="$LDFLAGS -lstdc++ $($LLVM_CONFIG --libs core native --system-libs)"
  93. ;;
  94. NetBSD)
  95. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  96. LDFLAGS="$LDFLAGS -lstdc++ $($LLVM_CONFIG --libs core native --system-libs)"
  97. ;;
  98. Linux)
  99. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  100. LDFLAGS="$LDFLAGS -lstdc++ -ldl $($LLVM_CONFIG --libs core native --system-libs --libfiles)"
  101. # Copy libLLVM*.so into current directory for linking
  102. # NOTE: This is needed by the Linux release pipeline!
  103. # cp $(readlink -f $($LLVM_CONFIG --libfiles)) ./
  104. LDFLAGS="$LDFLAGS -Wl,-rpath=\$ORIGIN"
  105. ;;
  106. OpenBSD)
  107. CXXFLAGS="$CXXFLAGS -I/usr/local/include $($LLVM_CONFIG --cxxflags --ldflags)"
  108. LDFLAGS="$LDFLAGS -lstdc++ -L/usr/local/lib -liconv"
  109. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  110. ;;
  111. Haiku)
  112. CXXFLAGS="$CXXFLAGS -D_GNU_SOURCE $($LLVM_CONFIG --cxxflags --ldflags) -I/system/develop/headers/private/shared -I/system/develop/headers/private/kernel"
  113. LDFLAGS="$LDFLAGS -lstdc++ -liconv"
  114. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  115. ;;
  116. *)
  117. error "Platform \"$OS_NAME\" unsupported"
  118. ;;
  119. esac
  120. build_odin() {
  121. case $1 in
  122. debug)
  123. EXTRAFLAGS="-g"
  124. ;;
  125. release)
  126. EXTRAFLAGS="-O3"
  127. ;;
  128. release-native)
  129. if [ "$OS_ARCH" = "arm64" ] || [ "$OS_ARCH" = "aarch64" ]; then
  130. # Use preferred flag for Arm (ie arm64 / aarch64 / etc)
  131. EXTRAFLAGS="-O3 -mcpu=native"
  132. else
  133. # Use preferred flag for x86 / amd64
  134. EXTRAFLAGS="-O3 -march=native"
  135. fi
  136. ;;
  137. nightly)
  138. EXTRAFLAGS="-DNIGHTLY -O3"
  139. ;;
  140. *)
  141. error "Build mode \"$1\" unsupported!"
  142. ;;
  143. esac
  144. set -x
  145. $CXX src/main.cpp src/libtommath.cpp $DISABLED_WARNINGS $CPPFLAGS $CXXFLAGS $EXTRAFLAGS $LDFLAGS -o odin
  146. set +x
  147. }
  148. run_demo() {
  149. ./odin run examples/demo -vet -strict-style -- Hellope World
  150. }
  151. if [ $# -eq 0 ]; then
  152. build_odin debug
  153. run_demo
  154. : ${PROGRAM:=$0}
  155. printf "\nDebug compiler built. Note: run \"$PROGRAM release\" or \"$PROGRAM release-native\" if you want a faster, release mode compiler.\n"
  156. elif [ $# -eq 1 ]; then
  157. case $1 in
  158. report)
  159. if [ ! -f "./odin" ]; then
  160. build_odin debug
  161. run_demo
  162. fi
  163. ./odin report
  164. ;;
  165. debug)
  166. build_odin debug
  167. run_demo
  168. ;;
  169. *)
  170. build_odin $1
  171. ;;
  172. esac
  173. else
  174. error "Too many arguments!"
  175. fi