Browse Source

Initial commit

Signed-off-by: falkTX <falktx@falktx.com>
tags/v1.0
falkTX 5 years ago
commit
d3ad4d606d
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
10 changed files with 648 additions and 0 deletions
  1. +20
    -0
      README.md
  2. +134
    -0
      bootstrap.sh
  3. +7
    -0
      plugins-todo/mod-utilities.json
  4. +7
    -0
      plugins-todo/noise-repellent.json
  5. +8
    -0
      plugins/artyfx.json
  6. +6
    -0
      plugins/dpf-plugins.json
  7. +7
    -0
      plugins/regrader.json
  8. +99
    -0
      setup/env.sh
  9. +340
    -0
      setup/functions.sh
  10. +20
    -0
      setup/versions.sh

+ 20
- 0
README.md View File

@@ -0,0 +1,20 @@
# PawPaw

PawPaw is a Cross-Platform build scripts setup for static libraries and audio plugins

It was created out of the need of many open-source developers to easily build their stuff for macOS and Windows,
where usually dependencies are involved which need to be built manually.
In order to make audio plugins self-contained, these dependencies/libraries need to be built statically,
which most packaging projects do not do.
Also, most open-source audio plugin projects to do have binaries for macOS or Windows,
making it very difficult for users in these platforms to enjoy them.

PawPaw has the following goals:

- Single script to build most common plugin dependencies statically, both natively and cross-compiling
- Clean and simple code, easy to maintain and add new libraries to build
- Statically build LV2 plugins for (at least) macOS and Windows
- Define each plugin to build in its own file, to make it easy to support new plugins via pull-request
- Package the entire collection as an installer

Additonally, PawPaw will be used to build library dependencies for Carla and JACK2.

+ 134
- 0
bootstrap.sh View File

@@ -0,0 +1,134 @@
#!/bin/bash

set -e

cd $(dirname ${0})

# ---------------------------------------------------------------------------------------------------------------------

# TODO CLI args

# NOTE all of these need to be defined. either 0 or 1
CROSS_COMPILING=1
MACOS=0
MACOS_OLD=0
WIN32=1
WIN64=1

# ---------------------------------------------------------------------------------------------------------------------

# TODO check for depedencies:
# - curl
# - cmake
# - make
# - jq
# - python (waf, meson)
# - sed
# - tar

source setup/env.sh
source setup/functions.sh
source setup/versions.sh

mkdir -p ${PAWPAW_BUILDDIR}
mkdir -p ${PAWPAW_DOWNLOADDIR}
mkdir -p ${PAWPAW_PREFIX}
mkdir -p ${PAWPAW_TMPDIR}

# ---------------------------------------------------------------------------------------------------------------------
# pkgconfig

download pkg-config "${PKG_CONFIG_VERSION}" "https://pkg-config.freedesktop.org/releases"
build_host_autoconf pkg-config "${PKG_CONFIG_VERSION}" "--enable-indirect-deps --with-internal-glib --with-pc-path=${TARGET_PKG_CONFIG_PATH}"

# ---------------------------------------------------------------------------------------------------------------------
# liblo

download liblo "${LIBLO_VERSION}" "http://download.sourceforge.net/liblo"
build_autoconf liblo "${LIBLO_VERSION}" "--enable-threads --disable-examples --disable-tools"

# ---------------------------------------------------------------------------------------------------------------------
# zlib

download zlib "${ZLIB_VERSION}" "https://github.com/madler/zlib/archive"
build_conf zlib "${ZLIB_VERSION}" "--static --prefix=${PAWPAW_PREFIX}"

# ---------------------------------------------------------------------------------------------------------------------
# libogg

download libogg "${LIBOGG_VERSION}" "https://ftp.osuosl.org/pub/xiph/releases/ogg"
patch_file libogg "${LIBOGG_VERSION}" "include/ogg/os_types.h" 's/__MACH__/__MACH_SKIP__/'
build_autoconf libogg "${LIBOGG_VERSION}"

# ---------------------------------------------------------------------------------------------------------------------
# file/magic

# download file "${FILE_VERSION}" "ftp://ftp.astron.com/pub/file"
# build_autoconf file "${FILE_VERSION}"

# ---------------------------------------------------------------------------------------------------------------------
# libvorbis

download libvorbis "${LIBVORBIS_VERSION}" "https://ftp.osuosl.org/pub/xiph/releases/vorbis"
build_autoconf libvorbis "${LIBVORBIS_VERSION}"

# ---------------------------------------------------------------------------------------------------------------------
# flac

download flac "${FLAC_VERSION}" "https://ftp.osuosl.org/pub/xiph/releases/flac" "tar.xz"
build_autoconf flac "${FLAC_VERSION}"

# ---------------------------------------------------------------------------------------------------------------------
# libsndfile

download libsndfile "${LIBSNDFILE_VERSION}" "http://www.mega-nerd.com/libsndfile/files"
patch_file libsndfile "${LIBSNDFILE_VERSION}" "configure" 's/ -Wvla//'
build_autoconf libsndfile "${LIBSNDFILE_VERSION}" "--disable-full-suite --disable-alsa --disable-sqlite"

# ---------------------------------------------------------------------------------------------------------------------
# lv2

download lv2 "${LV2_VERSION}" "http://lv2plug.in/spec" "tar.bz2"
build_waf lv2 "${LV2_VERSION}" "--lv2dir=${PAWPAW_PREFIX}/lib/lv2"

# ---------------------------------------------------------------------------------------------------------------------
# now the fun: plugins!

for p in $(ls plugins); do
name=$(jq -crM .name plugins/${p})
version=$(jq -crM .version plugins/${p})
buildtype=$(jq -crM .buildtype plugins/${p})
dlbaseurl=$(jq -crM .dlbaseurl plugins/${p})

# optional args
buildargs=$(echo -e $(jq -ecrM .buildargs plugins/${p} || echo '\n\n') | tail -n 1)
dlext=$(echo -e $(jq -ecrM .dlext plugins/${p} || echo '\n\n') | tail -n 1)
dlmethod=$(echo -e $(jq -ecrM .dlmethod plugins/${p} || echo '\n\n') | tail -n 1)

download "${name}" "${version}" "${dlbaseurl}" "${dlext}" "${dlmethod}"

# TODO patch_file support?

case ${buildtype} in
"autoconf")
build_autoconf "${name}" "${version}" "${buildargs}"
;;
"conf")
build_conf "${name}" "${version}" "${buildargs}"
;;
"cmake")
build_cmake "${name}" "${version}" "${buildargs}"
;;
"make")
build_make "${name}" "${version}" "${buildargs}"
;;
"meson")
build_meson "${name}" "${version}" "${buildargs}"
;;
"waf")
build_waf "${name}" "${version}" "${buildargs}"
;;
esac
done

# ---------------------------------------------------------------------------------------------------------------------

+ 7
- 0
plugins-todo/mod-utilities.json View File

@@ -0,0 +1,7 @@
{
"name": "mod-utilities",
"version": "4a92aa81351c5c95fefa0505fafad5fbea494dd0",
"dlbaseurl": "https://github.com/moddevices/mod-utilities.git",
"dlmethod": "git",
"buildtype": "make"
}

+ 7
- 0
plugins-todo/noise-repellent.json View File

@@ -0,0 +1,7 @@
{
"name": "noise-repellent",
"version": "87b4380eae2b69b09bba8a8b181f24153079100d",
"dlbaseurl": "https://github.com/lucianodato/noise-repellent.git",
"dlmethod": "git",
"buildtype": "meson"
}

+ 8
- 0
plugins/artyfx.json View File

@@ -0,0 +1,8 @@
{
"name": "artyfx",
"version": "6010d1a6034ea684cc2edb22021f034122ccf814",
"dlbaseurl": "https://github.com/openAVproductions/openAV-ArtyFX.git",
"dlmethod": "git",
"buildtype": "cmake",
"buildargs": "-DBUILD_GUI=OFF"
}

+ 6
- 0
plugins/dpf-plugins.json View File

@@ -0,0 +1,6 @@
{
"name": "dpf-plugins",
"version": "1.3",
"dlbaseurl": "https://github.com/DISTRHO/DPF-Plugins/archive",
"buildtype": "make"
}

+ 7
- 0
plugins/regrader.json View File

@@ -0,0 +1,7 @@
{
"name": "regrader-port",
"version": "412e475cef1025d955fae4229b6bc94596f36fd4",
"dlbaseurl": "https://github.com/linuxmao-org/regrader-port.git",
"dlmethod": "git",
"buildtype": "make"
}

+ 99
- 0
setup/env.sh View File

@@ -0,0 +1,99 @@
#!/bin/bash

# ---------------------------------------------------------------------------------------------------------------------
# pawpaw setup

PAWPAW_DIR="$(realpath ~/PawPawBuilds)"
PAWPAW_BUILDDIR="${PAWPAW_DIR}/builds"
PAWPAW_DOWNLOADDIR="${PAWPAW_DIR}/downloads"
PAWPAW_PREFIX="${PAWPAW_DIR}/target"
PAWPAW_TMPDIR="/tmp"

# ---------------------------------------------------------------------------------------------------------------------
# OS setup

if [ "${MACOS}" -eq 1 ]; then
CMAKE_SYSTEM_NAME="Darwin"
elif [ "${WIN32}" -eq 1 ]; then
CMAKE_SYSTEM_NAME="Windows"
fi

# ---------------------------------------------------------------------------------------------------------------------
# build environment

## build flags

BUILD_FLAGS="-O2 -pipe -I${PAWPAW_PREFIX}/include"
BUILD_FLAGS="${BUILD_FLAGS} -mtune=generic -msse -msse2 -mfpmath=sse"
# -ffast-math
BUILD_FLAGS="${BUILD_FLAGS} -fPIC -DPIC -DNDEBUG"
BUILD_FLAGS="${BUILD_FLAGS} -fdata-sections -ffunction-sections -fno-common -fvisibility=hidden"
if [ "${MACOS}" -eq 1 ]; then
if [ "${MACOS_OLD}" -eq 1 ]; then
BUILD_FLAGS="${BUILD_FLAGS} -mmacosx-version-min=10.5"
else
BUILD_FLAGS="${BUILD_FLAGS} -mmacosx-version-min=10.8 -stdlib=libc++ -Wno-deprecated-declarations"
fi
elif [ "${WIN32}" -eq 1 ]; then
BUILD_FLAGS="${BUILD_FLAGS} -DPTW32_STATIC_LIB -mstackrealign"
fi
# -DFLUIDSYNTH_NOT_A_DLL
TARGET_CFLAGS="${BUILD_FLAGS}"
TARGET_CXXFLAGS="${BUILD_FLAGS} -fvisibility-inlines-hidden"

## link flags

LINK_FLAGS="-fdata-sections -ffunction-sections -L${PAWPAW_PREFIX}/lib"
if [ "${MACOS}" -eq 1 ]; then
LINK_FLAGS="${LINK_FLAGS} -Wl,-dead_strip -Wl,-dead_strip_dylibs"
if [ "${MACOS_OLD}" -ne 1 ]; then
LINK_FLAGS="${LINK_FLAGS} -stdlib=libc++"
fi
else
LINK_FLAGS="${LINK_FLAGS} -Wl,-O1 -Wl,--as-needed -Wl,--gc-sections -Wl,--no-undefined -Wl,--strip-all"
if [ "${WIN32}" -eq 1 ]; then
LINK_FLAGS="${LINK_FLAGS} -static"
fi
fi
TARGET_LDFLAGS="${LINK_FLAGS}"

## toolchain

if [ "${MACOS}" -eq 1 ]; then
TOOLCHAIN_PREFIX="i686-apple-darwin10"
TOOLCHAIN_PREFIX_="${TOOLCHAIN_PREFIX}-"
elif [ "${WIN64}" -eq 1 ]; then
TOOLCHAIN_PREFIX="x86_64-w64-mingw32"
TOOLCHAIN_PREFIX_="${TOOLCHAIN_PREFIX}-"
elif [ "${WIN32}" -eq 1 ]; then
TOOLCHAIN_PREFIX="i686-w64-mingw32"
TOOLCHAIN_PREFIX_="${TOOLCHAIN_PREFIX}-"
fi
TARGET_AR="${TOOLCHAIN_PREFIX_}ar"
TARGET_CC="${TOOLCHAIN_PREFIX_}gcc"
TARGET_CXX="${TOOLCHAIN_PREFIX_}g++"
TARGET_LD="${TOOLCHAIN_PREFIX_}ld"
TARGET_STRIP="${TOOLCHAIN_PREFIX_}strip"
TARGET_PATH="${PAWPAW_PREFIX}/bin:/usr/${TOOLCHAIN_PREFIX}/bin:${PATH}"
TARGET_PKG_CONFIG_PATH="${PAWPAW_PREFIX}/lib/pkgconfig"

# ---------------------------------------------------------------------------------------------------------------------
# other

# "-j 2"
MAKE_ARGS=""

if [ "${CROSS_COMPILING}" -eq 1 ]; then
MAKE_ARGS="${MAKE_ARGS} CROSS_COMPILING=true"
fi

if [ "${MACOS}" -eq 1 ]; then
MAKE_ARGS="${MAKE_ARGS} MACOS=true"
if [ "${MACOS_OLD}" -eq 1 ]; then
MAKE_ARGS="${MAKE_ARGS} MACOS_OLD=true"
fi
elif [ "${WIN32}" -eq 1 ]; then
MAKE_ARGS="${MAKE_ARGS} WIN32=true WINDOWS=true"
fi

# ---------------------------------------------------------------------------------------------------------------------

+ 340
- 0
setup/functions.sh View File

@@ -0,0 +1,340 @@
#!/bin/bash

# ---------------------------------------------------------------------------------------------------------------------

function download() {
local name="${1}"
local version="${2}"
local dlbaseurl="${3}"
local dlext="${4}"
local dlmethod="${5}"

if [ -z "${dlext}" ]; then
dlext="tar.gz"
fi

local dlfile="${PAWPAW_DOWNLOADDIR}/${name}-${version}.${dlext}"
local dlfolder="${PAWPAW_BUILDDIR}/${name}-${version}"

if [ ! -f "${dlfile}" ]; then
if [ -n "${dlmethod}" ] && [ "${dlmethod}" = "git" ]; then
local tmprepodir="${PAWPAW_TMPDIR}/${name}-${version}"
rm -rf "${tmprepodir}"
git clone --recursive "${dlbaseurl}" "${tmprepodir}"
git -C "${tmprepodir}" checkout "${version}"
git -C "${tmprepodir}" submodule update
tar --exclude=".git" -czf "${dlfile}" -C "${PAWPAW_TMPDIR}" "${name}-${version}"
rm -rf "${tmprepodir}"
else
local dlurl
if echo ${dlbaseurl} | grep -q github.com; then
dlurl="${dlbaseurl}/v${version}.${dlext}"
else
dlurl="${dlbaseurl}/${name}-${version}.${dlext}"
fi
curl -L "${dlurl}" -o "${dlfile}"
fi
fi

if [ ! -d "${dlfolder}" ]; then
mkdir "${dlfolder}"
tar -xf "${dlfile}" -C "${dlfolder}" --strip-components=1
fi
}

# ---------------------------------------------------------------------------------------------------------------------

function _prebuild() {
local pkgdir="${1}"

export AR="${TARGET_AR}"
export CC="${TARGET_CC}"
export CXX="${TARGET_CXX}"
export LD="${TARGET_LD}"
export STRIP="${TARGET_STRIP}"
export CFLAGS="${TARGET_CFLAGS}"
export CXXFLAGS="${TARGET_CXXFLAGS}"
export LDFLAGS="${TARGET_LDFLAGS}"
export PKG_CONFIG_PATH="${TARGET_PKG_CONFIG_PATH}"

unset CPPFLAGS
export OLD_PATH="${PATH}"
export PATH="${TARGET_PATH}"

if [ ! -f "${pkgdir}/.stamp_configured" ]; then
rm -f "${pkgdir}/.stamp_built"
rm -f "${pkgdir}/.stamp_installed"

elif [ ! -f "${pkgdir}/.stamp_built" ]; then
rm -f "${pkgdir}/.stamp_installed"

fi
}

function _postbuild() {
unset AR
unset CC
unset CXX
unset LD
unset STRIP
unset CFLAGS
unset CPPFLAGS
unset CXXFLAGS
unset LDFLAGS
unset PKG_CONFIG_PATH

export PATH="${OLD_PATH}"
}

# ---------------------------------------------------------------------------------------------------------------------

function build_autoconf() {
local name="${1}"
local version="${2}"
local extraconfrules="${3}"

local pkgdir="${PAWPAW_BUILDDIR}/${name}-${version}"

_prebuild "${pkgdir}"

if [ ! -f "${pkgdir}/.stamp_configured" ]; then
pushd "${pkgdir}"
./configure --enable-static --disable-shared --prefix="${PAWPAW_PREFIX}" --host=${TOOLCHAIN_PREFIX} ${extraconfrules}
touch .stamp_configured
popd
fi

if [ ! -f "${pkgdir}/.stamp_built" ]; then
pushd "${pkgdir}"
make ${MAKE_ARGS}
touch .stamp_built
popd
fi

if [ ! -f "${pkgdir}/.stamp_installed" ]; then
pushd "${pkgdir}"
make ${MAKE_ARGS} install
touch .stamp_installed
popd
fi

_postbuild
}

function build_conf() {
local name="${1}"
local version="${2}"
local extraconfrules="${3}"

local pkgdir="${PAWPAW_BUILDDIR}/${name}-${version}"

_prebuild "${pkgdir}"

if [ ! -f "${pkgdir}/.stamp_configured" ]; then
pushd "${pkgdir}"
./configure ${extraconfrules}
touch .stamp_configured
popd
fi

if [ ! -f "${pkgdir}/.stamp_built" ]; then
pushd "${pkgdir}"
make ${MAKE_ARGS}
touch .stamp_built
popd
fi

if [ ! -f "${pkgdir}/.stamp_installed" ]; then
pushd "${pkgdir}"
make ${MAKE_ARGS} install
touch .stamp_installed
popd
fi

_postbuild
}

function build_cmake() {
local name="${1}"
local version="${2}"
local extraconfrules="${3}"

local pkgdir="${PAWPAW_BUILDDIR}/${name}-${version}"

_prebuild "${pkgdir}"

if [ ! -f "${pkgdir}/.stamp_configured" ]; then
pushd "${pkgdir}"
# FIXME put this as a patch file
sed -i -e 's/ -Wl,--no-undefined//' CMakeLists.txt
cmake -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_INSTALL_PREFIX="${PAWPAW_PREFIX}" -DCMAKE_SYSTEM_NAME="${CMAKE_SYSTEM_NAME}" ${extraconfrules}
touch .stamp_configured
popd
fi

if [ ! -f "${pkgdir}/.stamp_built" ]; then
pushd "${pkgdir}"
make ${MAKE_ARGS}
touch .stamp_built
popd
fi

if [ ! -f "${pkgdir}/.stamp_installed" ]; then
pushd "${pkgdir}"
make ${MAKE_ARGS} install
touch .stamp_installed
popd
fi

_postbuild
}

function build_make() {
local name="${1}"
local version="${2}"
local extraconfrules="${3}"

local pkgdir="${PAWPAW_BUILDDIR}/${name}-${version}"

_prebuild "${pkgdir}"

touch "${pkgdir}/.stamp_configured"

if [ ! -f "${pkgdir}/.stamp_built" ]; then
pushd "${pkgdir}"
make PREFIX="${PAWPAW_PREFIX}" ${MAKE_ARGS} ${extraconfrules}
touch .stamp_built
popd
fi

if [ ! -f "${pkgdir}/.stamp_installed" ]; then
pushd "${pkgdir}"
make PREFIX="${PAWPAW_PREFIX}" ${MAKE_ARGS} install
touch .stamp_installed
popd
fi

_postbuild
}

function build_meson() {
local name="${1}"
local version="${2}"
local extraconfrules="${3}"

local pkgdir="${PAWPAW_BUILDDIR}/${name}-${version}"

_prebuild "${pkgdir}"

if [ ! -f "${pkgdir}/.stamp_configured" ]; then
pushd "${pkgdir}"
meson build --buildtype release --prefix "${PAWPAW_PREFIX}" ${extraconfrules}
touch .stamp_configured
popd
fi

if [ ! -f "${pkgdir}/.stamp_built" ]; then
pushd "${pkgdir}"
ninja -v -C build
touch .stamp_built
popd
fi

if [ ! -f "${pkgdir}/.stamp_installed" ]; then
pushd "${pkgdir}"
ninja -C build install
touch .stamp_installed
popd
fi

_postbuild
}

function build_waf() {
local name="${1}"
local version="${2}"
local extraconfrules="${3}"

local pkgdir="${PAWPAW_BUILDDIR}/${name}-${version}"

_prebuild "${pkgdir}"

if [ ! -f "${pkgdir}/.stamp_configured" ]; then
pushd "${pkgdir}"
./waf configure --prefix="${PAWPAW_PREFIX}" ${extraconfrules}
touch .stamp_configured
popd
fi

if [ ! -f "${pkgdir}/.stamp_built" ]; then
pushd "${pkgdir}"
./waf build
touch .stamp_built
popd
fi

if [ ! -f "${pkgdir}/.stamp_installed" ]; then
pushd "${pkgdir}"
./waf install
touch .stamp_installed
popd
fi

_postbuild
}

# ---------------------------------------------------------------------------------------------------------------------

function build_host_autoconf() {
local name="${1}"
local version="${2}"
local extraconfrules="${3}"

local pkgdir="${PAWPAW_BUILDDIR}/${name}-${version}"

unset AR
unset CC
unset CXX
unset LD
unset STRIP
unset CFLAGS
unset CPPFLAGS
unset CXXFLAGS
unset LDFLAGS

if [ ! -f "${pkgdir}/.stamp_configured" ]; then
pushd "${pkgdir}"
./configure --enable-static --disable-shared --prefix="${PAWPAW_PREFIX}" ${extraconfrules}
touch .stamp_configured
popd
fi

if [ ! -f "${pkgdir}/.stamp_built" ]; then
pushd "${pkgdir}"
make ${MAKE_ARGS}
touch .stamp_built
popd
fi

if [ ! -f "${pkgdir}/.stamp_installed" ]; then
pushd "${pkgdir}"
make install
touch .stamp_installed
popd
fi
}

# ---------------------------------------------------------------------------------------------------------------------

function patch_file() {
local name="${1}"
local version="${2}"
local file="${3}"
local rule="${4}"

local pkgdir="${PAWPAW_BUILDDIR}/${name}-${version}"

sed -i -e "${rule}" "${pkgdir}/${file}"
}

# ---------------------------------------------------------------------------------------------------------------------

+ 20
- 0
setup/versions.sh View File

@@ -0,0 +1,20 @@
#!/bin/bash

PKG_CONFIG_VERSION=0.28
LIBLO_VERSION=0.30
ZLIB_VERSION=1.2.11
FILE_VERSION=5.34
LIBOGG_VERSION=1.3.4
LIBVORBIS_VERSION=1.3.6
FLAC_VERSION=1.3.2
LIBSNDFILE_VERSION=1.0.28
LV2_VERSION=1.18.0

# GLIB_VERSION=2.44.1
# GLIB_MVERSION=2.44
# FLUIDSYNTH_VERSION=1.1.11
# MXML_VERSION=2.12
# FFTW3_VERSION=3.3.8
# PYTHON_VERSION=3.7.4
# PYLIBLO_VERSION=0.9.2
# CXFREEZE_VERSION=6.1

Loading…
Cancel
Save