build_odin.sh 5.7 KB

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