Skip to content
Snippets Groups Projects
cook.sh 11.1 KiB
Newer Older
Jeremy Soller's avatar
Jeremy Soller committed
#!/usr/bin/env bash
set -e
shopt -s nullglob
Jeremy Soller's avatar
Jeremy Soller committed

# Variables to be overriden by recipes
export CARGO=(env RUSTFLAGS="$PREFIX_RUSTFLAGS -C link-arg=-zmuldefs" cargo)
export CARGOBUILD=rustc
export PREPARE_COPY=1
Jeremy Soller's avatar
Jeremy Soller committed
if hash sha256sum 2>/dev/null
then
    SHASUM="sha256sum"
else
    SHASUM="shasum -a 256"
fi

function usage {
    echo "cook.sh $1 <op>" >&2
    echo "  dist" >&2
    echo "  distclean" >&2
    echo "  build" >&2
    echo "  clean" >&2
    echo "  fetch" >&2
    echo "  unfetch" >&2
Jeremy Soller's avatar
Jeremy Soller committed
    echo "  pkg" >&2
    echo "  unpkg" >&2
Jeremy Soller's avatar
Jeremy Soller committed
    echo "  prepare" >&2
    echo "  unprepare" >&2
    echo "  stage" >&2
    echo "  unstage" >&2
    echo "  version" >&2
}

Jeremy Soller's avatar
Jeremy Soller committed
function op {
    if [ ! "$COOK_QUIET" = "1" ]
    then
        echo -e "\033[01;38;5;215mcook - $1 $2\033[0m" >&2
    fi

Jeremy Soller's avatar
Jeremy Soller committed
    case "$2" in
Jeremy Soller's avatar
Jeremy Soller committed
            op $1 prepare
            op $1 build
            op $1 stage
Jeremy Soller's avatar
Jeremy Soller committed
            op $1 pkg
Jeremy Soller's avatar
Jeremy Soller committed
            op $1 unpkg
            op $1 unstage
Jeremy Soller's avatar
Jeremy Soller committed
            op $1 unprepare
Jeremy Soller's avatar
Jeremy Soller committed
        fetch)
            skip=0
            if [ "$(type -t recipe_fetch)" = "function" ]
            then
                recipe_fetch
            fi
            if [ "$skip" -eq "0" ]
Jeremy Soller's avatar
Jeremy Soller committed
            then
                if [ -n "$TAR" ]
                    if [ ! -f source.tar ]
                    then
                        wget "$TAR" --continue -O source.tar.tmp
                        mv source.tar.tmp source.tar
                    if [ -n "$TAR_SHA256" ]
                    then
                        $SHASUM -c <<< "${TAR_SHA256} source.tar"
                    if [ ! -d source ]
                    then
                        mkdir source
                        tar xvf source.tar -C source --strip-components 1
                    fi
                elif [ -n "$GIT" ]
                    if [ ! -d source ]
                        if [ -n "$BRANCH" ]
                        then
                            git clone --recursive "$GIT" -b "$BRANCH" source
                        else
                            git clone --recursive "$GIT" source
                        fi
                    pushd source > /dev/null
                    git remote set-url origin "$GIT"
                    git fetch origin
                    if [ -n "$GIT_UPSTREAM" ]
                    then
                        git remote set-url upstream "$GIT_UPSTREAM" &> /dev/null ||
                        git remote add upstream "$GIT_UPSTREAM"
                        git fetch upstream
                    fi

                    ORIGIN_BRANCH="$(git branch --remotes | grep '^  origin/HEAD -> ' | cut -d ' ' -f 5-)"
                        ORIGIN_BRANCH="origin/$BRANCH"
                    fi

                    if [ "$(git rev-parse HEAD)" != "$(git rev-parse $ORIGIN_BRANCH)" ]
                    then
                        git checkout -B "$(echo "$ORIGIN_BRANCH" | cut -d / -f 2-)" "$ORIGIN_BRANCH"
                    git submodule sync --recursive
                    git submodule update --init --recursive
                    popd > /dev/null
                fi
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
        unfetch)
            rm -rfv source source.tar
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
Jeremy Soller's avatar
Jeremy Soller committed
        prepare)
            skip=0
            if [ "$(type -t recipe_prepare)" = "function" ]
                recipe_prepare
            fi
            if [ "$skip" -eq "0" ]
            then
                rm -rf "${COOKBOOK_SYSROOT}"
                mkdir "${COOKBOOK_SYSROOT}"
                if [ ${#BUILD_DEPENDS} -gt 0 ]
                then
                    pushd $ROOT
                        ./repo.sh "${BUILD_DEPENDS[@]}"
                    popd

                    for i in "${BUILD_DEPENDS[@]}"
                    do
                        pkgar \
                            extract \
                            "${COOKBOOK_SYSROOT}" \
Jeremy Soller's avatar
Jeremy Soller committed
                            --archive "$REPO/$i.pkgar" \
                            --pkey "${ROOT}/build/id_ed25519.pub.toml"
                rm -rf "${COOKBOOK_BUILD}"
                if [ "$PREPARE_COPY" -eq "0" ]
                then
                    mkdir "${COOKBOOK_BUILD}"
                    cp -Rp source "${COOKBOOK_BUILD}"

                for patch in *.patch
                    patch -p1 -d "${COOKBOOK_BUILD}" < "$patch"
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
        unprepare)
            rm -rf "${COOKBOOK_BUILD}"
            rm -rf "${COOKBOOK_SYSROOT}"
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
            pushd "${COOKBOOK_BUILD}" > /dev/null
Jeremy Soller's avatar
Jeremy Soller committed
            skip=0
            if [ "$(type -t recipe_version)" = "function" ]
Jeremy Soller's avatar
Jeremy Soller committed
                recipe_version
                # there's an unstable built-in cargo config command, so hack around it
                cargo-config config package.version | tr -d '"'
            fi
            popd > /dev/null
            ;;
            if [ -d "${COOKBOOK_BUILD}"/.git ]
                echo "$(op $1 version)-$(git -C "${COOKBOOK_BUILD}" rev-parse --short HEAD)"
Jeremy Soller's avatar
Jeremy Soller committed
        build)
            pushd "${COOKBOOK_BUILD}" > /dev/null
Jeremy Soller's avatar
Jeremy Soller committed
            skip=0
            if [ "$(type -t recipe_build)" = "function" ]
            then
Jeremy Soller's avatar
Jeremy Soller committed
                recipe_build
            if [ "$DEBUG" == 1 ]
            if [ -n "$CARGO_PACKAGE" ]; then
                package_flag="--package=$CARGO_PACKAGE"
            else
                package_flag=
            fi

                "${CARGO[@]}" "$CARGOBUILD" --target "$TARGET" $release_flag $package_flag $CARGOFLAGS
Jeremy Soller's avatar
Jeremy Soller committed
            popd > /dev/null
            ;;
        clean)
            pushd "${COOKBOOK_BUILD}" > /dev/null
Jeremy Soller's avatar
Jeremy Soller committed
            skip=0
            if [ "$(type -t recipe_clean)" = "function" ]
            then
Jeremy Soller's avatar
Jeremy Soller committed
                recipe_clean
                "${CARGO[@]}" clean
Jeremy Soller's avatar
Jeremy Soller committed
            popd > /dev/null
            ;;
        stage)
            op $1 unstage
            mkdir -p "${COOKBOOK_STAGE}"
            stage="$(realpath "${COOKBOOK_STAGE}")"
            source="$(realpath source)"
            pushd "${COOKBOOK_BUILD}" > /dev/null
Jeremy Soller's avatar
Jeremy Soller committed
            skip=0
Jeremy Soller's avatar
Jeremy Soller committed
            if [ "$(type -t recipe_stage)" = "function" ]
            then
jD91mZM2's avatar
jD91mZM2 committed
                recipe_stage "$stage"
                #TODO "${CARGO[@]}" install --root "$stage" $CARGOFLAGS
                if [ "$DEBUG" == 1 ]
                then
                    build=debug
                else
                    build=release
                fi
                bins="$(find target/$TARGET/$build/ -maxdepth 1 -type f ! -name '*.*')"
                if [ -z "$bins" ] || [ "$EXAMPLES" == 1 ]
jD91mZM2's avatar
jD91mZM2 committed
                then
                    example=true
                    bins="$bins $(find target/$TARGET/$build/examples/ -maxdepth 1 -type f ! -name '*.*' ! -name '*-*' \
jD91mZM2's avatar
jD91mZM2 committed
                            2> /dev/null || true)"
                fi
                if [ -n "$bins" ]
                then
                    if [ -n "$example" ] && [ "$EXAMPLES" != 1 ]
jD91mZM2's avatar
jD91mZM2 committed
                    then
jD91mZM2's avatar
jD91mZM2 committed
                        echo "$(tput bold)Note$(tput sgr0): No binaries detected, using example binaries"
jD91mZM2's avatar
jD91mZM2 committed
                    fi
jD91mZM2's avatar
jD91mZM2 committed
                    mkdir -p "$stage/$BINDIR"
                    for bin in $bins
                    do
                        if [ "$DEBUG" == 1 ]
                        then
jD91mZM2's avatar
jD91mZM2 committed
                            cp -v "$bin" "$stage/$BINDIR/$(basename $bin)"
Jeremy Soller's avatar
Jeremy Soller committed
                            "${STRIP}" -v "$bin" -o "$stage/$BINDIR/$(basename $bin)"
                    done
jD91mZM2's avatar
jD91mZM2 committed
                else
                    echo "$(tput bold)Warning$(tput sgr0): Recipe does not have any binaries" >&2
                docgen "$source" "$stage/ref"
Jeremy Soller's avatar
Jeremy Soller committed
            fi
Jeremy Soller's avatar
Jeremy Soller committed
            popd > /dev/null
            ;;
        unstage)
            rm -rfv "${COOKBOOK_STAGE}"
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
Jeremy Soller's avatar
Jeremy Soller committed
        pkg)
            pkgar \
                create \
                --archive "${COOKBOOK_STAGE}.pkgar" \
Jeremy Soller's avatar
Jeremy Soller committed
                --skey "${ROOT}/build/id_ed25519.toml" \
                "${COOKBOOK_STAGE}"
Jeremy Soller's avatar
Jeremy Soller committed

            # Generate stage.toml
            echo "name = \"$1\"" > "${COOKBOOK_STAGE}.toml"
            echo "version = \"$(op $1 version)\"" >> "${COOKBOOK_STAGE}.toml"
            echo "target = \"$TARGET\"" >> "${COOKBOOK_STAGE}.toml"

            # Add runtime dependencies to package if they exist
            if [ -n "$DEPENDS" ]
            then
                # Remove leading and trailing whitespace, replace whitespace between
                # package names with commas, and surround package names with quotes
                dependencies=$(echo -e "$DEPENDS" | sed -E 's/^[[:space:]]*//;s/[[:space:]]*$//;s/[[:space:]]+/,/g;s/[^, ][^, ]*/"&"/g')
                echo "depends = [$dependencies]" >> "${COOKBOOK_STAGE}.toml"
            else
                echo "depends = []" >> "${COOKBOOK_STAGE}.toml"
Jeremy Soller's avatar
Jeremy Soller committed
            ;;
Jeremy Soller's avatar
Jeremy Soller committed
        unpkg)
            rm -fv "${COOKBOOK_STAGE}.pkgar" "${COOKBOOK_STAGE}.toml"
Jeremy Soller's avatar
Jeremy Soller committed
        *)
            usage $1
Jeremy Soller's avatar
Jeremy Soller committed
if [ -n "$1" ]
then
Jacob Lorentzon's avatar
Jacob Lorentzon committed
    if (echo "$1" | grep '.*/.*' >/dev/null); then
        recipe_name=$(basename "$1")
        recipe_path="recipes/$1"
    else
        recipe_name="$1"
        recipe_path=`target/release/find_recipe $recipe_name`
    fi

    if [ -d "$ROOT/$recipe_path" ]
Jeremy Soller's avatar
Jeremy Soller committed
    then
        export COOKBOOK_RECIPE="${ROOT}/$recipe_path"
        TARGET_DIR="${COOKBOOK_RECIPE}/target/${TARGET}"
        mkdir -p "${TARGET_DIR}"

        export COOKBOOK_BUILD="${TARGET_DIR}/build"
        export COOKBOOK_STAGE="${TARGET_DIR}/stage"
        export COOKBOOK_SOURCE="${COOKBOOK_RECIPE}/source"
        export COOKBOOK_SYSROOT="${TARGET_DIR}/sysroot"
Jeremy Soller's avatar
Jeremy Soller committed

        export PKG_CONFIG_ALLOW_CROSS=1
        export PKG_CONFIG_PATH=
        export PKG_CONFIG_LIBDIR="${COOKBOOK_SYSROOT}/lib/pkgconfig"
        export PKG_CONFIG_SYSROOT_DIR="${COOKBOOK_SYSROOT}"
        cd "${COOKBOOK_RECIPE}"
        if [ -e recipe.sh ]; then
            source recipe.sh
        fi
        for arg in "${@:2}"
        do
Jacob Lorentzon's avatar
Jacob Lorentzon committed
            op "$recipe_name" "$i"
Jeremy Soller's avatar
Jeremy Soller committed
    else
Jacob Lorentzon's avatar
Jacob Lorentzon committed
        echo "cook.sh: recipe '$recipe_name' at not found" >&2
Jeremy Soller's avatar
Jeremy Soller committed
    fi
else
    usage "{package}"
Jeremy Soller's avatar
Jeremy Soller committed
fi