Cross-Platform build scripts for audio plugins
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

294 lines
8.9KB

  1. #!/bin/bash
  2. # NOTE `setup/check_target.sh` must be imported before this one
  3. # ---------------------------------------------------------------------------------------------------------------------
  4. # OS setup
  5. if [ "${LINUX}" -eq 1 ]; then
  6. APP_EXT=""
  7. CMAKE_SYSTEM_NAME="Linux"
  8. if [ -n "${LINUX_TARGET}" ]; then
  9. PAWPAW_TARGET="${LINUX_TARGET}"
  10. else
  11. PAWPAW_TARGET="linux"
  12. fi
  13. elif [ "${MACOS}" -eq 1 ]; then
  14. APP_EXT=""
  15. CMAKE_SYSTEM_NAME="Darwin"
  16. if [ "${MACOS_UNIVERSAL_10_15}" -eq 1 ]; then
  17. PAWPAW_TARGET="macos-universal-10.15"
  18. elif [ "${MACOS_UNIVERSAL}" -eq 1 ]; then
  19. PAWPAW_TARGET="macos-universal"
  20. else
  21. PAWPAW_TARGET="macos"
  22. fi
  23. elif [ "${WASM}" -eq 1 ]; then
  24. APP_EXT=".html"
  25. CMAKE_SYSTEM_NAME="Emscripten"
  26. PAWPAW_TARGET="wasm"
  27. elif [ "${WIN32}" -eq 1 ]; then
  28. APP_EXT=".exe"
  29. CMAKE_SYSTEM_NAME="Windows"
  30. if [ "${WIN64}" -eq 1 ]; then
  31. PAWPAW_TARGET="win64"
  32. else
  33. PAWPAW_TARGET="win32"
  34. fi
  35. else
  36. echo "Unknown target '${target}'"
  37. if [ -z "${SOURCING_FILES}" ]; then
  38. exit 4
  39. else
  40. APP_EXT=""
  41. CMAKE_SYSTEM_NAME="Unknown"
  42. PAWPAW_TARGET="unknown"
  43. INVALID_TARGET=1
  44. fi
  45. fi
  46. # ---------------------------------------------------------------------------------------------------------------------
  47. # PawPaw setup
  48. PAWPAW_DIR="${HOME}/PawPawBuilds"
  49. PAWPAW_DOWNLOADDIR="${PAWPAW_DIR}/downloads"
  50. PAWPAW_BUILDDIR="${PAWPAW_DIR}/builds/${PAWPAW_TARGET}"
  51. PAWPAW_PREFIX="${PAWPAW_DIR}/targets/${PAWPAW_TARGET}"
  52. PAWPAW_TMPDIR="/tmp"
  53. if [ -z "${PAWPAW_SKIP_LTO}" ] || [ "${PAWPAW_SKIP_LTO}" -eq 0 ]; then
  54. PAWPAW_BUILDDIR+="-lto"
  55. PAWPAW_PREFIX+="-lto"
  56. fi
  57. if [ -n "${PAWPAW_NOSIMD}" ] && [ "${PAWPAW_NOSIMD}" -ne 0 ]; then
  58. PAWPAW_BUILDDIR+="-nosimd"
  59. PAWPAW_PREFIX+="-nosimd"
  60. fi
  61. # ---------------------------------------------------------------------------------------------------------------------
  62. # build environment
  63. ## build flags
  64. BUILD_FLAGS="-O3 -pipe -I${PAWPAW_PREFIX}/include ${EXTRA_FLAGS}"
  65. BUILD_FLAGS+=" -ffast-math"
  66. BUILD_FLAGS+=" -fomit-frame-pointer -ftree-vectorize -funroll-loops"
  67. BUILD_FLAGS+=" -fPIC -DPIC -DNDEBUG=1"
  68. BUILD_FLAGS+=" -fdata-sections -ffunction-sections -fno-common -fvisibility=hidden"
  69. BUILD_FLAGS+=" -fno-stack-protector -U_FORTIFY_SOURCE -Wp,-U_FORTIFY_SOURCE"
  70. if [ "${GCC}" -eq 1 ]; then
  71. # not supported in riscv64 yet
  72. if [ -n "${LINUX_TARGET}" ] && [ "${LINUX_TARGET}" != "linux-riscv64" ]; then
  73. BUILD_FLAGS+=" -fprefetch-loop-arrays"
  74. fi
  75. BUILD_FLAGS+=" -fno-gnu-unique"
  76. fi
  77. if [ -z "${PAWPAW_SKIP_LTO}" ] || [ "${PAWPAW_SKIP_LTO}" -eq 0 ]; then
  78. BUILD_FLAGS+=" -fno-strict-aliasing -flto"
  79. fi
  80. if [ -z "${PAWPAW_NOSIMD}" ] || [ "${PAWPAW_NOSIMD}" -eq 0 ]; then
  81. if [ "${WASM}" -eq 1 ]; then
  82. BUILD_FLAGS+=" -msse -msse2 -msse3 -msimd128"
  83. elif [ -n "${LINUX_TARGET}" ] && [ "${LINUX_TARGET}" = "linux-armhf" ]; then
  84. BUILD_FLAGS+=" -mfpu=neon-vfpv4 -mfloat-abi=hard"
  85. elif [ -n "${LINUX_TARGET}" ] && [ "${LINUX_TARGET}" = "linux-aarch64" ]; then
  86. # nothing?
  87. BUILD_FLAGS+=""
  88. elif [ -n "${LINUX_TARGET}" ] && [ "${LINUX_TARGET}" = "linux-riscv64" ]; then
  89. # nothing here yet, SIMD is not a thing on RISC-V
  90. BUILD_FLAGS+=""
  91. else
  92. BUILD_FLAGS+=" -mtune=generic -msse -msse2"
  93. if [ "${MACOS_UNIVERSAL}" -eq 0 ]; then
  94. BUILD_FLAGS+=" -mfpmath=sse"
  95. fi
  96. fi
  97. fi
  98. if [ "${MACOS}" -eq 1 ]; then
  99. if [ "${MACOS_UNIVERSAL_10_15}" -eq 1 ]; then
  100. BUILD_FLAGS+=" -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_15"
  101. BUILD_FLAGS+=" -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_15"
  102. BUILD_FLAGS+=" -mmacosx-version-min=10.15"
  103. BUILD_FLAGS+=" -arch x86_64 -arch arm64"
  104. export MACOSX_DEPLOYMENT_TARGET="10.15"
  105. elif [ "${MACOS_UNIVERSAL}" -eq 1 ]; then
  106. BUILD_FLAGS+=" -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_12"
  107. BUILD_FLAGS+=" -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_12"
  108. BUILD_FLAGS+=" -mmacosx-version-min=10.12"
  109. BUILD_FLAGS+=" -arch x86_64 -arch arm64"
  110. export MACOSX_DEPLOYMENT_TARGET="10.12"
  111. else
  112. BUILD_FLAGS+=" -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_8"
  113. BUILD_FLAGS+=" -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_8"
  114. BUILD_FLAGS+=" -mmacosx-version-min=10.8"
  115. BUILD_FLAGS+=" -stdlib=libc++"
  116. BUILD_FLAGS+=" -arch x86_64"
  117. BUILD_FLAGS+=" -Wno-deprecated-declarations"
  118. export MACOSX_DEPLOYMENT_TARGET="10.8"
  119. fi
  120. BUILD_FLAGS+=" -Werror=objc-method-access"
  121. elif [ "${WIN32}" -eq 1 ]; then
  122. BUILD_FLAGS+=" -DPTW32_STATIC_LIB"
  123. BUILD_FLAGS+=" -D__STDC_FORMAT_MACROS=1"
  124. BUILD_FLAGS+=" -D__USE_MINGW_ANSI_STDIO=1"
  125. BUILD_FLAGS+=" -mstackrealign"
  126. BUILD_FLAGS+=" -posix"
  127. fi
  128. # anything that talks to db should have this
  129. BUILD_FLAGS+=" -DHAVE_MIXED_SIZE_ADDRESSING"
  130. TARGET_CFLAGS="${BUILD_FLAGS}"
  131. TARGET_CXXFLAGS="${BUILD_FLAGS} -fvisibility-inlines-hidden"
  132. ## link flags
  133. LINK_FLAGS="-L${PAWPAW_PREFIX}/lib ${BUILD_FLAGS} ${EXTRA_FLAGS}"
  134. if [ -z "${PAWPAW_SKIP_LTO}" ] || [ "${PAWPAW_SKIP_LTO}" -eq 0 ]; then
  135. LINK_FLAGS+=" -Werror=odr"
  136. if [ "${GCC}" -eq 1 ]; then
  137. LINK_FLAGS+=" -Werror=lto-type-mismatch"
  138. fi
  139. fi
  140. if [ "${MACOS}" -eq 1 ]; then
  141. if [ -z "${PAWPAW_SKIP_STRIPPING}" ] || [ "${PAWPAW_SKIP_STRIPPING}" -eq 0 ]; then
  142. LINK_FLAGS+=" -Wl,-dead_strip,-dead_strip_dylibs,-x"
  143. fi
  144. elif [ "${WASM}" -eq 1 ]; then
  145. LINK_FLAGS+=" -Wl,--gc-sections"
  146. LINK_FLAGS+=" -sENVIRONMENT=web"
  147. LINK_FLAGS+=" -sLLD_REPORT_UNDEFINED"
  148. if [ -z "${PAWPAW_SKIP_STRIPPING}" ] || [ "${PAWPAW_SKIP_STRIPPING}" -eq 0 ]; then
  149. LINK_FLAGS+=" -sAGGRESSIVE_VARIABLE_ELIMINATION=1"
  150. fi
  151. else
  152. LINK_FLAGS+=" -Wl,-O1,--gc-sections,--no-undefined"
  153. if [ -z "${PAWPAW_SKIP_STRIPPING}" ] || [ "${PAWPAW_SKIP_STRIPPING}" -eq 0 ]; then
  154. LINK_FLAGS+=" -Wl,--as-needed,--strip-all"
  155. fi
  156. if [ "${WIN32}" -eq 1 ]; then
  157. LINK_FLAGS+=" -static -static-libgcc -static-libstdc++ -Wl,-Bstatic"
  158. else
  159. LINK_FLAGS+=" -static-libgcc -static-libstdc++"
  160. fi
  161. fi
  162. TARGET_LDFLAGS="${LINK_FLAGS}"
  163. ## toolchain
  164. TARGET_AR="${TOOLCHAIN_PREFIX_}ar"
  165. TARGET_CC="${TOOLCHAIN_PREFIX_}gcc"
  166. TARGET_CXX="${TOOLCHAIN_PREFIX_}g++"
  167. TARGET_DLLWRAP="${TOOLCHAIN_PREFIX_}dllwrap"
  168. TARGET_LD="${TOOLCHAIN_PREFIX_}ld"
  169. TARGET_NM="${TOOLCHAIN_PREFIX_}nm"
  170. TARGET_RANLIB="${TOOLCHAIN_PREFIX_}ranlib"
  171. TARGET_STRIP="${TOOLCHAIN_PREFIX_}strip"
  172. TARGET_WINDRES="${TOOLCHAIN_PREFIX_}windres"
  173. TARGET_PATH="${PAWPAW_PREFIX}/bin:/usr/${TOOLCHAIN_PREFIX}/bin:${PATH}"
  174. TARGET_PKG_CONFIG="${PAWPAW_PREFIX}/bin/pkg-config --static"
  175. TARGET_PKG_CONFIG_PATH="${PAWPAW_PREFIX}/lib/pkgconfig"
  176. if [ "${WASM}" -eq 1 ]; then
  177. TARGET_AR="emar"
  178. TARGET_CC="emcc"
  179. TARGET_CXX="em++"
  180. TARGET_NM="emnm"
  181. TARGET_RANLIB="emranlib"
  182. TARGET_STRIP="emstrip"
  183. fi
  184. if [ -n "${PAWPAW_SKIP_STRIPPING}" ] && [ "${PAWPAW_SKIP_STRIPPING}" -eq 1 ]; then
  185. TARGET_STRIP="true"
  186. fi
  187. # ---------------------------------------------------------------------------------------------------------------------
  188. # find needed programs
  189. if [ -z "${SOURCING_FILES}" ]; then
  190. set +e
  191. fi
  192. autoconf=$(command -v autoconf)
  193. cmake=$(command -v cmake)
  194. jq=$(command -v jq)
  195. meson=$(command -v meson)
  196. ninja=$(command -v meson)
  197. if [ -z "${SOURCING_FILES}" ]; then
  198. set -e
  199. fi
  200. if [ -z "${autoconf}" ] && [ -e "/opt/homebrew/bin/autoconf" ]; then
  201. autoconf="/opt/homebrew/bin/autoconf"
  202. fi
  203. if [ -z "${cmake}" ] && [ -e "/opt/homebrew/bin/cmake" ]; then
  204. cmake="/opt/homebrew/bin/cmake"
  205. fi
  206. if [ -z "${jq}" ] && [ -e "/opt/homebrew/bin/jq" ]; then
  207. jq="/opt/homebrew/bin/jq"
  208. fi
  209. if [ -z "${meson}" ] && [ -e "/opt/homebrew/bin/meson" ]; then
  210. meson="/opt/homebrew/bin/meson"
  211. fi
  212. if [ -z "${ninja}" ] && [ -e "/opt/homebrew/bin/ninja" ]; then
  213. ninja="/opt/homebrew/bin/ninja"
  214. fi
  215. # ---------------------------------------------------------------------------------------------------------------------
  216. # other
  217. MAKE_ARGS=""
  218. WAF_ARGS=""
  219. unset WINEARCH
  220. unset WINEDLLOVERRIDES
  221. unset WINEPREFIX
  222. if [ "${MACOS}" -eq 1 ]; then
  223. MAKE_ARGS+="-j $(sysctl -n hw.logicalcpu)"
  224. WAF_ARGS+="-j $(sysctl -n hw.logicalcpu)"
  225. elif which nproc > /dev/null; then
  226. MAKE_ARGS+="-j $(nproc)"
  227. WAF_ARGS+="-j $(nproc)"
  228. fi
  229. if [ "${CROSS_COMPILING}" -eq 1 ]; then
  230. MAKE_ARGS+=" CROSS_COMPILING=true"
  231. if [ "${EXE_WRAPPER}" = "wine" ]; then
  232. export WINEARCH="${PAWPAW_TARGET}"
  233. export WINEDLLOVERRIDES="mscoree,mshtml="
  234. export WINEPREFIX="${PAWPAW_PREFIX}/wine"
  235. fi
  236. fi
  237. if [ "${MACOS}" -eq 1 ]; then
  238. MAKE_ARGS+=" MACOS=true"
  239. if [ "${MACOS_UNIVERSAL}" -eq 1 ]; then
  240. MAKE_ARGS+=" MACOS_UNIVERSAL=true"
  241. fi
  242. elif [ "${WIN32}" -eq 1 ]; then
  243. MAKE_ARGS+=" WINDOWS=true WIN32=true"
  244. if [ "${WIN64}" -eq 1 ]; then
  245. MAKE_ARGS+=" WIN64=true"
  246. fi
  247. fi
  248. # ---------------------------------------------------------------------------------------------------------------------