build_odin.sh 6.4 KB

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