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.

316 lines
9.6KB

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