build_odin.sh 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #!/usr/bin/env sh
  2. set -eu
  3. : ${CPPFLAGS=}
  4. : ${CXX=clang++}
  5. : ${CXXFLAGS=}
  6. : ${LDFLAGS=}
  7. : ${LLVM_CONFIG=}
  8. CPPFLAGS="$CPPFLAGS -DODIN_VERSION_RAW=\"dev-$(date +"%Y-%m")\""
  9. CXXFLAGS="$CXXFLAGS -std=c++14"
  10. DISABLED_WARNINGS="-Wno-switch -Wno-macro-redefined -Wno-unused-value"
  11. LDFLAGS="$LDFLAGS -pthread -lm -lstdc++"
  12. OS_ARCH="$(uname -m)"
  13. OS_NAME="$(uname -s)"
  14. if [ -d ".git" ] && [ -n "$(command -v git)" ]; then
  15. GIT_SHA=$(git show --pretty='%h' --no-patch --no-notes HEAD)
  16. CPPFLAGS="$CPPFLAGS -DGIT_SHA=\"$GIT_SHA\""
  17. fi
  18. error() {
  19. printf "ERROR: %s\n" "$1"
  20. exit 1
  21. }
  22. if [ -z "$LLVM_CONFIG" ]; then
  23. # darwin, linux, openbsd
  24. if [ -n "$(command -v llvm-config-17)" ]; then LLVM_CONFIG="llvm-config-17"
  25. elif [ -n "$(command -v llvm-config-14)" ]; then LLVM_CONFIG="llvm-config-14"
  26. elif [ -n "$(command -v llvm-config-13)" ]; then LLVM_CONFIG="llvm-config-13"
  27. elif [ -n "$(command -v llvm-config-12)" ]; then LLVM_CONFIG="llvm-config-12"
  28. elif [ -n "$(command -v llvm-config-11)" ]; then LLVM_CONFIG="llvm-config-11"
  29. # freebsd
  30. elif [ -n "$(command -v llvm-config17)" ]; then LLVM_CONFIG="llvm-config17"
  31. elif [ -n "$(command -v llvm-config14)" ]; then LLVM_CONFIG="llvm-config14"
  32. elif [ -n "$(command -v llvm-config13)" ]; then LLVM_CONFIG="llvm-config13"
  33. elif [ -n "$(command -v llvm-config12)" ]; then LLVM_CONFIG="llvm-config12"
  34. elif [ -n "$(command -v llvm-config11)" ]; then LLVM_CONFIG="llvm-config11"
  35. # fallback
  36. elif [ -n "$(command -v llvm-config)" ]; then LLVM_CONFIG="llvm-config"
  37. else
  38. error "No llvm-config command found. Set LLVM_CONFIG to proceed."
  39. fi
  40. fi
  41. LLVM_VERSION="$($LLVM_CONFIG --version)"
  42. LLVM_VERSION_MAJOR="$(echo $LLVM_VERSION | awk -F. '{print $1}')"
  43. LLVM_VERSION_MINOR="$(echo $LLVM_VERSION | awk -F. '{print $2}')"
  44. LLVM_VERSION_PATCH="$(echo $LLVM_VERSION | awk -F. '{print $3}')"
  45. if [ $LLVM_VERSION_MAJOR -lt 11 ] ||
  46. ([ $LLVM_VERSION_MAJOR -gt 14 ] && [ $LLVM_VERSION_MAJOR -lt 17 ]); then
  47. error "Invalid LLVM version $LLVM_VERSION: must be 11, 12, 13, 14 or 17"
  48. fi
  49. case "$OS_NAME" in
  50. Darwin)
  51. if [ "$OS_ARCH" = "arm64" ]; then
  52. if [ $LLVM_VERSION_MAJOR -lt 13 ] || [ $LLVM_VERSION_MAJOR -gt 17 ]; then
  53. error "Darwin Arm64 requires LLVM 13, 14 or 17"
  54. fi
  55. fi
  56. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  57. LDFLAGS="$LDFLAGS -liconv -ldl -framework System -lLLVM"
  58. ;;
  59. FreeBSD)
  60. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  61. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  62. ;;
  63. Linux)
  64. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  65. LDFLAGS="$LDFLAGS -ldl $($LLVM_CONFIG --libs core native --system-libs --libfiles)"
  66. # Copy libLLVM*.so into current directory for linking
  67. # NOTE: This is needed by the Linux release pipeline!
  68. cp $(readlink -f $($LLVM_CONFIG --libfiles)) ./
  69. LDFLAGS="$LDFLAGS -Wl,-rpath=\$ORIGIN"
  70. ;;
  71. OpenBSD)
  72. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"
  73. LDFLAGS="$LDFLAGS -liconv"
  74. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  75. ;;
  76. Haiku)
  77. CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags) -I/system/develop/headers/private/shared -I/system/develop/headers/private/kernel"
  78. LDFLAGS="$LDFLAGS -liconv"
  79. LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)"
  80. ;;
  81. *)
  82. error "Platform \"$OS_NAME\" unsupported"
  83. ;;
  84. esac
  85. build_odin() {
  86. case $1 in
  87. debug)
  88. EXTRAFLAGS="-g"
  89. ;;
  90. release)
  91. EXTRAFLAGS="-O3"
  92. ;;
  93. release-native)
  94. if [ "$OS_ARCH" = "arm64" ]; then
  95. # Use preferred flag for Arm (ie arm64 / aarch64 / etc)
  96. EXTRAFLAGS="-O3 -mcpu=native"
  97. else
  98. # Use preferred flag for x86 / amd64
  99. EXTRAFLAGS="-O3 -march=native"
  100. fi
  101. ;;
  102. nightly)
  103. EXTRAFLAGS="-DNIGHTLY -O3"
  104. ;;
  105. *)
  106. error "Build mode \"$1\" unsupported!"
  107. ;;
  108. esac
  109. set -x
  110. $CXX src/main.cpp src/libtommath.cpp $DISABLED_WARNINGS $CPPFLAGS $CXXFLAGS $EXTRAFLAGS $LDFLAGS -o odin
  111. set +x
  112. }
  113. run_demo() {
  114. ./odin run examples/demo/demo.odin -file -- Hellope World
  115. }
  116. if [ $# -eq 0 ]; then
  117. build_odin debug
  118. run_demo
  119. elif [ $# -eq 1 ]; then
  120. case $1 in
  121. report)
  122. [ ! -f "./odin" ] && build_odin debug
  123. ./odin report
  124. ;;
  125. *)
  126. build_odin $1
  127. ;;
  128. esac
  129. run_demo
  130. else
  131. error "Too many arguments!"
  132. fi