build_odin.sh 6.1 KB

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